{"openapi":"3.1.0","info":{"title":"Octibiz API","description":"Vollständige REST-API von Octibiz. Jede Operation dieser Spezifikation ist zugleich ein Werkzeug für den KI-Zugang (MCP). Der Umfang ist ungefiltert: Er zeigt alle Operationen, auch die von Modulen, die in einer einzelnen Instanz abgeschaltet sind. Welche davon deine Instanz ausliefert, zeigt sie selbst unter /api/docs.","version":"0.6.22"},"servers":[{"url":"https://{instanz}","description":"Deine Octibiz-Instanz","variables":{"instanz":{"default":"deine-instanz.example","description":"Hostname deiner Instanz, ohne Schema und ohne abschließenden Schrägstrich"}}}],"paths":{"/api/v1/affiliates":{"get":{"operationId":"api_v1affiliates_get_collection","tags":["Affiliate"],"responses":{"200":{"description":"Affiliate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Affiliate-affiliate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Affiliate.jsonld-affiliate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Affiliate.jsonld-affiliate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Affiliate resources.","description":"Retrieves the collection of Affiliate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"partnerType","in":"query","description":"Partner-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1affiliates_post","tags":["Affiliate"],"responses":{"201":{"description":"Affiliate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Affiliate-affiliate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Affiliate.jsonld-affiliate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Affiliate resource.","description":"Creates a Affiliate resource.","parameters":[],"requestBody":{"description":"The new Affiliate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Affiliate-affiliate.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Affiliate-affiliate.write"}}},"required":true}}},"/api/v1/affiliates/{ulid}":{"get":{"operationId":"api_v1affiliates_ulid_get","tags":["Affiliate"],"responses":{"200":{"description":"Affiliate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Affiliate-affiliate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Affiliate.jsonld-affiliate.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Affiliate resource.","description":"Retrieves a Affiliate resource.","parameters":[{"name":"ulid","in":"path","description":"Affiliate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1affiliates_ulid_delete","tags":["Affiliate"],"responses":{"204":{"description":"Affiliate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Affiliate resource.","description":"Removes the Affiliate resource.","parameters":[{"name":"ulid","in":"path","description":"Affiliate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1affiliates_ulid_patch","tags":["Affiliate"],"responses":{"200":{"description":"Affiliate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Affiliate-affiliate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Affiliate.jsonld-affiliate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Affiliate resource.","description":"Updates the Affiliate resource.","parameters":[{"name":"ulid","in":"path","description":"Affiliate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Affiliate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Affiliate-affiliate.write.jsonMergePatch"}}},"required":true}}},"/api/v1/affiliates/{ulid}/accruals":{"get":{"operationId":"api_v1affiliates_ulidaccruals_get_collection","tags":["AffiliateAccrual"],"responses":{"200":{"description":"AffiliateAccrual collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AffiliateAccrual-affiliate_accrual.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AffiliateAccrual.jsonld-affiliate_accrual.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AffiliateAccrual.jsonld-affiliate_accrual.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AffiliateAccrual resources.","description":"Retrieves the collection of AffiliateAccrual resources.","parameters":[{"name":"ulid","in":"path","description":"AffiliateAccrual identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/affiliates/attributions":{"post":{"operationId":"affiliate_attribution_create","tags":["AffiliateAttribution"],"responses":{"201":{"description":"AffiliateAttribution resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateAttribution-affiliate_attribution.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateAttribution.jsonld-affiliate_attribution.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AffiliateAttribution resource.","description":"Creates a AffiliateAttribution resource.","parameters":[],"requestBody":{"description":"The new AffiliateAttribution resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateAttribution-affiliate_attribution.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateAttribution-affiliate_attribution.write"}}},"required":true}}},"/api/v1/affiliates/{ulid}/rules":{"get":{"operationId":"api_v1affiliates_ulidrules_get_collection","tags":["AffiliateCommissionRule"],"responses":{"200":{"description":"AffiliateCommissionRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AffiliateCommissionRule-affiliate_rule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AffiliateCommissionRule.jsonld-affiliate_rule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AffiliateCommissionRule.jsonld-affiliate_rule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AffiliateCommissionRule resources.","description":"Retrieves the collection of AffiliateCommissionRule resources.","parameters":[{"name":"ulid","in":"path","description":"AffiliateCommissionRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"affiliate_rule_create","tags":["AffiliateCommissionRule"],"responses":{"201":{"description":"AffiliateCommissionRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionRule-affiliate_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionRule.jsonld-affiliate_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Provisionsregel des Partners anlegen","description":"Legt eine Provisionsregel für diesen Partner an (Geltungsbereich `partner`). `percent` ist Prozent mal 100, `fixed` ein Betrag in Cent.","parameters":[{"name":"ulid","in":"path","description":"AffiliateCommissionRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AffiliateCommissionRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionRule-affiliate_rule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionRule-affiliate_rule.write"}}},"required":true}}},"/api/v1/affiliates/{ulid}/rules/{ruleUlid}":{"delete":{"operationId":"api_v1affiliates_ulidrules_ruleUlid_delete","tags":["AffiliateCommissionRule"],"responses":{"204":{"description":"AffiliateCommissionRule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AffiliateCommissionRule resource.","description":"Removes the AffiliateCommissionRule resource.","parameters":[{"name":"ulid","in":"path","description":"AffiliateCommissionRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ruleUlid","in":"path","description":"AffiliateCommissionRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1affiliates_ulidrules_ruleUlid_patch","tags":["AffiliateCommissionRule"],"responses":{"200":{"description":"AffiliateCommissionRule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionRule-affiliate_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionRule.jsonld-affiliate_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AffiliateCommissionRule resource.","description":"Updates the AffiliateCommissionRule resource.","parameters":[{"name":"ulid","in":"path","description":"AffiliateCommissionRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ruleUlid","in":"path","description":"AffiliateCommissionRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AffiliateCommissionRule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionRule-affiliate_rule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/affiliates/{ulid}/commission-summary":{"get":{"operationId":"api_v1affiliates_ulidcommission-summary_get","tags":["AffiliateCommissionSummary"],"responses":{"200":{"description":"AffiliateCommissionSummary resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionSummary-affiliate_summary.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateCommissionSummary.jsonld-affiliate_summary.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AffiliateCommissionSummary resource.","description":"Retrieves a AffiliateCommissionSummary resource.","parameters":[{"name":"ulid","in":"path","description":"AffiliateCommissionSummary identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/affiliates/assignments":{"get":{"operationId":"api_v1affiliatesassignments_get_collection","tags":["AffiliatePartnerAssignment"],"responses":{"200":{"description":"AffiliatePartnerAssignment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AffiliatePartnerAssignment-affiliate_assignment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AffiliatePartnerAssignment.jsonld-affiliate_assignment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AffiliatePartnerAssignment.jsonld-affiliate_assignment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AffiliatePartnerAssignment resources.","description":"Retrieves the collection of AffiliatePartnerAssignment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"partnerId","in":"query","description":"Partner-ID (Affiliate-Rolle, aff_role.id)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Zuordnungen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"affiliate_assignment_create","tags":["AffiliatePartnerAssignment"],"responses":{"201":{"description":"AffiliatePartnerAssignment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliatePartnerAssignment-affiliate_assignment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliatePartnerAssignment.jsonld-affiliate_assignment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AffiliatePartnerAssignment resource.","description":"Creates a AffiliatePartnerAssignment resource.","parameters":[],"requestBody":{"description":"The new AffiliatePartnerAssignment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliatePartnerAssignment-affiliate_assignment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliatePartnerAssignment-affiliate_assignment.write"}}},"required":true}}},"/api/v1/affiliates/assignments/{ulid}":{"delete":{"operationId":"api_v1affiliatesassignments_ulid_delete","tags":["AffiliatePartnerAssignment"],"responses":{"204":{"description":"AffiliatePartnerAssignment resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AffiliatePartnerAssignment resource.","description":"Removes the AffiliatePartnerAssignment resource.","parameters":[{"name":"ulid","in":"path","description":"AffiliatePartnerAssignment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1affiliatesassignments_ulid_patch","tags":["AffiliatePartnerAssignment"],"responses":{"200":{"description":"AffiliatePartnerAssignment resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliatePartnerAssignment-affiliate_assignment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliatePartnerAssignment.jsonld-affiliate_assignment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AffiliatePartnerAssignment resource.","description":"Updates the AffiliatePartnerAssignment resource.","parameters":[{"name":"ulid","in":"path","description":"AffiliatePartnerAssignment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AffiliatePartnerAssignment resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AffiliatePartnerAssignment-affiliate_assignment.write.jsonMergePatch"}}},"required":true}}},"/api/v1/affiliates/{ulid}/referrals":{"get":{"operationId":"api_v1affiliates_ulidreferrals_get_collection","tags":["AffiliateReferral"],"responses":{"200":{"description":"AffiliateReferral collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AffiliateReferral-affiliate_referral.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AffiliateReferral.jsonld-affiliate_referral.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AffiliateReferral.jsonld-affiliate_referral.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AffiliateReferral resources.","description":"Retrieves the collection of AffiliateReferral resources.","parameters":[{"name":"ulid","in":"path","description":"AffiliateReferral identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"affiliate_referral_create","tags":["AffiliateReferral"],"responses":{"201":{"description":"AffiliateReferral resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateReferral-affiliate_referral.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateReferral.jsonld-affiliate_referral.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Referral-Code des Partners anlegen","description":"Legt einen Referral-Code bzw. -Link des Partners an. Der Code ist systemweit eindeutig (Doppelvergabe: 409); `expiresAt` begrenzt das Attributionsfenster.","parameters":[{"name":"ulid","in":"path","description":"AffiliateReferral identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AffiliateReferral resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateReferral-affiliate_referral.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateReferral-affiliate_referral.write"}}},"required":true}}},"/api/v1/affiliate-settlements":{"get":{"operationId":"api_v1affiliate-settlements_get_collection","tags":["AffiliateSettlementRun"],"responses":{"200":{"description":"AffiliateSettlementRun collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AffiliateSettlementRun.jsonld-affiliate_settlement.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AffiliateSettlementRun.jsonld-affiliate_settlement.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AffiliateSettlementRun resources.","description":"Retrieves the collection of AffiliateSettlementRun resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über die Partner-Namen der Auszahlungspositionen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1affiliate-settlements_post","tags":["AffiliateSettlementRun"],"responses":{"201":{"description":"AffiliateSettlementRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun.jsonld-affiliate_settlement.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AffiliateSettlementRun resource.","description":"Creates a AffiliateSettlementRun resource.","parameters":[],"requestBody":{"description":"The new AffiliateSettlementRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.write"}}},"required":true}}},"/api/v1/affiliate-settlements/{ulid}":{"get":{"operationId":"api_v1affiliate-settlements_ulid_get","tags":["AffiliateSettlementRun"],"responses":{"200":{"description":"AffiliateSettlementRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun.jsonld-affiliate_settlement.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AffiliateSettlementRun resource.","description":"Retrieves a AffiliateSettlementRun resource.","parameters":[{"name":"ulid","in":"path","description":"AffiliateSettlementRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/affiliate-settlements/{ulid}/approve":{"post":{"operationId":"affiliate_settlement_approve","tags":["AffiliateSettlementRun"],"responses":{"201":{"description":"AffiliateSettlementRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun.jsonld-affiliate_settlement.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Approve affiliate settlement","description":"Approve affiliate settlement. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"AffiliateSettlementRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AffiliateSettlementRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.write"}}},"required":true}}},"/api/v1/affiliate-settlements/{ulid}/mark-paid":{"post":{"operationId":"affiliate_settlement_mark_paid","tags":["AffiliateSettlementRun"],"responses":{"201":{"description":"AffiliateSettlementRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun.jsonld-affiliate_settlement.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Mark affiliate settlement as paid","description":"Mark affiliate settlement as paid. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"AffiliateSettlementRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AffiliateSettlementRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AffiliateSettlementRun-affiliate_settlement.write"}}},"required":true}}},"/api/v1/affiliate-settlements/{ulid}/payout-csv":{"get":{"operationId":"affiliate_settlement_payout_csv","tags":["AffiliateSettlementRun"],"responses":{"204":{"description":"AffiliateSettlementRun resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Auszahlungs-CSV des Abrechnungslaufs (eine Zeile je Partner; nur approved/paid).","description":"Auszahlungs-CSV des Abrechnungslaufs (eine Zeile je Partner; nur approved/paid).","parameters":[{"name":"ulid","in":"path","description":"AffiliateSettlementRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/ai/model-routes":{"get":{"operationId":"api_v1aimodel-routes_get_collection","tags":["AiModelRoute"],"responses":{"200":{"description":"AiModelRoute collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AiModelRoute-ai_route.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AiModelRoute.jsonld-ai_route.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AiModelRoute.jsonld-ai_route.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AiModelRoute resources.","description":"Retrieves the collection of AiModelRoute resources.","parameters":[]},"post":{"operationId":"api_v1aimodel-routes_post","tags":["AiModelRoute"],"responses":{"201":{"description":"AiModelRoute resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiModelRoute-ai_route.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiModelRoute.jsonld-ai_route.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AiModelRoute resource.","description":"Creates a AiModelRoute resource.","parameters":[],"requestBody":{"description":"The new AiModelRoute resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiModelRoute-ai_route.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiModelRoute-ai_route.write"}}},"required":true}}},"/api/v1/ai/model-routes/{useCase}":{"get":{"operationId":"api_v1aimodel-routes_useCase_get","tags":["AiModelRoute"],"responses":{"200":{"description":"AiModelRoute resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiModelRoute-ai_route.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiModelRoute.jsonld-ai_route.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AiModelRoute resource.","description":"Retrieves a AiModelRoute resource.","parameters":[{"name":"useCase","in":"path","description":"AiModelRoute identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1aimodel-routes_useCase_delete","tags":["AiModelRoute"],"responses":{"204":{"description":"AiModelRoute resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AiModelRoute resource.","description":"Removes the AiModelRoute resource.","parameters":[{"name":"useCase","in":"path","description":"AiModelRoute identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1aimodel-routes_useCase_patch","tags":["AiModelRoute"],"responses":{"200":{"description":"AiModelRoute resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiModelRoute-ai_route.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiModelRoute.jsonld-ai_route.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AiModelRoute resource.","description":"Updates the AiModelRoute resource.","parameters":[{"name":"useCase","in":"path","description":"AiModelRoute identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AiModelRoute resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AiModelRoute-ai_route.write.jsonMergePatch"}}},"required":true}}},"/api/v1/ai/model-catalog/refresh":{"post":{"operationId":"ai_model_catalog_refresh_all","tags":["AiProvider"],"responses":{"200":{"description":"AiProvider resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProvider.jsonld-ai_provider.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Modell-Listen aller KI-Anbieter neu abfragen","description":"Frischt die Modell-Listen ALLER Anbieter mit hinterlegtem Zugang auf (derselbe Lauf wie der nächtliche Zeitplan). Antwortet mit allen Anbieter-Datensätzen.","parameters":[],"requestBody":{"description":"The new AiProvider resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.write"}}},"required":true}}},"/api/v1/ai/providers":{"get":{"operationId":"api_v1aiproviders_get_collection","tags":["AiProvider"],"responses":{"200":{"description":"AiProvider collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AiProvider-ai_provider.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AiProvider.jsonld-ai_provider.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AiProvider.jsonld-ai_provider.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"KI-Anbieter samt Zugang, Modellstand und Standard-Markierung","description":"Ohne Marke gilt der Zugang fuer ALLE Marken; ist eine Marke gesetzt, gilt er nur fuer diese. Eine Marke ohne eigenen Zugang erbt den markenlosen (`brandSpecific` sagt, welcher der beiden geantwortet hat).","parameters":[{"name":"brandId","in":"query","description":"Marken-ID: liefert den Zugang, der in dieser Marke gilt (eigener Zugang, sonst der markenlose). Ohne Angabe der markenlose Zugang.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/ai/providers/{provider}":{"get":{"operationId":"api_v1aiproviders_provider_get","tags":["AiProvider"],"responses":{"200":{"description":"AiProvider resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProvider.jsonld-ai_provider.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zugang eines KI-Anbieters","description":"Ohne Marke gilt der Zugang fuer ALLE Marken; ist eine Marke gesetzt, gilt er nur fuer diese. Eine Marke ohne eigenen Zugang erbt den markenlosen (`brandSpecific` sagt, welcher der beiden geantwortet hat).","parameters":[{"name":"provider","in":"path","description":"AiProvider identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false},{"name":"brandId","in":"query","description":"Marken-ID: liefert den Zugang, der in dieser Marke gilt (eigener Zugang, sonst der markenlose). Ohne Angabe der markenlose Zugang.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"patch":{"operationId":"api_v1aiproviders_provider_patch","tags":["AiProvider"],"responses":{"200":{"description":"AiProvider resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProvider.jsonld-ai_provider.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zugang eines KI-Anbieters pflegen","description":"Ohne Marke gilt der Zugang fuer ALLE Marken; ist eine Marke gesetzt, gilt er nur fuer diese. Eine Marke ohne eigenen Zugang erbt den markenlosen (`brandSpecific` sagt, welcher der beiden geantwortet hat).\n\nDie Ziel-Marke steht im Feld `brandId` (ersatzweise im Abfrage-Parameter `brandId`). Gepflegt wird sie mit dem Recht `platform.ai.manage` IN DIESER MARKE; der markenlose Zugang gilt fuer alle Marken und verlangt deshalb markenuebergreifendes Recht.\n\nEin markenbezogener Zugang ERSETZT den markenlosen vollstaendig — Adresse, Modell und Zugangsschluessel kommen dann ausschliesslich aus seiner Zeile. Der Standard-Anbieter (`isDefault`) bleibt eine systemweite Aussage und laesst sich nur ohne Marke setzen.","parameters":[{"name":"provider","in":"path","description":"AiProvider identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AiProvider resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.write.jsonMergePatch"}}},"required":true}}},"/api/v1/ai/providers/{provider}/refresh-models":{"post":{"operationId":"ai_provider_refresh_models","tags":["AiProvider"],"responses":{"200":{"description":"AiProvider resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProvider.jsonld-ai_provider.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Modell-Liste eines KI-Anbieters neu abfragen","description":"Fragt die Modell-Liste dieses Anbieters bei dessen API ab und schreibt sie in den Katalog. Antwortet mit dem aufgefrischten Anbieter-Datensatz.","parameters":[{"name":"provider","in":"path","description":"AiProvider identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new AiProvider resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProvider-ai_provider.write"}}},"required":true}}},"/api/v1/assistant/provider-endpoints":{"get":{"operationId":"api_v1assistantprovider-endpoints_get_collection","tags":["AiProviderEndpoint"],"responses":{"200":{"description":"AiProviderEndpoint collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AiProviderEndpoint.jsonld-ai_endpoint.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AiProviderEndpoint.jsonld-ai_endpoint.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AiProviderEndpoint resources.","description":"Retrieves the collection of AiProviderEndpoint resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assistantprovider-endpoints_post","tags":["AiProviderEndpoint"],"responses":{"201":{"description":"AiProviderEndpoint resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint.jsonld-ai_endpoint.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AiProviderEndpoint resource.","description":"Creates a AiProviderEndpoint resource.","parameters":[],"requestBody":{"description":"The new AiProviderEndpoint resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.write"}}},"required":true}}},"/api/v1/assistant/provider-endpoints/{ulid}":{"get":{"operationId":"api_v1assistantprovider-endpoints_ulid_get","tags":["AiProviderEndpoint"],"responses":{"200":{"description":"AiProviderEndpoint resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint.jsonld-ai_endpoint.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AiProviderEndpoint resource.","description":"Retrieves a AiProviderEndpoint resource.","parameters":[{"name":"ulid","in":"path","description":"AiProviderEndpoint identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assistantprovider-endpoints_ulid_delete","tags":["AiProviderEndpoint"],"responses":{"204":{"description":"AiProviderEndpoint resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AiProviderEndpoint resource.","description":"Removes the AiProviderEndpoint resource.","parameters":[{"name":"ulid","in":"path","description":"AiProviderEndpoint identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assistantprovider-endpoints_ulid_patch","tags":["AiProviderEndpoint"],"responses":{"200":{"description":"AiProviderEndpoint resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint.jsonld-ai_endpoint.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AiProviderEndpoint resource.","description":"Updates the AiProviderEndpoint resource.","parameters":[{"name":"ulid","in":"path","description":"AiProviderEndpoint identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AiProviderEndpoint resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assistant/provider-endpoints/{ulid}/refresh-models":{"post":{"operationId":"ai_endpoint_refresh_models","tags":["AiProviderEndpoint"],"responses":{"200":{"description":"AiProviderEndpoint resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint.jsonld-ai_endpoint.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Modelle eines eigenen/lokalen KI-Endpunkts abfragen","description":"Fragt die verfügbaren Modelle bei diesem Endpoint ab (Ollama: /api/tags, sonst /models) und schreibt sie in dessen Modell-Liste.","parameters":[{"name":"ulid","in":"path","description":"AiProviderEndpoint identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AiProviderEndpoint resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AiProviderEndpoint-ai_endpoint.write"}}},"required":true}}},"/api/v1/allocations":{"get":{"operationId":"api_v1allocations_get_collection","tags":["Allocation"],"responses":{"200":{"description":"Allocation collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Allocation-allocation.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Allocation.jsonld-allocation.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Allocation.jsonld-allocation.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Allocation resources.","description":"Retrieves the collection of Allocation resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID — nur mit resources.allocation.view_team wirksam, sonst gilt der eigene Scope","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"confidence","in":"query","description":"Confidence (exakter Match: planned|committed|tentative)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Zeitraum-Beginn — nur Allocations, die bis mindestens zu diesem Datum reichen","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende — nur Allocations, die spätestens an diesem Datum beginnen","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]},"post":{"operationId":"api_v1allocations_post","tags":["Allocation"],"responses":{"201":{"description":"Allocation resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Allocation.jsonld-allocation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Allocation resource.","description":"Creates a Allocation resource.","parameters":[],"requestBody":{"description":"The new Allocation resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.write"}}},"required":true}}},"/api/v1/allocations/suggest-from-project":{"post":{"operationId":"allocation_suggest","tags":["Allocation"],"responses":{"201":{"description":"Allocation resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Allocation.jsonld-allocation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Allocation resource.","description":"Creates a Allocation resource.","parameters":[],"requestBody":{"description":"The new Allocation resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.write"}}},"required":true}}},"/api/v1/allocations/{ulid}":{"get":{"operationId":"api_v1allocations_ulid_get","tags":["Allocation"],"responses":{"200":{"description":"Allocation resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Allocation.jsonld-allocation.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Allocation resource.","description":"Retrieves a Allocation resource.","parameters":[{"name":"ulid","in":"path","description":"Allocation identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1allocations_ulid_delete","tags":["Allocation"],"responses":{"204":{"description":"Allocation resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Allocation resource.","description":"Removes the Allocation resource.","parameters":[{"name":"ulid","in":"path","description":"Allocation identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1allocations_ulid_patch","tags":["Allocation"],"responses":{"200":{"description":"Allocation resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Allocation.jsonld-allocation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Allocation resource.","description":"Updates the Allocation resource.","parameters":[{"name":"ulid","in":"path","description":"Allocation identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Allocation resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.update.jsonMergePatch"}}},"required":true}}},"/api/v1/allocations/{ulid}/convert-to-task":{"post":{"operationId":"allocation_convert_to_task","tags":["Allocation"],"responses":{"201":{"description":"Allocation resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Allocation.jsonld-allocation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Planzeile in eine Aufgabe überführen","description":"Macht die Planung verbindlich und legt aus der Allocation eine Aufgabe an. Idempotent — eine bereits überführte Zeile liefert dieselbe Aufgabe zurück.","parameters":[{"name":"ulid","in":"path","description":"Allocation identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Allocation resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Allocation-allocation.write"}}},"required":true}}},"/api/v1/api-tokens":{"get":{"operationId":"api_v1api-tokens_get_collection","tags":["ApiToken"],"responses":{"200":{"description":"ApiToken collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiToken-api_token.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ApiToken.jsonld-api_token.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ApiToken.jsonld-api_token.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ApiToken resources.","description":"Retrieves the collection of ApiToken resources.","parameters":[{"name":"search","in":"query","description":"Suche über Token-Name, Benutzername und E-Mail (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1api-tokens_post","tags":["ApiToken"],"responses":{"201":{"description":"ApiToken resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.read_api_token.secret"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ApiToken.jsonld-api_token.read_api_token.secret"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ApiToken resource.","description":"Creates a ApiToken resource.","parameters":[],"requestBody":{"description":"The new ApiToken resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.write"}}},"required":true}}},"/api/v1/api-tokens/{ulid}":{"get":{"operationId":"api_v1api-tokens_ulid_get","tags":["ApiToken"],"responses":{"200":{"description":"ApiToken resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ApiToken.jsonld-api_token.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ApiToken resource.","description":"Retrieves a ApiToken resource.","parameters":[{"name":"ulid","in":"path","description":"ApiToken identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1api-tokens_ulid_delete","tags":["ApiToken"],"responses":{"204":{"description":"ApiToken resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ApiToken resource.","description":"Removes the ApiToken resource.","parameters":[{"name":"ulid","in":"path","description":"ApiToken identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1api-tokens_ulid_patch","tags":["ApiToken"],"responses":{"200":{"description":"ApiToken resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ApiToken.jsonld-api_token.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ApiToken resource.","description":"Updates the ApiToken resource.","parameters":[{"name":"ulid","in":"path","description":"ApiToken identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ApiToken resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.write.jsonMergePatch"}}},"required":true}}},"/api/v1/api-tokens/{ulid}/revoke":{"post":{"operationId":"api_token_revoke","tags":["ApiToken"],"responses":{"201":{"description":"ApiToken resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ApiToken.jsonld-api_token.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zugriffstoken sofort entwerten","description":"Setzt das Token unwiderruflich auf „widerrufen\" — jeder API-/MCP-Aufruf damit scheitert ab sofort. Der Datensatz bleibt zur Nachvollziehbarkeit stehen; endgültiges Entfernen ist DELETE auf denselben Pfad. Idempotent.","parameters":[{"name":"ulid","in":"path","description":"ApiToken identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ApiToken resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ApiToken-api_token.write"}}},"required":true}}},"/api/v1/assets/ai/optimization":{"get":{"operationId":"api_v1assetsaioptimization_get_collection","tags":["AssetAi"],"responses":{"200":{"description":"AssetAi collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetAi-asset_ai.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetAi.jsonld-asset_ai.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetAi.jsonld-asset_ai.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetAi resources.","description":"Retrieves the collection of AssetAi resources.","parameters":[]}},"/api/v1/assets/assignments":{"get":{"operationId":"api_v1assetsassignments_get_collection","tags":["AssetAssignment"],"responses":{"200":{"description":"AssetAssignment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetAssignment-asset_assignment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetAssignment.jsonld-asset_assignment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetAssignment.jsonld-asset_assignment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetAssignment resources.","description":"Retrieves the collection of AssetAssignment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"targetType","in":"query","description":"Ziel-Typ (exakter Match, z.B. asset|license)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"targetId","in":"query","description":"Ziel-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"open","in":"query","description":"true = nur offene Zuweisungen ohne Rückgabe","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]}},"/api/v1/assets/assignments/{ulid}":{"get":{"operationId":"api_v1assetsassignments_ulid_get","tags":["AssetAssignment"],"responses":{"200":{"description":"AssetAssignment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAssignment-asset_assignment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetAssignment.jsonld-asset_assignment.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssetAssignment resource.","description":"Retrieves a AssetAssignment resource.","parameters":[{"name":"ulid","in":"path","description":"AssetAssignment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/assets/assignments/{ulid}/acknowledge":{"post":{"operationId":"api_v1assetsassignments_ulidacknowledge_post","tags":["AssetAssignment"],"responses":{"201":{"description":"AssetAssignment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAssignment-asset_assignment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetAssignment.jsonld-asset_assignment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Übernahme einer Zuweisung quittieren","description":"Quittiert die Übernahme einer Betriebsmittel- oder Lizenzplatz-Zuweisung. Nur an einer Zuweisung, die der Aufrufer sehen darf — ein Mitarbeiter also nur an seiner eigenen.","parameters":[{"name":"ulid","in":"path","description":"AssetAssignment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetAssignment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAssignment-asset_assignment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetAssignment-asset_assignment.write"}}},"required":true}}},"/api/v1/assets/cost-centers":{"get":{"operationId":"api_v1assetscost-centers_get_collection","tags":["AssetCostCenter"],"responses":{"200":{"description":"AssetCostCenter collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetCostCenter-asset_cc.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetCostCenter.jsonld-asset_cc.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetCostCenter.jsonld-asset_cc.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetCostCenter resources.","description":"Retrieves the collection of AssetCostCenter resources.","parameters":[]},"post":{"operationId":"api_v1assetscost-centers_post","tags":["AssetCostCenter"],"responses":{"201":{"description":"AssetCostCenter resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter-asset_cc.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter.jsonld-asset_cc.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssetCostCenter resource.","description":"Creates a AssetCostCenter resource.","parameters":[],"requestBody":{"description":"The new AssetCostCenter resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter-asset_cc.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter-asset_cc.write"}}},"required":true}}},"/api/v1/assets/cost-centers/{code}":{"get":{"operationId":"api_v1assetscost-centers_code_get","tags":["AssetCostCenter"],"responses":{"200":{"description":"AssetCostCenter resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter-asset_cc.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter.jsonld-asset_cc.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssetCostCenter resource.","description":"Retrieves a AssetCostCenter resource.","parameters":[{"name":"code","in":"path","description":"AssetCostCenter identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assetscost-centers_code_delete","tags":["AssetCostCenter"],"responses":{"204":{"description":"AssetCostCenter resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssetCostCenter resource.","description":"Removes the AssetCostCenter resource.","parameters":[{"name":"code","in":"path","description":"AssetCostCenter identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assetscost-centers_code_patch","tags":["AssetCostCenter"],"responses":{"200":{"description":"AssetCostCenter resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter-asset_cc.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter.jsonld-asset_cc.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssetCostCenter resource.","description":"Updates the AssetCostCenter resource.","parameters":[{"name":"code","in":"path","description":"AssetCostCenter identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssetCostCenter resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssetCostCenter-asset_cc.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assets/cost-records":{"get":{"operationId":"api_v1assetscost-records_get_collection","tags":["AssetCostRecord"],"responses":{"200":{"description":"AssetCostRecord collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetCostRecord-asset_cost.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetCostRecord.jsonld-asset_cost.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetCostRecord.jsonld-asset_cost.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetCostRecord resources.","description":"Retrieves the collection of AssetCostRecord resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"targetType","in":"query","description":"Ziel-Typ (exakter Match, z.B. asset|license)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"targetId","in":"query","description":"Ziel-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"interval","in":"query","description":"Intervall (exakter Match, z.B. monthly|quarterly|yearly|one_off)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Bezeichnung, Notiz und Lieferanten-Referenz","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[label]","in":"query","description":"Sortierung nach Bezeichnung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[validFrom]","in":"query","description":"Sortierung nach Gültig-ab-Datum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[amount]","in":"query","description":"Sortierung nach Betrag (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assetscost-records_post","tags":["AssetCostRecord"],"responses":{"201":{"description":"AssetCostRecord resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord-asset_cost.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord.jsonld-asset_cost.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssetCostRecord resource.","description":"Creates a AssetCostRecord resource.","parameters":[],"requestBody":{"description":"The new AssetCostRecord resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord-asset_cost.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord-asset_cost.write"}}},"required":true}}},"/api/v1/assets/cost-records/{ulid}":{"get":{"operationId":"api_v1assetscost-records_ulid_get","tags":["AssetCostRecord"],"responses":{"200":{"description":"AssetCostRecord resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord-asset_cost.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord.jsonld-asset_cost.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssetCostRecord resource.","description":"Retrieves a AssetCostRecord resource.","parameters":[{"name":"ulid","in":"path","description":"AssetCostRecord identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assetscost-records_ulid_delete","tags":["AssetCostRecord"],"responses":{"204":{"description":"AssetCostRecord resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssetCostRecord resource.","description":"Removes the AssetCostRecord resource.","parameters":[{"name":"ulid","in":"path","description":"AssetCostRecord identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assetscost-records_ulid_patch","tags":["AssetCostRecord"],"responses":{"200":{"description":"AssetCostRecord resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord-asset_cost.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord.jsonld-asset_cost.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssetCostRecord resource.","description":"Updates the AssetCostRecord resource.","parameters":[{"name":"ulid","in":"path","description":"AssetCostRecord identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssetCostRecord resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssetCostRecord-asset_cost.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assets/cost-record-summary":{"get":{"operationId":"api_v1assetscost-record-summary_get_collection","tags":["AssetCostRecordSummary"],"responses":{"200":{"description":"AssetCostRecordSummary collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetCostRecordSummary-asset_cost_summary.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetCostRecordSummary.jsonld-asset_cost_summary.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetCostRecordSummary.jsonld-asset_cost_summary.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetCostRecordSummary resources.","description":"Retrieves the collection of AssetCostRecordSummary resources.","parameters":[{"name":"targetType","in":"query","description":"Ziel-Typ (exakter Match, z.B. asset|license)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/assets/internal-assets":{"get":{"operationId":"api_v1assetsinternal-assets_get_collection","tags":["AssetInternalAsset"],"responses":{"200":{"description":"AssetInternalAsset collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetInternalAsset.jsonld-asset.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetInternalAsset resources.","description":"Retrieves the collection of AssetInternalAsset resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Asset-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"type","in":"query","description":"Asset-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Aktuell zugewiesener Mitarbeiter (aktive, nicht zurückgegebene Zuweisung)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Name, Inventar-Tag, Seriennummer, Hersteller und Modell","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[warrantyUntil]","in":"query","description":"Sortierung nach Garantie-Ende (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assetsinternal-assets_post","tags":["AssetInternalAsset"],"responses":{"201":{"description":"AssetInternalAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssetInternalAsset resource.","description":"Creates a AssetInternalAsset resource.","parameters":[],"requestBody":{"description":"The new AssetInternalAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}}},"required":true}}},"/api/v1/assets/internal-assets/{ulid}":{"get":{"operationId":"api_v1assetsinternal-assets_ulid_get","tags":["AssetInternalAsset"],"responses":{"200":{"description":"AssetInternalAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssetInternalAsset resource.","description":"Retrieves a AssetInternalAsset resource.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assetsinternal-assets_ulid_delete","tags":["AssetInternalAsset"],"responses":{"204":{"description":"AssetInternalAsset resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssetInternalAsset resource.","description":"Removes the AssetInternalAsset resource.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assetsinternal-assets_ulid_patch","tags":["AssetInternalAsset"],"responses":{"200":{"description":"AssetInternalAsset resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssetInternalAsset resource.","description":"Updates the AssetInternalAsset resource.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssetInternalAsset resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assets/internal-assets/{ulid}/assign":{"post":{"operationId":"api_v1assetsinternal-assets_ulidassign_post","tags":["AssetInternalAsset"],"responses":{"201":{"description":"AssetInternalAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Betriebsmittel einem Mitarbeiter zuweisen","description":"Weist das Betriebsmittel einem Mitarbeiter zu und legt die Zuweisungszeile an. `employeeId` ist Pflicht (sonst 400).","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}}},"required":true}}},"/api/v1/assets/internal-assets/{ulid}/receive":{"post":{"operationId":"api_v1assetsinternal-assets_ulidreceive_post","tags":["AssetInternalAsset"],"responses":{"201":{"description":"AssetInternalAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Receive internal asset","description":"Receive internal asset. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}}},"required":true}}},"/api/v1/assets/internal-assets/{ulid}/repair":{"post":{"operationId":"api_v1assetsinternal-assets_ulidrepair_post","tags":["AssetInternalAsset"],"responses":{"201":{"description":"AssetInternalAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Betriebsmittel in Reparatur geben","description":"Setzt das Betriebsmittel in den Zustand Reparatur und nimmt es damit aus dem verfügbaren Bestand.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}}},"required":true}}},"/api/v1/assets/internal-assets/{ulid}/retire":{"post":{"operationId":"api_v1assetsinternal-assets_ulidretire_post","tags":["AssetInternalAsset"],"responses":{"201":{"description":"AssetInternalAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Betriebsmittel ausmustern","description":"Setzt das Inventarobjekt endgültig auf `retired` — es steht danach für keine Zuweisung mehr zur Verfügung und verschwindet aus der Bestandsliste. Ein noch zugewiesenes Objekt muss vorher zurückgenommen werden (409), bereits ausgemustert: ebenfalls 409.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}}},"required":true}}},"/api/v1/assets/internal-assets/{ulid}/return":{"post":{"operationId":"api_v1assetsinternal-assets_ulidreturn_post","tags":["AssetInternalAsset"],"responses":{"201":{"description":"AssetInternalAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Betriebsmittel zurücknehmen","description":"Nimmt das Betriebsmittel zurück und schließt die offene Zuweisung.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}}},"required":true}}},"/api/v1/assets/internal-assets/{ulid}/to-stock":{"post":{"operationId":"api_v1assetsinternal-assets_ulidto-stock_post","tags":["AssetInternalAsset"],"responses":{"201":{"description":"AssetInternalAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset.jsonld-asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Betriebsmittel aus der Reparatur zurücknehmen","description":"Nimmt das Betriebsmittel aus der Reparatur zurück in den Bestand. Vorbedingung: es ist in Reparatur.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalAsset-asset.write"}}},"required":true}}},"/api/v1/assets/internal-licenses":{"get":{"operationId":"api_v1assetsinternal-licenses_get_collection","tags":["AssetInternalLicense"],"responses":{"200":{"description":"AssetInternalLicense collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetInternalLicense.jsonld-asset_license.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetInternalLicense resources.","description":"Retrieves the collection of AssetInternalLicense resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Lizenz-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"vendor","in":"query","description":"Anbieter (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"type","in":"query","description":"Lizenz-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Name, Anbieter und Plan","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc); Default asc","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[vendor]","in":"query","description":"Sortierung nach Anbieter (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[renewsAt]","in":"query","description":"Sortierung nach Verlängerungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[cancelBy]","in":"query","description":"Sortierung nach Kündigungsfrist (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assetsinternal-licenses_post","tags":["AssetInternalLicense"],"responses":{"201":{"description":"AssetInternalLicense resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssetInternalLicense resource.","description":"Creates a AssetInternalLicense resource.","parameters":[],"requestBody":{"description":"The new AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}}},"required":true}}},"/api/v1/assets/internal-licenses/{ulid}":{"get":{"operationId":"api_v1assetsinternal-licenses_ulid_get","tags":["AssetInternalLicense"],"responses":{"200":{"description":"AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssetInternalLicense resource.","description":"Retrieves a AssetInternalLicense resource.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assetsinternal-licenses_ulid_delete","tags":["AssetInternalLicense"],"responses":{"204":{"description":"AssetInternalLicense resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssetInternalLicense resource.","description":"Removes the AssetInternalLicense resource.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assetsinternal-licenses_ulid_patch","tags":["AssetInternalLicense"],"responses":{"200":{"description":"AssetInternalLicense resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssetInternalLicense resource.","description":"Updates the AssetInternalLicense resource.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssetInternalLicense resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assets/internal-licenses/{ulid}/assign-seat":{"post":{"operationId":"api_v1assetsinternal-licenses_ulidassign-seat_post","tags":["AssetInternalLicense"],"responses":{"201":{"description":"AssetInternalLicense resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lizenzplatz zuteilen","description":"Teilt einem Mitarbeiter einen Lizenzplatz des Software-Abos zu (`employeeId` Pflicht). Nicht auf einer abgelaufenen Lizenz und nicht zweimal für denselben Mitarbeiter (je 409).","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}}},"required":true}}},"/api/v1/assets/internal-licenses/{ulid}/cancel":{"post":{"operationId":"api_v1assetsinternal-licenses_ulidcancel_post","tags":["AssetInternalLicense"],"responses":{"201":{"description":"AssetInternalLicense resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel internal license","description":"Cancel internal license. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}}},"required":true}}},"/api/v1/assets/internal-licenses/{ulid}/expire":{"post":{"operationId":"api_v1assetsinternal-licenses_ulidexpire_post","tags":["AssetInternalLicense"],"responses":{"201":{"description":"AssetInternalLicense resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Software-Abo als abgelaufen abschließen","description":"Setzt die Lizenz auf `expired` — Endzustand: sie taucht in keiner Verlängerungs-/Fristen-Übersicht mehr auf und wird nicht mehr überwacht. Reaktivieren geht danach nur über `/reactivate`. Idempotent.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}}},"required":true}}},"/api/v1/assets/internal-licenses/{ulid}/pause":{"post":{"operationId":"api_v1assetsinternal-licenses_ulidpause_post","tags":["AssetInternalLicense"],"responses":{"201":{"description":"AssetInternalLicense resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Pause internal license","description":"Pause internal license. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}}},"required":true}}},"/api/v1/assets/internal-licenses/{ulid}/reactivate":{"post":{"operationId":"api_v1assetsinternal-licenses_ulidreactivate_post","tags":["AssetInternalLicense"],"responses":{"201":{"description":"AssetInternalLicense resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Reactivate internal license","description":"Reactivate internal license. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}}},"required":true}}},"/api/v1/assets/internal-licenses/{ulid}/remove-seat":{"post":{"operationId":"api_v1assetsinternal-licenses_ulidremove-seat_post","tags":["AssetInternalLicense"],"responses":{"201":{"description":"AssetInternalLicense resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lizenzplatz einem Mitarbeiter entziehen","description":"Pflichtfeld `employeeId`. Schließt die offene Platz-Zuweisung ab — der Mitarbeiter verliert den Zugang zu diesem Werkzeug, `seatsUsed` sinkt und der Platz ist wieder frei. Ohne aktive Zuweisung: 409.","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}}},"required":true}}},"/api/v1/assets/internal-licenses/{ulid}/renew":{"post":{"operationId":"api_v1assetsinternal-licenses_ulidrenew_post","tags":["AssetInternalLicense"],"responses":{"201":{"description":"AssetInternalLicense resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense.jsonld-asset_license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Software-Abo um eine Periode verlängern","description":"Schreibt `renewsAt` um eine volle Laufzeit-Periode fort (monatlich/jährlich), zieht ein gesetztes `endsAt` um dieselbe Spanne mit und leitet `cancelBy` sowie die Frist-Erinnerungen neu ab. Liegt das Verlängerungsdatum bereits in der Vergangenheit, wird so lange eine volle Periode addiert, bis es in der Zukunft liegt. Nur aus `active` (409), nicht bei Laufzeit `perpetual` (409) und nicht ohne `renewsAt` (409).","parameters":[{"name":"ulid","in":"path","description":"AssetInternalLicense identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetInternalLicense resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetInternalLicense-asset_license.write"}}},"required":true}}},"/api/v1/assets/license-statuses":{"get":{"operationId":"api_v1assetslicense-statuses_get_collection","tags":["AssetLicenseStatus"],"responses":{"200":{"description":"AssetLicenseStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetLicenseStatus-asset_license_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetLicenseStatus.jsonld-asset_license_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetLicenseStatus.jsonld-asset_license_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetLicenseStatus resources.","description":"Retrieves the collection of AssetLicenseStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1assetslicense-statuses_post","tags":["AssetLicenseStatus"],"responses":{"201":{"description":"AssetLicenseStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus-asset_license_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus.jsonld-asset_license_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssetLicenseStatus resource.","description":"Creates a AssetLicenseStatus resource.","parameters":[],"requestBody":{"description":"The new AssetLicenseStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus-asset_license_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus-asset_license_status.write"}}},"required":true}}},"/api/v1/assets/license-statuses/{key}":{"get":{"operationId":"api_v1assetslicense-statuses_key_get","tags":["AssetLicenseStatus"],"responses":{"200":{"description":"AssetLicenseStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus-asset_license_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus.jsonld-asset_license_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssetLicenseStatus resource.","description":"Retrieves a AssetLicenseStatus resource.","parameters":[{"name":"key","in":"path","description":"AssetLicenseStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assetslicense-statuses_key_delete","tags":["AssetLicenseStatus"],"responses":{"204":{"description":"AssetLicenseStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssetLicenseStatus resource.","description":"Removes the AssetLicenseStatus resource.","parameters":[{"name":"key","in":"path","description":"AssetLicenseStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assetslicense-statuses_key_patch","tags":["AssetLicenseStatus"],"responses":{"200":{"description":"AssetLicenseStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus-asset_license_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus.jsonld-asset_license_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssetLicenseStatus resource.","description":"Updates the AssetLicenseStatus resource.","parameters":[{"name":"key","in":"path","description":"AssetLicenseStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssetLicenseStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssetLicenseStatus-asset_license_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/assets/renewal-reminders":{"get":{"operationId":"api_v1assetsrenewal-reminders_get_collection","tags":["AssetRenewalReminder"],"responses":{"200":{"description":"AssetRenewalReminder collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetRenewalReminder-asset_reminder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetRenewalReminder.jsonld-asset_reminder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetRenewalReminder.jsonld-asset_reminder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetRenewalReminder resources.","description":"Retrieves the collection of AssetRenewalReminder resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Reminder-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"kind","in":"query","description":"Fristart (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"targetType","in":"query","description":"Ziel-Typ (exakter Match, z.B. asset|license)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"targetId","in":"query","description":"Ziel-ID (exakter Match) — Fristen eines einzelnen Assets/einer einzelnen Lizenz","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"onlyDue","in":"query","description":"Nur fällige Reminder (Vorlauf-Stichtag erreicht: dueDate − leadDays <= heute)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"excludeDone","in":"query","description":"Erledigte Reminder (Status done) ausschließen — Basis der Zähl-KPIs","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"overdue","in":"query","description":"Nur überfällige Reminder (dueDate strikt vor heute)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"dueWithinDays","in":"query","description":"Nur Reminder mit Fälligkeit innerhalb der nächsten N Tage (heute eingeschlossen)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über den Namen des Zielobjekts (Asset/Lizenz)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[dueDate]","in":"query","description":"Sortierung nach Fälligkeit (asc|desc); Default asc","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[kind]","in":"query","description":"Sortierung nach Fristart (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/assets/renewal-reminders/{ulid}":{"get":{"operationId":"api_v1assetsrenewal-reminders_ulid_get","tags":["AssetRenewalReminder"],"responses":{"200":{"description":"AssetRenewalReminder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder-asset_reminder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder.jsonld-asset_reminder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssetRenewalReminder resource.","description":"Retrieves a AssetRenewalReminder resource.","parameters":[{"name":"ulid","in":"path","description":"AssetRenewalReminder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/assets/renewal-reminders/{ulid}/acknowledge":{"post":{"operationId":"api_v1assetsrenewal-reminders_ulidacknowledge_post","tags":["AssetRenewalReminder"],"responses":{"201":{"description":"AssetRenewalReminder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder-asset_reminder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder.jsonld-asset_reminder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Fristen-Erinnerung als gesehen markieren","description":"Markiert die Fristen-Erinnerung als gesehen, ohne sie zu erledigen.","parameters":[{"name":"ulid","in":"path","description":"AssetRenewalReminder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetRenewalReminder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder-asset_reminder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder-asset_reminder.write"}}},"required":true}}},"/api/v1/assets/renewal-reminders/{ulid}/done":{"post":{"operationId":"api_v1assetsrenewal-reminders_uliddone_post","tags":["AssetRenewalReminder"],"responses":{"201":{"description":"AssetRenewalReminder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder-asset_reminder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder.jsonld-asset_reminder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Fristen-Erinnerung erledigen","description":"Markiert die Fristen-Erinnerung als erledigt; sie verschwindet aus dem Fristen-Cockpit.","parameters":[{"name":"ulid","in":"path","description":"AssetRenewalReminder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssetRenewalReminder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder-asset_reminder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetRenewalReminder-asset_reminder.write"}}},"required":true}}},"/api/v1/assets/report":{"get":{"operationId":"api_v1assetsreport_get_collection","tags":["AssetReport"],"responses":{"200":{"description":"AssetReport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetReport-asset_report.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetReport.jsonld-asset_report.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetReport.jsonld-asset_report.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetReport resources.","description":"Retrieves the collection of AssetReport resources.","parameters":[]}},"/api/v1/assets/asset-statuses":{"get":{"operationId":"api_v1assetsasset-statuses_get_collection","tags":["AssetStatus"],"responses":{"200":{"description":"AssetStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetStatus-asset_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssetStatus.jsonld-asset_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssetStatus.jsonld-asset_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssetStatus resources.","description":"Retrieves the collection of AssetStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1assetsasset-statuses_post","tags":["AssetStatus"],"responses":{"201":{"description":"AssetStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetStatus-asset_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetStatus.jsonld-asset_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssetStatus resource.","description":"Creates a AssetStatus resource.","parameters":[],"requestBody":{"description":"The new AssetStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetStatus-asset_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetStatus-asset_status.write"}}},"required":true}}},"/api/v1/assets/asset-statuses/{key}":{"get":{"operationId":"api_v1assetsasset-statuses_key_get","tags":["AssetStatus"],"responses":{"200":{"description":"AssetStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetStatus-asset_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetStatus.jsonld-asset_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssetStatus resource.","description":"Retrieves a AssetStatus resource.","parameters":[{"name":"key","in":"path","description":"AssetStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assetsasset-statuses_key_delete","tags":["AssetStatus"],"responses":{"204":{"description":"AssetStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssetStatus resource.","description":"Removes the AssetStatus resource.","parameters":[{"name":"key","in":"path","description":"AssetStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assetsasset-statuses_key_patch","tags":["AssetStatus"],"responses":{"200":{"description":"AssetStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetStatus-asset_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssetStatus.jsonld-asset_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssetStatus resource.","description":"Updates the AssetStatus resource.","parameters":[{"name":"key","in":"path","description":"AssetStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssetStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssetStatus-asset_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/assistant/agents":{"get":{"operationId":"api_v1assistantagents_get_collection","tags":["AssistantAgent"],"responses":{"200":{"description":"AssistantAgent collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantAgent.jsonld-assistant_agent.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantAgent.jsonld-assistant_agent.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssistantAgent resources.","description":"Retrieves the collection of AssistantAgent resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Agent-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach Änderungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assistantagents_post","tags":["AssistantAgent"],"responses":{"201":{"description":"AssistantAgent resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgent.jsonld-assistant_agent.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssistantAgent resource.","description":"Creates a AssistantAgent resource.","parameters":[],"requestBody":{"description":"The new AssistantAgent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.write"}}},"required":true}}},"/api/v1/assistant/agents/{ulid}":{"get":{"operationId":"api_v1assistantagents_ulid_get","tags":["AssistantAgent"],"responses":{"200":{"description":"AssistantAgent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgent.jsonld-assistant_agent.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssistantAgent resource.","description":"Retrieves a AssistantAgent resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantAgent identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assistantagents_ulid_delete","tags":["AssistantAgent"],"responses":{"204":{"description":"AssistantAgent resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssistantAgent resource.","description":"Removes the AssistantAgent resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantAgent identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assistantagents_ulid_patch","tags":["AssistantAgent"],"responses":{"200":{"description":"AssistantAgent resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgent.jsonld-assistant_agent.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssistantAgent resource.","description":"Updates the AssistantAgent resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantAgent identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssistantAgent resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assistant/agents/{ulid}/reset":{"post":{"operationId":"assistant_agent_reset","tags":["AssistantAgent"],"responses":{"200":{"description":"AssistantAgent resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgent.jsonld-assistant_agent.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ausgelieferten Agenten auf den Auslieferungsstand zurücksetzen","description":"Stellt einen mitgelieferten Agenten (`providerKey` gesetzt) auf die Katalog-Fassung zurück (`customized=false`). Die eigene Fassung geht dabei verloren. Verlangt `platform.assistant.manage` IN DER MARKE des Agenten; sonst 404.","parameters":[{"name":"ulid","in":"path","description":"AssistantAgent identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssistantAgent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgent-assistant_agent.write"}}},"required":true}}},"/api/v1/assistant/agents/run-confirm":{"post":{"operationId":"api_v1assistantagentsrun-confirm_post","tags":["AssistantAgentRun"],"responses":{"201":{"description":"AssistantAgentRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgentRun-assistant_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgentRun.jsonld-assistant_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssistantAgentRun resource.","description":"Creates a AssistantAgentRun resource.","parameters":[],"requestBody":{"description":"The new AssistantAgentRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgentRun-assistant_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgentRun-assistant_run.write"}}},"required":true}}},"/api/v1/assistant/agents/{ulid}/run":{"post":{"operationId":"api_v1assistantagents_ulidrun_post","tags":["AssistantAgentRun"],"responses":{"201":{"description":"AssistantAgentRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgentRun-assistant_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgentRun.jsonld-assistant_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Agenten im Thread laufen lassen","description":"Startet den Agenten im angegebenen Thread. Steht eine schreibende Aktion an, liefert der Lauf statt der Ausführung eine Vorschau mit `needsConfirm=true` und einem signierten Bestätigungs-Token, das erst /run-confirm einlöst.","parameters":[{"name":"ulid","in":"path","description":"AssistantAgentRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssistantAgentRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAgentRun-assistant_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantAgentRun-assistant_run.write"}}},"required":true}}},"/api/v1/assistant/messages":{"get":{"operationId":"api_v1assistantmessages_get_collection","tags":["AssistantMessage"],"responses":{"200":{"description":"AssistantMessage collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantMessage-assistant_message.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantMessage.jsonld-assistant_message.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantMessage.jsonld-assistant_message.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssistantMessage resources.","description":"Retrieves the collection of AssistantMessage resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"threadUlid","in":"query","description":"ULID des besitzenden Threads (Pflicht) — fremde/unbekannte Threads liefern bewusst eine leere Seite (kein Existenz-Orakel)","required":true,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Zeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assistantmessages_post","tags":["AssistantMessage"],"responses":{"201":{"description":"AssistantMessage resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantMessage-assistant_message.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantMessage.jsonld-assistant_message.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssistantMessage resource.","description":"Creates a AssistantMessage resource.","parameters":[],"requestBody":{"description":"The new AssistantMessage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantMessage-assistant_message.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantMessage-assistant_message.write"}}},"required":true}}},"/api/v1/assistant/messages/{ulid}":{"get":{"operationId":"api_v1assistantmessages_ulid_get","tags":["AssistantMessage"],"responses":{"200":{"description":"AssistantMessage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantMessage-assistant_message.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantMessage.jsonld-assistant_message.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssistantMessage resource.","description":"Retrieves a AssistantMessage resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantMessage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/assistant/models":{"get":{"operationId":"api_v1assistantmodels_get_collection","tags":["AssistantModel"],"responses":{"200":{"description":"AssistantModel collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantModel-assistant_model.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantModel.jsonld-assistant_model.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantModel.jsonld-assistant_model.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssistantModel resources.","description":"Retrieves the collection of AssistantModel resources.","parameters":[]}},"/api/v1/assistant/models/{key}":{"get":{"operationId":"api_v1assistantmodels_key_get","tags":["AssistantModel"],"responses":{"200":{"description":"AssistantModel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantModel-assistant_model.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantModel.jsonld-assistant_model.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssistantModel resource.","description":"Retrieves a AssistantModel resource.","parameters":[{"name":"key","in":"path","description":"AssistantModel identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/assistant/runs":{"get":{"operationId":"api_v1assistantruns_get_collection","tags":["AssistantRun"],"responses":{"200":{"description":"AssistantRun collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantRun-assistant_run_view.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantRun.jsonld-assistant_run_view.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantRun.jsonld-assistant_run_view.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Agenten-Läufe des angemeldeten Nutzers","description":"Wurzel-Läufe (ohne Eltern-Lauf) des angemeldeten Nutzers, jüngste zuerst. Die Schritte und die Sub-Läufe liefert der Einzel-Abruf.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"threadUlid","in":"query","description":"Nur Läufe dieses Threads (fremde/unbekannte Threads liefern eine leere Seite)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Nur Läufe mit diesem Status","required":false,"deprecated":false,"schema":{"type":"string","enum":["running","waiting","done","failed","stopped"]},"style":"form","explode":true},{"name":"order[startedAt]","in":"query","description":"Sortierung nach Startzeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/assistant/runs/{ulid}":{"get":{"operationId":"api_v1assistantruns_ulid_get","tags":["AssistantRun"],"responses":{"200":{"description":"AssistantRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantRun-assistant_run_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantRun.jsonld-assistant_run_view.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ein Agenten-Lauf mit Schritten und Sub-Läufen","description":"Liefert den vollständigen Laufbaum: je Schritt Werkzeugname, Argumente, Begründung des Modells, Ergebnis, Modell/Tokens/Kosten — und rekursiv die Sub-Läufe delegierter Unter-Agenten.","parameters":[{"name":"ulid","in":"path","description":"AssistantRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/assistant/skills":{"get":{"operationId":"api_v1assistantskills_get_collection","tags":["AssistantSkill"],"responses":{"200":{"description":"AssistantSkill collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantSkill.jsonld-assistant_skill.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantSkill.jsonld-assistant_skill.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssistantSkill resources.","description":"Retrieves the collection of AssistantSkill resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"type","in":"query","description":"Skill-Typ (prompt|…) — exakter Match","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[type]","in":"query","description":"Sortierung nach Typ (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach Änderungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assistantskills_post","tags":["AssistantSkill"],"responses":{"201":{"description":"AssistantSkill resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSkill.jsonld-assistant_skill.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssistantSkill resource.","description":"Creates a AssistantSkill resource.","parameters":[],"requestBody":{"description":"The new AssistantSkill resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.write"}}},"required":true}}},"/api/v1/assistant/skills/{ulid}":{"get":{"operationId":"api_v1assistantskills_ulid_get","tags":["AssistantSkill"],"responses":{"200":{"description":"AssistantSkill resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSkill.jsonld-assistant_skill.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssistantSkill resource.","description":"Retrieves a AssistantSkill resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantSkill identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assistantskills_ulid_delete","tags":["AssistantSkill"],"responses":{"204":{"description":"AssistantSkill resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssistantSkill resource.","description":"Removes the AssistantSkill resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantSkill identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assistantskills_ulid_patch","tags":["AssistantSkill"],"responses":{"200":{"description":"AssistantSkill resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSkill.jsonld-assistant_skill.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssistantSkill resource.","description":"Updates the AssistantSkill resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantSkill identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssistantSkill resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assistant/skills/{ulid}/reset":{"post":{"operationId":"assistant_skill_reset","tags":["AssistantSkill"],"responses":{"200":{"description":"AssistantSkill resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSkill.jsonld-assistant_skill.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ausgelieferten Baustein auf den Auslieferungsstand zurücksetzen","description":"Stellt einen mitgelieferten Skill/Prompt (`providerKey` gesetzt) auf die Katalog-Fassung zurück (`customized=false`). Die eigene Fassung geht dabei verloren. Verlangt `platform.assistant.manage` IN DER MARKE der Zeile; sonst 404.","parameters":[{"name":"ulid","in":"path","description":"AssistantSkill identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AssistantSkill resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSkill-assistant_skill.write"}}},"required":true}}},"/api/v1/assistant/spaces":{"get":{"operationId":"api_v1assistantspaces_get_collection","tags":["AssistantSpace"],"responses":{"200":{"description":"AssistantSpace collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantSpace-assistant_space.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantSpace.jsonld-assistant_space.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantSpace.jsonld-assistant_space.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssistantSpace resources.","description":"Retrieves the collection of AssistantSpace resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach letzter Änderung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assistantspaces_post","tags":["AssistantSpace"],"responses":{"201":{"description":"AssistantSpace resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSpace-assistant_space.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSpace.jsonld-assistant_space.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssistantSpace resource.","description":"Creates a AssistantSpace resource.","parameters":[],"requestBody":{"description":"The new AssistantSpace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSpace-assistant_space.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSpace-assistant_space.write"}}},"required":true}}},"/api/v1/assistant/spaces/{ulid}":{"get":{"operationId":"api_v1assistantspaces_ulid_get","tags":["AssistantSpace"],"responses":{"200":{"description":"AssistantSpace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSpace-assistant_space.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSpace.jsonld-assistant_space.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssistantSpace resource.","description":"Retrieves a AssistantSpace resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantSpace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assistantspaces_ulid_delete","tags":["AssistantSpace"],"responses":{"204":{"description":"AssistantSpace resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssistantSpace resource.","description":"Removes the AssistantSpace resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantSpace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assistantspaces_ulid_patch","tags":["AssistantSpace"],"responses":{"200":{"description":"AssistantSpace resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSpace-assistant_space.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantSpace.jsonld-assistant_space.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssistantSpace resource.","description":"Updates the AssistantSpace resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantSpace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssistantSpace resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssistantSpace-assistant_space.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assistant/threads":{"get":{"operationId":"api_v1assistantthreads_get_collection","tags":["AssistantThread"],"responses":{"200":{"description":"AssistantThread collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantThread-assistant_thread.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantThread.jsonld-assistant_thread.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantThread.jsonld-assistant_thread.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssistantThread resources.","description":"Retrieves the collection of AssistantThread resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"spaceUlid","in":"query","description":"Space-ULID (unbekannte ULIDs liefern eine leere Collection)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach Änderungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1assistantthreads_post","tags":["AssistantThread"],"responses":{"201":{"description":"AssistantThread resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThread-assistant_thread.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantThread.jsonld-assistant_thread.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AssistantThread resource.","description":"Creates a AssistantThread resource.","parameters":[],"requestBody":{"description":"The new AssistantThread resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThread-assistant_thread.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantThread-assistant_thread.write"}}},"required":true}}},"/api/v1/assistant/threads/{ulid}":{"get":{"operationId":"api_v1assistantthreads_ulid_get","tags":["AssistantThread"],"responses":{"200":{"description":"AssistantThread resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThread-assistant_thread.read_assistant_thread.item"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantThread.jsonld-assistant_thread.read_assistant_thread.item"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssistantThread resource.","description":"Retrieves a AssistantThread resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantThread identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1assistantthreads_ulid_delete","tags":["AssistantThread"],"responses":{"204":{"description":"AssistantThread resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AssistantThread resource.","description":"Removes the AssistantThread resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantThread identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1assistantthreads_ulid_patch","tags":["AssistantThread"],"responses":{"200":{"description":"AssistantThread resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantThread-assistant_thread.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantThread.jsonld-assistant_thread.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AssistantThread resource.","description":"Updates the AssistantThread resource.","parameters":[{"name":"ulid","in":"path","description":"AssistantThread identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AssistantThread resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AssistantThread-assistant_thread.write.jsonMergePatch"}}},"required":true}}},"/api/v1/assistant/tools":{"get":{"operationId":"api_v1assistanttools_get_collection","tags":["AssistantTool"],"responses":{"200":{"description":"AssistantTool collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantTool-assistant_tool.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantTool.jsonld-assistant_tool.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantTool.jsonld-assistant_tool.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssistantTool resources.","description":"Retrieves the collection of AssistantTool resources.","parameters":[]}},"/api/v1/assistant/tools/{key}":{"get":{"operationId":"api_v1assistanttools_key_get","tags":["AssistantTool"],"responses":{"200":{"description":"AssistantTool resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantTool-assistant_tool.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AssistantTool.jsonld-assistant_tool.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AssistantTool resource.","description":"Retrieves a AssistantTool resource.","parameters":[{"name":"key","in":"path","description":"AssistantTool identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/assistant/usage":{"get":{"operationId":"api_v1assistantusage_get_collection","tags":["AssistantUsage"],"responses":{"200":{"description":"AssistantUsage collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssistantUsage-assistant_usage.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AssistantUsage.jsonld-assistant_usage.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AssistantUsage.jsonld-assistant_usage.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AssistantUsage resources.","description":"Retrieves the collection of AssistantUsage resources.","parameters":[]}},"/api/v1/audit-logs":{"get":{"operationId":"api_v1audit-logs_get_collection","tags":["AuditLogEntry"],"responses":{"200":{"description":"AuditLogEntry collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuditLogEntry-audit_log.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AuditLogEntry.jsonld-audit_log.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AuditLogEntry.jsonld-audit_log.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AuditLogEntry resources.","description":"Audit-Historie, seitenweise. Liefert BEWUSST kein `hydra:totalItems` (Gesamtzahl): die COUNT-Abfrage kostet bei Millionen Zeilen ein Vielfaches der Seite selbst. Weiterblättern über `hydra:view` → `hydra:next` bzw. `page` hochzählen, bis eine leere Seite kommt.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"entityClass","in":"query","description":"Exakte Entitätsklasse (FQCN) des protokollierten Objekts","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"action","in":"query","description":"Aktion (create|update|delete)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"actorId","in":"query","description":"Akteur-Kennung (User-ULID / MCP-Identität / Automation-ULID)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"actorType","in":"query","description":"Akteur-Art — `ai` liefert genau die von der KI ausgelösten Schreibaktionen","required":false,"deprecated":false,"schema":{"type":"string","enum":["human","ai","automation","system"]},"style":"form","explode":true},{"name":"from","in":"query","description":"Ereigniszeitpunkt ab (inklusive)","required":false,"deprecated":false,"schema":{"type":"string","format":"date-time"},"style":"form","explode":true},{"name":"to","in":"query","description":"Ereigniszeitpunkt bis (reines Datum wird auf Tagesende ausgedehnt)","required":false,"deprecated":false,"schema":{"type":"string","format":"date-time"},"style":"form","explode":true},{"name":"dateFrom","in":"query","description":"Gleichbedeutend mit `from`; gilt nur, wenn `from` leer bleibt (erster nicht-leerer Schlüssel gewinnt)","required":false,"deprecated":false,"schema":{"type":"string","format":"date-time"},"style":"form","explode":true},{"name":"dateTo","in":"query","description":"Gleichbedeutend mit `to`; gilt nur, wenn `to` leer bleibt (erster nicht-leerer Schlüssel gewinnt)","required":false,"deprecated":false,"schema":{"type":"string","format":"date-time"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über entityClass, entityId, actorId und requestId","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Ereigniszeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/audit-logs/{ulid}":{"get":{"operationId":"api_v1audit-logs_ulid_get","tags":["AuditLogEntry"],"responses":{"200":{"description":"AuditLogEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogEntry-audit_log.read_audit_log.item"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AuditLogEntry.jsonld-audit_log.read_audit_log.item"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AuditLogEntry resource.","description":"Retrieves a AuditLogEntry resource.","parameters":[{"name":"ulid","in":"path","description":"AuditLogEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/automation-catalog":{"get":{"operationId":"api_v1automation-catalog_get_collection","tags":["AutomationCatalog"],"responses":{"200":{"description":"AutomationCatalog collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AutomationCatalog-automation_catalog.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AutomationCatalog.jsonld-automation_catalog.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AutomationCatalog.jsonld-automation_catalog.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AutomationCatalog resources.","description":"Retrieves the collection of AutomationCatalog resources.","parameters":[]}},"/api/v1/automations":{"get":{"operationId":"api_v1automations_get_collection","tags":["AutomationResource"],"responses":{"200":{"description":"AutomationResource collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AutomationResource-automation.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AutomationResource.jsonld-automation.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AutomationResource.jsonld-automation.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of AutomationResource resources.","description":"Retrieves the collection of AutomationResource resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Automations-Namen (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Automationen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"origin","in":"query","description":"Nur Automationen dieser Herkunft (system|plugin|user)","required":false,"deprecated":false,"schema":{"type":"string","enum":["system","plugin","user"]},"style":"form","explode":true},{"name":"ownerPluginKey","in":"query","description":"Nur Automationen dieses besitzenden Plugins (z. B. octi.scheduling)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"category","in":"query","description":"Nur Automationen dieser Kategorie","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"triggerType","in":"query","description":"Nur Automationen dieser Trigger-Art (event|cron|relative|manual)","required":false,"deprecated":false,"schema":{"type":"string","enum":["event","cron","relative","manual"]},"style":"form","explode":true}]},"post":{"operationId":"api_v1automations_post","tags":["AutomationResource"],"responses":{"201":{"description":"AutomationResource resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource.jsonld-automation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AutomationResource resource.","description":"Creates a AutomationResource resource.","parameters":[],"requestBody":{"description":"The new AutomationResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.write"}}},"required":true}}},"/api/v1/automations/from-template":{"post":{"operationId":"automation_from_template","tags":["AutomationResource"],"responses":{"201":{"description":"AutomationResource resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource.jsonld-automation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a AutomationResource resource.","description":"Creates a AutomationResource resource.","parameters":[],"requestBody":{"description":"The new AutomationResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource.AutomationFromTemplateInput-automation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource.AutomationFromTemplateInput-automation.write"}}},"required":true}}},"/api/v1/automations/{ulid}":{"get":{"operationId":"api_v1automations_ulid_get","tags":["AutomationResource"],"responses":{"200":{"description":"AutomationResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource.jsonld-automation.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a AutomationResource resource.","description":"Retrieves a AutomationResource resource.","parameters":[{"name":"ulid","in":"path","description":"AutomationResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1automations_ulid_delete","tags":["AutomationResource"],"responses":{"204":{"description":"AutomationResource resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the AutomationResource resource.","description":"Removes the AutomationResource resource.","parameters":[{"name":"ulid","in":"path","description":"AutomationResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1automations_ulid_patch","tags":["AutomationResource"],"responses":{"200":{"description":"AutomationResource resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource.jsonld-automation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the AutomationResource resource.","description":"Updates the AutomationResource resource.","parameters":[{"name":"ulid","in":"path","description":"AutomationResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated AutomationResource resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.write.jsonMergePatch"}}},"required":true}}},"/api/v1/automations/{ulid}/duplicate":{"post":{"operationId":"automation_duplicate","tags":["AutomationResource"],"responses":{"201":{"description":"AutomationResource resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource.jsonld-automation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Automation als individuelle Kopie duplizieren","description":"Erzeugt eine individuelle Kopie der Automation samt Schritten. Die Kopie startet DEAKTIVIERT und ist der einzige Weg, eine Standard-Automation anzupassen.","parameters":[{"name":"ulid","in":"path","description":"AutomationResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AutomationResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.write"}}},"required":true}}},"/api/v1/automations/{ulid}/run":{"post":{"operationId":"automation_run","tags":["AutomationResource"],"responses":{"201":{"description":"AutomationResource resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource.jsonld-automation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Automation auslösen (Probelauf oder echt)","description":"Löst die Automation aus. `dryRun=1` (Default) simuliert nur; `dryRun=0` führt die Aktionen ECHT aus und verlangt am gebundenen Vorgang das Änderungsrecht in dessen Marke. Optionale Bindung an ein Work-Item über `subjectType`/`subjectId`.","parameters":[{"name":"ulid","in":"path","description":"AutomationResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"dryRun","in":"query","description":"Nur simulieren (Default true); dryRun=0 löst echte Aktionen aus und verlangt am gebundenen Vorgang das Änderungsrecht in dessen Marke (R35-53)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"subjectType","in":"query","description":"Subjekt-Typ für die Bindung (aktuell workitem)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"subjectId","in":"query","description":"ULID des Subjekts (Work-Item)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}],"requestBody":{"description":"The new AutomationResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationResource-automation.write"}}},"required":true}}},"/api/v1/automation-runs":{"get":{"operationId":"api_v1automation-runs_get_collection","tags":["AutomationRun"],"responses":{"200":{"description":"AutomationRun collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AutomationRun-automation_run.read"}}},"application/ld+json":{"schema":{"type":"object","description":"AutomationRun.jsonld-automation_run.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/AutomationRun.jsonld-automation_run.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Automations-Läufe","description":"Läufe der für den Nutzer sichtbaren Automationen, jüngste zuerst. Das Schritt-Protokoll liefert der Einzel-Abruf.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"automationUlid","in":"query","description":"Nur Läufe dieser Automation","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Nur Läufe mit diesem Status","required":false,"deprecated":false,"schema":{"type":"string","enum":["pending","running","waiting","completed","failed","skipped"]},"style":"form","explode":true},{"name":"order[startedAt]","in":"query","description":"Sortierung nach Startzeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/automation-runs/{ulid}":{"get":{"operationId":"api_v1automation-runs_ulid_get","tags":["AutomationRun"],"responses":{"200":{"description":"AutomationRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationRun-automation_run.read_automation_run.item"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationRun.jsonld-automation_run.read_automation_run.item"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ein Automations-Lauf mit Schritt-Protokoll","description":"Liefert zusätzlich `log` (jeder Schritt mit Zeitstempel und Ergebnis), `triggerPayload` und die KI-Kosten des Laufs.","parameters":[{"name":"ulid","in":"path","description":"AutomationRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/automations/{ulid}/test":{"post":{"operationId":"api_v1automations_ulidtest_post","tags":["AutomationTestResult"],"responses":{"201":{"description":"AutomationTestResult resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationTestResult-automation_test.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationTestResult.jsonld-automation_test.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Automation synchron als Probelauf testen","description":"Führt die Automation sofort und synchron als Probelauf aus und liefert das Schritt-Protokoll zurück. Schreibt nie fachliche Daten.","parameters":[{"name":"ulid","in":"path","description":"AutomationTestResult identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new AutomationTestResult resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationTestResult-automation_test.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/AutomationTestResult-automation_test.write"}}},"required":true}}},"/api/v1/batch-serial/batches":{"get":{"operationId":"api_v1batch-serialbatches_get_collection","tags":["BatchSerialBatch"],"responses":{"200":{"description":"BatchSerialBatch collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BatchSerialBatch-batch.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BatchSerialBatch.jsonld-batch.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BatchSerialBatch.jsonld-batch.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BatchSerialBatch resources.","description":"Retrieves the collection of BatchSerialBatch resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Nur Chargen dieses Artikels","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"batchNumber","in":"query","description":"Exakte Chargennummer (Rückruf-Suche)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"available","in":"query","description":"Nur auslieferbare Chargen (nicht gesperrt, Restmenge > 0, Restlaufzeit erfüllt)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"expiringInDays","in":"query","description":"Nur Chargen, deren MHD innerhalb dieser Tage liegt","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/batch-serial/batches/{ulid}":{"get":{"operationId":"api_v1batch-serialbatches_ulid_get","tags":["BatchSerialBatch"],"responses":{"200":{"description":"BatchSerialBatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch-batch.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch.jsonld-batch.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BatchSerialBatch resource.","description":"Retrieves a BatchSerialBatch resource.","parameters":[{"name":"ulid","in":"path","description":"BatchSerialBatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/batch-serial/batches/{ulid}/block":{"post":{"operationId":"batch_serial_batch_block","tags":["BatchSerialBatch"],"responses":{"201":{"description":"BatchSerialBatch resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch-batch.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch.jsonld-batch.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Charge sperren (Rückruf)","description":"Pflichtfeld `reason` (sonst 422). Die Charge wird ab sofort nicht mehr ausgeliefert, kommissioniert oder als verfügbar vorgeschlagen — laufende Aufträge auf diese Charge bleiben unerfüllt liegen. Der Bestand bleibt physisch und in der Bewertung stehen. Aufheben über `/unblock`.","parameters":[{"name":"ulid","in":"path","description":"BatchSerialBatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BatchSerialBatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch-batch.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch-batch.write"}}},"required":true}}},"/api/v1/batch-serial/batches/{ulid}/unblock":{"post":{"operationId":"batch_serial_batch_unblock","tags":["BatchSerialBatch"],"responses":{"201":{"description":"BatchSerialBatch resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch-batch.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch.jsonld-batch.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Chargensperre aufheben","description":"Hebt die Sperre einer Charge auf: sie darf wieder entnommen und verkauft werden. Vorbedingung: die Charge ist gesperrt.","parameters":[{"name":"ulid","in":"path","description":"BatchSerialBatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BatchSerialBatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch-batch.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialBatch-batch.write"}}},"required":true}}},"/api/v1/batch-serial/product-tracking":{"get":{"operationId":"api_v1batch-serialproduct-tracking_get_collection","tags":["BatchSerialProductTracking"],"responses":{"200":{"description":"BatchSerialProductTracking collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BatchSerialProductTracking-product_tracking.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BatchSerialProductTracking.jsonld-product_tracking.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BatchSerialProductTracking.jsonld-product_tracking.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BatchSerialProductTracking resources.","description":"Retrieves the collection of BatchSerialProductTracking resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Nachweispflicht dieses Artikels","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"mode","in":"query","description":"Nur Artikel mit dieser Nachweis-Art","required":false,"deprecated":false,"schema":{"type":"string","enum":["batch","serial"]},"style":"form","explode":true}]},"post":{"operationId":"api_v1batch-serialproduct-tracking_post","tags":["BatchSerialProductTracking"],"responses":{"201":{"description":"BatchSerialProductTracking resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking-product_tracking.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking.jsonld-product_tracking.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BatchSerialProductTracking resource.","description":"Creates a BatchSerialProductTracking resource.","parameters":[],"requestBody":{"description":"The new BatchSerialProductTracking resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking-product_tracking.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking-product_tracking.write"}}},"required":true}}},"/api/v1/batch-serial/product-tracking/{ulid}":{"get":{"operationId":"api_v1batch-serialproduct-tracking_ulid_get","tags":["BatchSerialProductTracking"],"responses":{"200":{"description":"BatchSerialProductTracking resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking-product_tracking.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking.jsonld-product_tracking.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BatchSerialProductTracking resource.","description":"Retrieves a BatchSerialProductTracking resource.","parameters":[{"name":"ulid","in":"path","description":"BatchSerialProductTracking identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1batch-serialproduct-tracking_ulid_delete","tags":["BatchSerialProductTracking"],"responses":{"204":{"description":"BatchSerialProductTracking resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the BatchSerialProductTracking resource.","description":"Removes the BatchSerialProductTracking resource.","parameters":[{"name":"ulid","in":"path","description":"BatchSerialProductTracking identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1batch-serialproduct-tracking_ulid_patch","tags":["BatchSerialProductTracking"],"responses":{"200":{"description":"BatchSerialProductTracking resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking-product_tracking.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking.jsonld-product_tracking.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the BatchSerialProductTracking resource.","description":"Updates the BatchSerialProductTracking resource.","parameters":[{"name":"ulid","in":"path","description":"BatchSerialProductTracking identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BatchSerialProductTracking resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BatchSerialProductTracking-product_tracking.write.jsonMergePatch"}}},"required":true}}},"/api/v1/batch-serial/trace":{"get":{"operationId":"api_v1batch-serialtrace_get_collection","tags":["BatchSerialTrace"],"responses":{"200":{"description":"BatchSerialTrace collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BatchSerialTrace-batch_trace.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BatchSerialTrace.jsonld-batch_trace.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BatchSerialTrace.jsonld-batch_trace.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BatchSerialTrace resources.","description":"Retrieves the collection of BatchSerialTrace resources.","parameters":[{"name":"batchNumber","in":"query","description":"Chargennummer, deren Verbleib gesucht wird","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"serialNumber","in":"query","description":"Seriennummer, deren Verbleib gesucht wird","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"productId","in":"query","description":"Artikel eingrenzen (bei gleicher Chargennummer über mehrere Artikel)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/mail/bcc-address":{"get":{"operationId":"api_v1mailbcc-address_get_collection","tags":["BccAddress"],"responses":{"200":{"description":"BccAddress collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BccAddress-bcc_address.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BccAddress.jsonld-bcc_address.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BccAddress.jsonld-bcc_address.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BccAddress resources.","description":"Retrieves the collection of BccAddress resources.","parameters":[]}},"/api/v1/manufacturing/bills-of-material":{"get":{"operationId":"api_v1manufacturingbills-of-material_get_collection","tags":["BillOfMaterial"],"responses":{"200":{"description":"BillOfMaterial collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BillOfMaterial-bom.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BillOfMaterial.jsonld-bom.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BillOfMaterial.jsonld-bom.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BillOfMaterial resources.","description":"Retrieves the collection of BillOfMaterial resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Nur Datensätze dieser Marke (Marken-Umschalter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel: draft|active|archived","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"productId","in":"query","description":"Nur Stücklisten dieses Erzeugnisses","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über den Stücklisten-Namen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[version]","in":"query","description":"Sortierung nach Version (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1manufacturingbills-of-material_post","tags":["BillOfMaterial"],"responses":{"201":{"description":"BillOfMaterial resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial.jsonld-bom.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Stückliste als Entwurf anlegen","description":"Pflicht ist `productId`; `items` kann die Positionen gleich mitliefern ({componentProductId, qty, scrapPercent?, note?}). Die Version zählt je Erzeugnis automatisch hoch. `outputQty` ist die Ausbringung, auf die sich die Positionsmengen beziehen (Default 1).","parameters":[],"requestBody":{"description":"The new BillOfMaterial resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write"}}},"required":true}}},"/api/v1/manufacturing/bills-of-material/{ulid}":{"get":{"operationId":"api_v1manufacturingbills-of-material_ulid_get","tags":["BillOfMaterial"],"responses":{"200":{"description":"BillOfMaterial resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial.jsonld-bom.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BillOfMaterial resource.","description":"Retrieves a BillOfMaterial resource.","parameters":[{"name":"ulid","in":"path","description":"BillOfMaterial identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1manufacturingbills-of-material_ulid_patch","tags":["BillOfMaterial"],"responses":{"200":{"description":"BillOfMaterial resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial.jsonld-bom.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Entwurf ändern","description":"Nur im Status `draft`. Wird `items` mitgeschickt, ERSETZT die Liste die bisherigen Positionen vollständig — eine teilweise Übernahme ergäbe eine Rezeptur, die so nie beschlossen wurde.","parameters":[{"name":"ulid","in":"path","description":"BillOfMaterial identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BillOfMaterial resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write.jsonMergePatch"}}},"required":true}}},"/api/v1/manufacturing/bills-of-material/{ulid}/activate":{"post":{"operationId":"manufacturing_bom_activate","tags":["BillOfMaterial"],"responses":{"201":{"description":"BillOfMaterial resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial.jsonld-bom.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Stückliste freigeben","description":"Macht den Entwurf zur gültigen Version; die bisher aktive wird archiviert. Ohne Position keine Freigabe.","parameters":[{"name":"ulid","in":"path","description":"BillOfMaterial identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BillOfMaterial resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write"}}},"required":true}}},"/api/v1/manufacturing/bills-of-material/{ulid}/archive":{"post":{"operationId":"manufacturing_bom_archive","tags":["BillOfMaterial"],"responses":{"201":{"description":"BillOfMaterial resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial.jsonld-bom.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Stückliste stilllegen","description":"Stückliste stilllegen","parameters":[{"name":"ulid","in":"path","description":"BillOfMaterial identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BillOfMaterial resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write"}}},"required":true}}},"/api/v1/manufacturing/bills-of-material/{ulid}/new-version":{"post":{"operationId":"manufacturing_bom_new_version","tags":["BillOfMaterial"],"responses":{"201":{"description":"BillOfMaterial resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial.jsonld-bom.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Neue Version aus dieser Fassung","description":"Kopiert Kopf und Positionen in einen neuen Entwurf. Der einzige Weg, eine freigegebene Rezeptur zu „ändern\".","parameters":[{"name":"ulid","in":"path","description":"BillOfMaterial identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BillOfMaterial resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillOfMaterial-bom.write"}}},"required":true}}},"/api/v1/billing-previews":{"get":{"operationId":"api_v1billing-previews_get_collection","tags":["BillingPreview"],"responses":{"200":{"description":"BillingPreview collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BillingPreview-billing_preview.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BillingPreview.jsonld-billing_preview.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BillingPreview.jsonld-billing_preview.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BillingPreview resources.","description":"Retrieves the collection of BillingPreview resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Notiz und Kundenname","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[totalAmount]","in":"query","description":"Sortierung nach Gesamtsumme (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[handedOverAt]","in":"query","description":"Sortierung nach Übergabezeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1billing-previews_post","tags":["BillingPreview"],"responses":{"201":{"description":"BillingPreview resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview.jsonld-billing_preview.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BillingPreview resource.","description":"Creates a BillingPreview resource.","parameters":[],"requestBody":{"description":"The new BillingPreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.write"}}},"required":true}}},"/api/v1/billing-previews/{ulid}":{"get":{"operationId":"api_v1billing-previews_ulid_get","tags":["BillingPreview"],"responses":{"200":{"description":"BillingPreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview.jsonld-billing_preview.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BillingPreview resource.","description":"Retrieves a BillingPreview resource.","parameters":[{"name":"ulid","in":"path","description":"BillingPreview identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/billing-previews/{ulid}/handoff":{"post":{"operationId":"billing_preview_handoff","tags":["BillingPreview"],"responses":{"201":{"description":"BillingPreview resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview.jsonld-billing_preview.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vorschau an lexoffice übergeben","description":"Übergibt die freigegebene Vorschau an lexoffice und setzt die enthaltenen Zeiten auf `invoiced`. Nur aus dem Zustand `ready` (sonst 409); idempotent über die lexoffice-Verknüpfung — ein zweiter Aufruf schiebt nichts nach.","parameters":[{"name":"ulid","in":"path","description":"BillingPreview identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BillingPreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.write"}}},"required":true}}},"/api/v1/billing-previews/{ulid}/ready":{"post":{"operationId":"billing_preview_ready","tags":["BillingPreview"],"responses":{"201":{"description":"BillingPreview resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview.jsonld-billing_preview.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Abrechnungs-Vorschau freigeben","description":"Markiert die Vorschau als geprüft und gibt sie zur Übergabe frei (Zustand `ready`) — erst dann nimmt der Übergabeweg sie an.","parameters":[{"name":"ulid","in":"path","description":"BillingPreview identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BillingPreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.write"}}},"required":true}}},"/api/v1/billing-previews/{ulid}/reopen":{"post":{"operationId":"billing_preview_reopen","tags":["BillingPreview"],"responses":{"201":{"description":"BillingPreview resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview.jsonld-billing_preview.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Geprüfte Vorschau wieder öffnen","description":"Öffnet eine geprüfte Vorschau wieder zur Bearbeitung. Nach der Übergabe ist das nicht mehr möglich.","parameters":[{"name":"ulid","in":"path","description":"BillingPreview identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BillingPreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreview-billing_preview.write"}}},"required":true}}},"/api/v1/billing-previews/{ulid}/create-invoice":{"post":{"operationId":"billing_preview_create_invoice","tags":["BillingPreviewCreateInvoice"],"responses":{"201":{"description":"BillingPreviewCreateInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreviewCreateInvoice-billing_preview_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreviewCreateInvoice.jsonld-billing_preview_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Aus der Abrechnungs-Vorschau eine Rechnung erzeugen","description":"Erzeugt aus einer freigegebenen Vorschau einen Rechnungs-ENTWURF (Alternative zur lexoffice-Übergabe). Eine zweite Übergabe derselben Vorschau scheitert (409).","parameters":[{"name":"ulid","in":"path","description":"BillingPreviewCreateInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BillingPreviewCreateInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPreviewCreateInvoice-billing_preview_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BillingPreviewCreateInvoice-billing_preview_invoice.write"}}},"required":true}}},"/api/v1/warehouses/{warehouseUlid}/bin-stocks":{"get":{"operationId":"api_v1warehouses_warehouseUlidbin-stocks_get_collection","tags":["BinStock"],"responses":{"200":{"description":"BinStock collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BinStock-bin_stock.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BinStock.jsonld-bin_stock.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BinStock.jsonld-bin_stock.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BinStock resources.","description":"Retrieves the collection of BinStock resources.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Nur dieser Artikel","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"binCode","in":"query","description":"Nur dieser Lagerplatz","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/warehouses/{warehouseUlid}/bin-stocks/putaway":{"post":{"operationId":"wh_bin_stock_putaway","tags":["BinStock"],"responses":{"201":{"description":"BinStock resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BinStock-bin_stock.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BinStock.jsonld-bin_stock.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einlagern bzw. Platz zu Platz umlagern","description":"Payload `{productId|barcode, qty, binCode, fromBinCode?}`. Ohne `fromBinCode` wird nicht verortete Menge eingelagert (422, wenn so viel gar nicht frei ist); mit `fromBinCode` von Platz zu Platz umgelagert. Der Lagerbestand ändert sich in keinem Fall — nur seine Verteilung.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BinStock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BinStock-bin_stock.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BinStock-bin_stock.write"}}},"required":true}}},"/api/v1/project-boards":{"get":{"operationId":"api_v1project-boards_get_collection","tags":["Board"],"responses":{"200":{"description":"Board collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Board-board.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Board.jsonld-board.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Board.jsonld-board.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Board resources.","description":"Retrieves the collection of Board resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectUlid","in":"query","description":"Projekt-ULID — nur Boards dieses Projekts; unbekannte/unzugängliche ULIDs liefern eine leere Collection","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1project-boards_post","tags":["Board"],"responses":{"201":{"description":"Board resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board-board.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Board.jsonld-board.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Board resource.","description":"Creates a Board resource.","parameters":[],"requestBody":{"description":"The new Board resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board-board.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Board-board.write"}}},"required":true}}},"/api/v1/project-boards/{ulid}":{"get":{"operationId":"api_v1project-boards_ulid_get","tags":["Board"],"responses":{"200":{"description":"Board resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board-board.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Board.jsonld-board.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Board resource.","description":"Retrieves a Board resource.","parameters":[{"name":"ulid","in":"path","description":"Board identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1project-boards_ulid_delete","tags":["Board"],"responses":{"204":{"description":"Board resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Board resource.","description":"Removes the Board resource.","parameters":[{"name":"ulid","in":"path","description":"Board identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1project-boards_ulid_patch","tags":["Board"],"responses":{"200":{"description":"Board resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board-board.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Board.jsonld-board.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Board resource.","description":"Updates the Board resource.","parameters":[{"name":"ulid","in":"path","description":"Board identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Board resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Board-board.update.jsonMergePatch"}}},"required":true}}},"/api/v1/brain/ask":{"post":{"operationId":"api_v1brainask_post","tags":["BrainAsk"],"responses":{"200":{"description":"BrainAsk resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainAsk-brain_ask.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainAsk.jsonld-brain_ask.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BrainAsk resource.","description":"Creates a BrainAsk resource.","parameters":[],"requestBody":{"description":"The new BrainAsk resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainAsk-brain_ask.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainAsk-brain_ask.write"}}},"required":true}}},"/api/v1/brain/context/preview":{"post":{"operationId":"api_v1braincontextpreview_post","tags":["BrainContextPreview"],"responses":{"200":{"description":"BrainContextPreview resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainContextPreview-brain_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainContextPreview.jsonld-brain_preview.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BrainContextPreview resource.","description":"Creates a BrainContextPreview resource.","parameters":[],"requestBody":{"description":"The new BrainContextPreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainContextPreview-brain_preview.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainContextPreview-brain_preview.write"}}},"required":true}}},"/api/v1/brain/embed-backfill":{"post":{"operationId":"api_v1brainembed-backfill_post","tags":["BrainEmbedBackfill"],"responses":{"202":{"description":"BrainEmbedBackfill resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainEmbedBackfill-brain_backfill.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainEmbedBackfill.jsonld-brain_backfill.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Fehlende CompanyBrain-Einbettungen nachziehen","description":"Arbeitet den Embedding-Rückstand (siehe /v1/brain/health, chunks.pending) im Hintergrund ab. Stoppt am KI-Budget-Deckel und setzt beim nächsten Lauf fort.","parameters":[],"requestBody":{"description":"The new BrainEmbedBackfill resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainEmbedBackfill-brain_backfill.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainEmbedBackfill-brain_backfill.write"}}},"required":true}}},"/api/v1/brain/facts":{"get":{"operationId":"api_v1brainfacts_get_collection","tags":["BrainFact"],"responses":{"200":{"description":"BrainFact collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BrainFact-brain_fact.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BrainFact.jsonld-brain_fact.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BrainFact.jsonld-brain_fact.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BrainFact resources.","description":"Retrieves the collection of BrainFact resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"category","in":"query","description":"Faktenkategorie (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status des Fakts (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[priority]","in":"query","description":"Sortierung nach Priorität (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[category]","in":"query","description":"Sortierung nach Kategorie (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1brainfacts_post","tags":["BrainFact"],"responses":{"201":{"description":"BrainFact resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainFact-brain_fact.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainFact.jsonld-brain_fact.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BrainFact resource.","description":"Creates a BrainFact resource.","parameters":[],"requestBody":{"description":"The new BrainFact resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainFact-brain_fact.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainFact-brain_fact.write"}}},"required":true}}},"/api/v1/brain/facts/{ulid}":{"get":{"operationId":"api_v1brainfacts_ulid_get","tags":["BrainFact"],"responses":{"200":{"description":"BrainFact resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainFact-brain_fact.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainFact.jsonld-brain_fact.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BrainFact resource.","description":"Retrieves a BrainFact resource.","parameters":[{"name":"ulid","in":"path","description":"BrainFact identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1brainfacts_ulid_delete","tags":["BrainFact"],"responses":{"204":{"description":"BrainFact resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the BrainFact resource.","description":"Removes the BrainFact resource.","parameters":[{"name":"ulid","in":"path","description":"BrainFact identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1brainfacts_ulid_patch","tags":["BrainFact"],"responses":{"200":{"description":"BrainFact resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainFact-brain_fact.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainFact.jsonld-brain_fact.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the BrainFact resource.","description":"Updates the BrainFact resource.","parameters":[{"name":"ulid","in":"path","description":"BrainFact identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BrainFact resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BrainFact-brain_fact.write.jsonMergePatch"}}},"required":true}}},"/api/v1/brain/feedback":{"get":{"operationId":"api_v1brainfeedback_get_collection","tags":["BrainFeedback"],"responses":{"200":{"description":"BrainFeedback collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BrainFeedback-brain_feedback.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BrainFeedback.jsonld-brain_feedback.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BrainFeedback.jsonld-brain_feedback.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BrainFeedback resources.","description":"Retrieves the collection of BrainFeedback resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Zeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[rating]","in":"query","description":"Sortierung nach Bewertung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1brainfeedback_post","tags":["BrainFeedback"],"responses":{"201":{"description":"BrainFeedback resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainFeedback-brain_feedback.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainFeedback.jsonld-brain_feedback.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BrainFeedback resource.","description":"Creates a BrainFeedback resource.","parameters":[],"requestBody":{"description":"The new BrainFeedback resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainFeedback-brain_feedback.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainFeedback-brain_feedback.write"}}},"required":true}}},"/api/v1/brain/feedback/{ulid}":{"patch":{"operationId":"api_v1brainfeedback_ulid_patch","tags":["BrainFeedback"],"responses":{"200":{"description":"BrainFeedback resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainFeedback-brain_feedback.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainFeedback.jsonld-brain_feedback.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the BrainFeedback resource.","description":"Updates the BrainFeedback resource.","parameters":[{"name":"ulid","in":"path","description":"BrainFeedback identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BrainFeedback resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BrainFeedback-brain_feedback.write.jsonMergePatch"}}},"required":true}}},"/api/v1/brain/health":{"get":{"operationId":"api_v1brainhealth_get_collection","tags":["BrainHealth"],"responses":{"200":{"description":"BrainHealth collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BrainHealth-brain_health.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BrainHealth.jsonld-brain_health.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BrainHealth.jsonld-brain_health.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BrainHealth resources.","description":"Retrieves the collection of BrainHealth resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]}},"/api/v1/brain/instructions":{"get":{"operationId":"api_v1braininstructions_get_collection","tags":["BrainInstruction"],"responses":{"200":{"description":"BrainInstruction collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BrainInstruction.jsonld-brain_instruction.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BrainInstruction.jsonld-brain_instruction.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BrainInstruction resources.","description":"Retrieves the collection of BrainInstruction resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"order[useCase]","in":"query","description":"Sortierung nach Use-Case (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach letzter Änderung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1braininstructions_post","tags":["BrainInstruction"],"responses":{"201":{"description":"BrainInstruction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainInstruction.jsonld-brain_instruction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BrainInstruction resource.","description":"Creates a BrainInstruction resource.","parameters":[],"requestBody":{"description":"The new BrainInstruction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.write"}}},"required":true}}},"/api/v1/brain/instructions/{ulid}":{"get":{"operationId":"api_v1braininstructions_ulid_get","tags":["BrainInstruction"],"responses":{"200":{"description":"BrainInstruction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainInstruction.jsonld-brain_instruction.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BrainInstruction resource.","description":"Retrieves a BrainInstruction resource.","parameters":[{"name":"ulid","in":"path","description":"BrainInstruction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1braininstructions_ulid_delete","tags":["BrainInstruction"],"responses":{"204":{"description":"BrainInstruction resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the BrainInstruction resource.","description":"Removes the BrainInstruction resource.","parameters":[{"name":"ulid","in":"path","description":"BrainInstruction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1braininstructions_ulid_patch","tags":["BrainInstruction"],"responses":{"200":{"description":"BrainInstruction resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainInstruction.jsonld-brain_instruction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the BrainInstruction resource.","description":"Updates the BrainInstruction resource.","parameters":[{"name":"ulid","in":"path","description":"BrainInstruction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BrainInstruction resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.write.jsonMergePatch"}}},"required":true}}},"/api/v1/brain/instructions/{ulid}/reset":{"post":{"operationId":"brain_instruction_reset","tags":["BrainInstruction"],"responses":{"200":{"description":"BrainInstruction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainInstruction.jsonld-brain_instruction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"System-Instruktion auf den Auslieferungsstand zurücksetzen","description":"Stellt die System-Instruktion auf den Datei-Default zurück (`customized=false`). Die eigene Fassung geht dabei verloren.","parameters":[{"name":"ulid","in":"path","description":"BrainInstruction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BrainInstruction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainInstruction-brain_instruction.write"}}},"required":true}}},"/api/v1/brain/knowledge-gaps":{"get":{"operationId":"api_v1brainknowledge-gaps_get_collection","tags":["BrainKnowledgeGap"],"responses":{"200":{"description":"BrainKnowledgeGap collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BrainKnowledgeGap-brain_gap.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BrainKnowledgeGap.jsonld-brain_gap.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BrainKnowledgeGap.jsonld-brain_gap.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Wissenslücken aus negativem KI-Feedback","description":"Clustert die offenen „Daumen runter\"-Rückmeldungen je Use-Case und schlägt je Cluster einen Wissensartikel-Entwurf vor. Nie Auto-Publish — ein Mensch entscheidet.","parameters":[{"name":"limit","in":"query","description":"Zahl der einbezogenen offenen negativen Rückmeldungen (1…200, Default 50)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/brain/policies":{"get":{"operationId":"api_v1brainpolicies_get_collection","tags":["BrainPolicy"],"responses":{"200":{"description":"BrainPolicy collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BrainPolicy-brain_policy.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BrainPolicy.jsonld-brain_policy.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BrainPolicy.jsonld-brain_policy.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BrainPolicy resources.","description":"Retrieves the collection of BrainPolicy resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"order[useCase]","in":"query","description":"Sortierung nach Use-Case (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach letzter Änderung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1brainpolicies_post","tags":["BrainPolicy"],"responses":{"201":{"description":"BrainPolicy resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainPolicy-brain_policy.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainPolicy.jsonld-brain_policy.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BrainPolicy resource.","description":"Creates a BrainPolicy resource.","parameters":[],"requestBody":{"description":"The new BrainPolicy resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainPolicy-brain_policy.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainPolicy-brain_policy.write"}}},"required":true}}},"/api/v1/brain/policies/{ulid}":{"get":{"operationId":"api_v1brainpolicies_ulid_get","tags":["BrainPolicy"],"responses":{"200":{"description":"BrainPolicy resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainPolicy-brain_policy.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainPolicy.jsonld-brain_policy.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BrainPolicy resource.","description":"Retrieves a BrainPolicy resource.","parameters":[{"name":"ulid","in":"path","description":"BrainPolicy identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1brainpolicies_ulid_delete","tags":["BrainPolicy"],"responses":{"204":{"description":"BrainPolicy resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the BrainPolicy resource.","description":"Removes the BrainPolicy resource.","parameters":[{"name":"ulid","in":"path","description":"BrainPolicy identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1brainpolicies_ulid_patch","tags":["BrainPolicy"],"responses":{"200":{"description":"BrainPolicy resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainPolicy-brain_policy.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainPolicy.jsonld-brain_policy.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the BrainPolicy resource.","description":"Updates the BrainPolicy resource.","parameters":[{"name":"ulid","in":"path","description":"BrainPolicy identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BrainPolicy resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BrainPolicy-brain_policy.write.jsonMergePatch"}}},"required":true}}},"/api/v1/brain/policies/matrix":{"get":{"operationId":"api_v1brainpoliciesmatrix_get_collection","tags":["BrainPolicyMatrix"],"responses":{"200":{"description":"BrainPolicyMatrix collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BrainPolicyMatrix-brain_policy_matrix.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BrainPolicyMatrix.jsonld-brain_policy_matrix.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BrainPolicyMatrix.jsonld-brain_policy_matrix.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BrainPolicyMatrix resources.","description":"Retrieves the collection of BrainPolicyMatrix resources.","parameters":[]}},"/api/v1/brain/reindex":{"post":{"operationId":"api_v1brainreindex_post","tags":["BrainReindex"],"responses":{"202":{"description":"BrainReindex resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainReindex-brain_reindex.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainReindex.jsonld-brain_reindex.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"CompanyBrain-Chunks neu aufbauen","description":"Baut den Chunk-Sidecar aus dem Suchindex neu auf und stößt anschließend die fehlenden Einbettungen an. Läuft im Hintergrund; die Antwort bestätigt nur die Einreihung.","parameters":[],"requestBody":{"description":"The new BrainReindex resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainReindex-brain_reindex.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainReindex-brain_reindex.write"}}},"required":true}}},"/api/v1/brain/sources":{"get":{"operationId":"api_v1brainsources_get_collection","tags":["BrainSource"],"responses":{"200":{"description":"BrainSource collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BrainSource-brain_source.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BrainSource.jsonld-brain_source.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BrainSource.jsonld-brain_source.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"CompanyBrain-Quellen auflisten","description":"Listet jede Inhalts-Klasse, die das CompanyBrain chunken kann — mit Bestand im Suchindex, bereits abgeleiteten Chunks und dem Schaltzustand der Positivliste.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]}},"/api/v1/brain/sources/{id}":{"get":{"operationId":"api_v1brainsources_id_get","tags":["BrainSource"],"responses":{"200":{"description":"BrainSource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainSource-brain_source.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainSource.jsonld-brain_source.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BrainSource resource.","description":"Retrieves a BrainSource resource.","parameters":[{"name":"id","in":"path","description":"BrainSource identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1brainsources_id_patch","tags":["BrainSource"],"responses":{"200":{"description":"BrainSource resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainSource-brain_source.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrainSource.jsonld-brain_source.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"CompanyBrain-Quelle ein-/ausschalten","description":"Nimmt eine Inhalts-Klasse in die Positivliste auf oder entfernt sie. Ausschalten löscht zusätzlich die bereits abgeleiteten Chunks dieser Klasse (Quelldaten bleiben unberührt). Einschalten wirkt ab der nächsten Änderung — den Bestand baut POST /v1/brain/reindex auf.","parameters":[{"name":"id","in":"path","description":"BrainSource identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BrainSource resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BrainSource-brain_source.write.jsonMergePatch"}}},"required":true}}},"/api/v1/brands":{"get":{"operationId":"api_v1brands_get_collection","tags":["Brand"],"responses":{"200":{"description":"Brand collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Brand-brand.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Brand.jsonld-brand.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Brand.jsonld-brand.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Brand resources.","description":"Retrieves the collection of Brand resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Name und Slug (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1brands_post","tags":["Brand"],"responses":{"201":{"description":"Brand resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brand-brand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Brand.jsonld-brand.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Brand resource.","description":"Creates a Brand resource.","parameters":[],"requestBody":{"description":"The new Brand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brand-brand.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Brand-brand.write"}}},"required":true}}},"/api/v1/brands/{ulid}":{"get":{"operationId":"api_v1brands_ulid_get","tags":["Brand"],"responses":{"200":{"description":"Brand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brand-brand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Brand.jsonld-brand.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Brand resource.","description":"Retrieves a Brand resource.","parameters":[{"name":"ulid","in":"path","description":"Brand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1brands_ulid_delete","tags":["Brand"],"responses":{"204":{"description":"Brand resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Brand resource.","description":"Removes the Brand resource.","parameters":[{"name":"ulid","in":"path","description":"Brand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1brands_ulid_patch","tags":["Brand"],"responses":{"200":{"description":"Brand resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brand-brand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Brand.jsonld-brand.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Brand resource.","description":"Updates the Brand resource.","parameters":[{"name":"ulid","in":"path","description":"Brand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Brand resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Brand-brand.write.jsonMergePatch"}}},"required":true}}},"/api/v1/brands/{ulid}/assets":{"post":{"operationId":"api_v1brands_ulidassets_post","tags":["BrandAsset"],"responses":{"201":{"description":"BrandAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandAsset-brand_asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrandAsset.jsonld-brand_asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Marken-Bildmarke hochladen","description":"Lädt eine Bildmarke der Marke hoch (`slot`: icon|logo|logoInverse|emailLogo, Inhalt base64). Ein dort vorhandenes Bild wird ersetzt; höchstens 2 MB je Bild.","parameters":[{"name":"ulid","in":"path","description":"BrandAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BrandAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandAsset-brand_asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrandAsset-brand_asset.write"}}},"required":true}}},"/api/v1/brands/{ulid}/assets/remove":{"post":{"operationId":"api_v1brands_ulidassetsremove_post","tags":["BrandAsset"],"responses":{"201":{"description":"BrandAsset resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandAsset-brand_asset.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrandAsset.jsonld-brand_asset.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"CI-Bildmarke der Marke entfernen","description":"Pflichtfeld `slot` (icon | logo | logoInverse | emailLogo). Löscht die hinterlegte Datei aus der Ablage und leert den Slot — Belege, Portal und Mailvorlagen dieser Marke erscheinen danach ohne dieses Bild. Kein Papierkorb.","parameters":[{"name":"ulid","in":"path","description":"BrandAsset identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BrandAsset resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandAsset-brand_asset.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BrandAsset-brand_asset.write"}}},"required":true}}},"/api/v1/project-budgets":{"get":{"operationId":"api_v1project-budgets_get_collection","tags":["Budget"],"responses":{"200":{"description":"Budget collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Budget-budget.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Budget.jsonld-budget.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Budget.jsonld-budget.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Budget resources.","description":"Retrieves the collection of Budget resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"level","in":"query","description":"Budget-Ebene (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string","enum":["customer","project","workitem","contract"]},"style":"form","explode":true},{"name":"targetId","in":"query","description":"Ziel-ID der Budget-Ebene (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"active","in":"query","description":"Aktiv-Status (true = nur aktive, false = nur inaktive Budgets)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über den Budget-Namen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[period]","in":"query","description":"Sortierung nach Zeitraum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[capMode]","in":"query","description":"Sortierung nach Cap-Modus (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1project-budgets_post","tags":["Budget"],"responses":{"201":{"description":"Budget resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget-budget.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Budget.jsonld-budget.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Budget resource.","description":"Creates a Budget resource.","parameters":[],"requestBody":{"description":"The new Budget resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget-budget.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Budget-budget.write"}}},"required":true}}},"/api/v1/project-budgets/{ulid}":{"get":{"operationId":"api_v1project-budgets_ulid_get","tags":["Budget"],"responses":{"200":{"description":"Budget resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget-budget.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Budget.jsonld-budget.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Budget resource.","description":"Retrieves a Budget resource.","parameters":[{"name":"ulid","in":"path","description":"Budget identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1project-budgets_ulid_delete","tags":["Budget"],"responses":{"204":{"description":"Budget resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Budget resource.","description":"Removes the Budget resource.","parameters":[{"name":"ulid","in":"path","description":"Budget identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1project-budgets_ulid_patch","tags":["Budget"],"responses":{"200":{"description":"Budget resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget-budget.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Budget.jsonld-budget.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Budget resource.","description":"Updates the Budget resource.","parameters":[{"name":"ulid","in":"path","description":"Budget identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Budget resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Budget-budget.write.jsonMergePatch"}}},"required":true}}},"/api/v1/budget-summary":{"get":{"operationId":"api_v1budget-summary_get_collection","tags":["BudgetSummary"],"responses":{"200":{"description":"BudgetSummary collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BudgetSummary-budget_summary.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BudgetSummary.jsonld-budget_summary.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BudgetSummary.jsonld-budget_summary.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BudgetSummary resources.","description":"Retrieves the collection of BudgetSummary resources.","parameters":[{"name":"level","in":"query","description":"Budget-Ebene (project|workitem|customer|contract)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"true = nur aktive, false = nur inaktive Budgets","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"targetId","in":"query","description":"Bezugsobjekt des Budgets (ID, exakter Match; zusammen mit level zu verwenden)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Budget-Namen (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/builder/block-types":{"get":{"operationId":"api_v1builderblock-types_get_collection","tags":["BuilderBlockType"],"responses":{"200":{"description":"BuilderBlockType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderBlockType-builder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderBlockType.jsonld-builder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderBlockType.jsonld-builder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Baustein-Palette des Editors","description":"Alle registrierten Baustein-Typen mit settingsSchema, sortiert nach Kategorie/Label.","parameters":[]}},"/api/v1/builder/pages/{ulid}/canvas":{"post":{"operationId":"builder_page_canvas","tags":["BuilderCanvas"],"responses":{"201":{"description":"BuilderCanvas resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderCanvas-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderCanvas.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Entwurfs-Baum fuer den Live-Canvas rendern","description":"Payload `{blocks, locale?}`. Antwort `{html, baseCss, themeCss, islands, warnings, usedBlockTypes}` — Rumpf-Fragment ohne Dokument-Rahmen, ohne DB-Schreiben.\n\n`baseCss`/`themeCss` sind je Sitzung stabil; die Element-Regeln kompiliert der Editor selbst.","parameters":[{"name":"ulid","in":"path","description":"BuilderCanvas identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BuilderCanvas resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderCanvas"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderCanvas"}}},"required":true}}},"/api/v1/builder/collection-sources":{"get":{"operationId":"api_v1buildercollection-sources_get_collection","tags":["BuilderCollectionSource"],"responses":{"200":{"description":"BuilderCollectionSource collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderCollectionSource-builder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderCollectionSource.jsonld-builder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderCollectionSource.jsonld-builder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Listen-Quellen des Baukastens","description":"Je Quelle: `key`, `label`, `group`, Feld-Schema (`fields[]` mit `key/label/type/island/refSource`), `sortableFields[]` und `supportsDetailUrl`. `island: true` heißt: der Wert wird nie eingebacken, sondern live nachgeladen.","parameters":[{"name":"siteUlid","in":"query","description":"Site, deren Collections als Quellen angeboten werden","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-Kontext der Fläche","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"pageUlid","in":"query","description":"Builder-Fläche — der Aufsatz löst daraus seine Site auf (Editor-Weg)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/builder/collection-source-items":{"get":{"operationId":"api_v1buildercollection-source-items_get_collection","tags":["BuilderCollectionSourceItem"],"responses":{"200":{"description":"BuilderCollectionSourceItem collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderCollectionSourceItem-builder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderCollectionSourceItem.jsonld-builder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderCollectionSourceItem.jsonld-builder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einträge einer Listen-Quelle (für kuratierte Listen)","description":"Auswahl-Paare `{id, label}` für den `idIn`-Eintrags-Wähler; maximal 50, nur Veröffentlichtes.","parameters":[{"name":"source","in":"query","description":"Quellen-Schlüssel (Pflicht), z. B. site.collection:<ulid> oder site.posts","required":true,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Site-Kontext der Quelle","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"pageUlid","in":"query","description":"Builder-Fläche — der Aufsatz löst daraus seine Site auf (Editor-Weg)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-Kontext der Fläche","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche im Anzeige-Feld der Quelle","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/builder/dynamic-sources":{"get":{"operationId":"api_v1builderdynamic-sources_get_collection","tags":["BuilderDynamicSource"],"responses":{"200":{"description":"BuilderDynamicSource collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderDynamicSource-builder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderDynamicSource.jsonld-builder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderDynamicSource.jsonld-builder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BuilderDynamicSource resources.","description":"Retrieves the collection of BuilderDynamicSource resources.","parameters":[]}},"/api/v1/builder/dynamic-sources/{key}":{"get":{"operationId":"api_v1builderdynamic-sources_key_get","tags":["BuilderDynamicSource"],"responses":{"200":{"description":"BuilderDynamicSource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderDynamicSource-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderDynamicSource.jsonld-builder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BuilderDynamicSource resource.","description":"Retrieves a BuilderDynamicSource resource.","parameters":[{"name":"key","in":"path","description":"BuilderDynamicSource identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/builder/library-items/{ulid}/export":{"get":{"operationId":"api_v1builderlibrary-items_ulidexport_get","tags":["BuilderLibraryExport"],"responses":{"200":{"description":"BuilderLibraryExport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryExport-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryExport.jsonld-builder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bibliotheks-Eintrag exportieren","description":"Portables Format `{format: \"octibuilder-library@1\", name, kind, tags, blocks}` (+ `propsSchema`/`slots` bei kind=component) — 1:1 wieder importierbar.","parameters":[{"name":"ulid","in":"path","description":"BuilderLibraryExport identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/builder/library-items":{"get":{"operationId":"api_v1builderlibrary-items_get_collection","tags":["BuilderLibraryItem"],"responses":{"200":{"description":"BuilderLibraryItem collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.list"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderLibraryItem.jsonld-builder.list collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderLibraryItem.jsonld-builder.list"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BuilderLibraryItem resources.","description":"Retrieves the collection of BuilderLibraryItem resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"kind","in":"query","description":"Nur Eintraege dieser Art (section|page|global)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche im Namen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1builderlibrary-items_post","tags":["BuilderLibraryItem"],"responses":{"201":{"description":"BuilderLibraryItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bibliotheks-Eintrag anlegen","description":"Pflicht sind `name` und `kind` (section|page|global|component). `blocksJson` ist der gespeicherte Baum; Komponenten tragen zusaetzlich `propsSchema` (text|richtext|image|link|color|visibility) und `slots` (Doc 37 §7.6).","parameters":[],"requestBody":{"description":"The new BuilderLibraryItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.write"}}},"required":true}}},"/api/v1/builder/library-items/import":{"post":{"operationId":"builder_library_import","tags":["BuilderLibraryItem"],"responses":{"201":{"description":"BuilderLibraryItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bibliotheks-Eintrag importieren","description":"Payload = Export-Format `{format: \"octibuilder-library@1\", name, kind, tags?, blocks}` (+ optional `brandId`). Die Herkunft wird in `externalRefs.import` festgehalten.","parameters":[],"requestBody":{"description":"The new BuilderLibraryItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.write"}}},"required":true}}},"/api/v1/builder/library-items/{ulid}":{"get":{"operationId":"api_v1builderlibrary-items_ulid_get","tags":["BuilderLibraryItem"],"responses":{"200":{"description":"BuilderLibraryItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem.jsonld-builder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BuilderLibraryItem resource.","description":"Retrieves a BuilderLibraryItem resource.","parameters":[{"name":"ulid","in":"path","description":"BuilderLibraryItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1builderlibrary-items_ulid_delete","tags":["BuilderLibraryItem"],"responses":{"204":{"description":"BuilderLibraryItem resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the BuilderLibraryItem resource.","description":"Removes the BuilderLibraryItem resource.","parameters":[{"name":"ulid","in":"path","description":"BuilderLibraryItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1builderlibrary-items_ulid_patch","tags":["BuilderLibraryItem"],"responses":{"200":{"description":"BuilderLibraryItem resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bibliotheks-Eintrag aendern","description":"Bei `kind: global` und `kind: component` werden nach dem Speichern alle aktiven Releases, die das Element verwenden, aus ihrem eingefrorenen Baum neu gebaut („einmal aendern, ueberall wirksam\").","parameters":[{"name":"ulid","in":"path","description":"BuilderLibraryItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BuilderLibraryItem resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BuilderLibraryItem-builder.write.jsonMergePatch"}}},"required":true}}},"/api/v1/builder/pages":{"get":{"operationId":"api_v1builderpages_get_collection","tags":["BuilderPage"],"responses":{"200":{"description":"BuilderPage collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderPage-builder.list"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderPage.jsonld-builder.list collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderPage.jsonld-builder.list"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BuilderPage resources.","description":"Retrieves the collection of BuilderPage resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"kind","in":"query","description":"Nur Flaechen dieser Art (page|template|popup|section)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"templateKind","in":"query","description":"Nur Vorlagen dieser Vorlagen-Art (header|footer|page|…)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche im Namen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach letzter Aenderung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1builderpages_post","tags":["BuilderPage"],"responses":{"201":{"description":"BuilderPage resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderPage.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Flaeche anlegen","description":"Pflicht ist `name`; `kind` (Default page) bestimmt die Flaechen-Art. `kind: template` braucht zusaetzlich `builder.template.manage`, `kind: popup` zusaetzlich `builder.popup.manage`. Der Entwurfs-Baum wird per PATCH (`blocks`) geschrieben.","parameters":[],"requestBody":{"description":"The new BuilderPage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.write"}}},"required":true}}},"/api/v1/builder/pages/{ulid}":{"get":{"operationId":"api_v1builderpages_ulid_get","tags":["BuilderPage"],"responses":{"200":{"description":"BuilderPage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderPage.jsonld-builder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BuilderPage resource.","description":"Retrieves a BuilderPage resource.","parameters":[{"name":"ulid","in":"path","description":"BuilderPage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1builderpages_ulid_delete","tags":["BuilderPage"],"responses":{"204":{"description":"BuilderPage resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the BuilderPage resource.","description":"Removes the BuilderPage resource.","parameters":[{"name":"ulid","in":"path","description":"BuilderPage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1builderpages_ulid_patch","tags":["BuilderPage"],"responses":{"200":{"description":"BuilderPage resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderPage.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Flaeche aendern (Inhalt, SEO, Theme, Entwurfs-Baum)","description":"`blocks` schreibt den ENTWURFS-Baum: ohne `builder.style.edit` sind nur Inhalts-Werte bestehender Bausteine aenderbar, ohne `builder.lock.override` muessen gesperrte Teilbaeume unveraendert bleiben (403 mit Verstoss-Code). Veroeffentlicht wird separat ueber `/publish`.","parameters":[{"name":"ulid","in":"path","description":"BuilderPage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BuilderPage resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.write.jsonMergePatch"}}},"required":true}}},"/api/v1/builder/pages/{ulid}/duplicate":{"post":{"operationId":"builder_page_duplicate","tags":["BuilderPage"],"responses":{"201":{"description":"BuilderPage resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderPage.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Flaeche duplizieren (inkl. Entwurfs-Baum und SEO)","description":"Payload `{name?}`; ohne `name` erhaelt die Kopie das Suffix „ (Kopie)\". Kopiert werden Entwurfs-Baum, SEO-Felder, Theme-Zuordnung und kind-Konfiguration — Releases nicht (die Kopie ist ein Entwurf).","parameters":[{"name":"ulid","in":"path","description":"BuilderPage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BuilderPage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderPage-builder.write"}}},"required":true}}},"/api/v1/builder/pages/{ulid}/audit":{"get":{"operationId":"api_v1builderpages_ulidaudit_get","tags":["BuilderPageAudit"],"responses":{"200":{"description":"BuilderPageAudit resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderPageAudit-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderPageAudit.jsonld-builder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Pruefhinweise des Entwurfs","description":"Befunde ueber den ENTWURFS-Baum + Theme-Token: `{findings: [{severity, code, blockId, context}]}`. Das Publizieren blockieren sie nicht (Gestaltungsfreiheit).","parameters":[{"name":"ulid","in":"path","description":"BuilderPageAudit identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/builder/pages/{ulid}/preview":{"get":{"operationId":"api_v1builderpages_ulidpreview_get","tags":["BuilderPagePreview"],"responses":{"200":{"description":"BuilderPagePreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderPagePreview-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderPagePreview.jsonld-builder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"HTML-Vorschau des Entwurfs","description":"Antwort `{html}` — komplettes Dokument (Head + Theme-CSS + Rumpf), ohne Kopf-/Fussvorlage, ohne DB-Schreiben.","parameters":[{"name":"ulid","in":"path","description":"BuilderPagePreview identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"locale","in":"query","description":"Vorschau in dieser Ziel-Sprache (ENT-BUILDER-12), z. B. en","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/builder/pages/{ulid}/publish":{"post":{"operationId":"builder_page_publish","tags":["BuilderRelease"],"responses":{"201":{"description":"BuilderRelease resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderRelease-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderRelease.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Veroeffentlichen (sofort oder geplant)","description":"Payload `{scheduledFor?: ISO-8601}`. Ohne `scheduledFor` wird der Entwurf JETZT gebaut und aktiviert; mit `scheduledFor` (Zukunft) wird das Erzeugnis sofort eingefroren und zum Zeitpunkt aktiviert — eine neue Planung ersetzt eine bestehende.","parameters":[{"name":"ulid","in":"path","description":"BuilderRelease identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BuilderRelease resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderRelease"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderRelease"}}},"required":true}}},"/api/v1/builder/pages/{ulid}/releases":{"get":{"operationId":"api_v1builderpages_ulidreleases_get_collection","tags":["BuilderRelease"],"responses":{"200":{"description":"BuilderRelease collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderRelease-builder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderRelease.jsonld-builder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderRelease.jsonld-builder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BuilderRelease resources.","description":"Retrieves the collection of BuilderRelease resources.","parameters":[{"name":"ulid","in":"path","description":"BuilderRelease identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/builder/pages/{ulid}/rollback":{"post":{"operationId":"builder_page_rollback","tags":["BuilderRelease"],"responses":{"201":{"description":"BuilderRelease resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderRelease-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderRelease.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Auf ein aelteres Release zurueckrollen","description":"Payload `{releaseUlid}`. Das Release muss zu dieser Flaeche gehoeren (sonst 404); es wird OHNE Re-Render wieder das aktive Erzeugnis.","parameters":[{"name":"ulid","in":"path","description":"BuilderRelease identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BuilderRelease resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderRelease"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderRelease"}}},"required":true}}},"/api/v1/builder/pages/{ulid}/unpublish":{"post":{"operationId":"builder_page_unpublish","tags":["BuilderRelease"],"responses":{"201":{"description":"BuilderRelease resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderRelease-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderRelease.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Von der Auslieferung nehmen","description":"Entwurf und Historie bleiben unberuehrt; ohne aktives Release 409.","parameters":[{"name":"ulid","in":"path","description":"BuilderRelease identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BuilderRelease resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderRelease"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderRelease"}}},"required":true}}},"/api/v1/builder/style-classes":{"get":{"operationId":"api_v1builderstyle-classes_get_collection","tags":["BuilderStyleClass"],"responses":{"200":{"description":"BuilderStyleClass collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderStyleClass-builder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderStyleClass.jsonld-builder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderStyleClass.jsonld-builder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Stil-Klassen","description":"Benannte Klassen (`class`) und Tag-Grundstile (`tag`). `comboParents` macht eine Klasse zur Kombi-Klasse.","parameters":[{"name":"brandId","in":"query","description":"Nur Klassen dieser Marke (plus markenübergreifende)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"kind","in":"query","description":"class | tag","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche in Name und Slug","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1builderstyle-classes_post","tags":["BuilderStyleClass"],"responses":{"201":{"description":"BuilderStyleClass resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BuilderStyleClass resource.","description":"Creates a BuilderStyleClass resource.","parameters":[],"requestBody":{"description":"The new BuilderStyleClass resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass-builder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass-builder.write"}}},"required":true}}},"/api/v1/builder/style-classes/{ulid}":{"get":{"operationId":"api_v1builderstyle-classes_ulid_get","tags":["BuilderStyleClass"],"responses":{"200":{"description":"BuilderStyleClass resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass.jsonld-builder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BuilderStyleClass resource.","description":"Retrieves a BuilderStyleClass resource.","parameters":[{"name":"ulid","in":"path","description":"BuilderStyleClass identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1builderstyle-classes_ulid_delete","tags":["BuilderStyleClass"],"responses":{"204":{"description":"BuilderStyleClass resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Stil-Klasse löschen","description":"Soft-Delete. Flächen, die sie referenzieren, rendern danach ohne sie weiter — die Referenz fällt still weg (fail-safe).","parameters":[{"name":"ulid","in":"path","description":"BuilderStyleClass identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1builderstyle-classes_ulid_patch","tags":["BuilderStyleClass"],"responses":{"200":{"description":"BuilderStyleClass resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the BuilderStyleClass resource.","description":"Updates the BuilderStyleClass resource.","parameters":[{"name":"ulid","in":"path","description":"BuilderStyleClass identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BuilderStyleClass resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BuilderStyleClass-builder.write.jsonMergePatch"}}},"required":true}}},"/api/v1/builder/themes":{"get":{"operationId":"api_v1builderthemes_get_collection","tags":["BuilderTheme"],"responses":{"200":{"description":"BuilderTheme collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderTheme-builder.list"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderTheme.jsonld-builder.list collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderTheme.jsonld-builder.list"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BuilderTheme resources.","description":"Retrieves the collection of BuilderTheme resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1builderthemes_post","tags":["BuilderTheme"],"responses":{"201":{"description":"BuilderTheme resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderTheme.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Theme anlegen","description":"Pflicht ist `name`. `isDefault: true` macht dieses Theme zum Standard seiner Marke und nimmt anderen Themes derselben Marke den Default.","parameters":[],"requestBody":{"description":"The new BuilderTheme resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.write"}}},"required":true}}},"/api/v1/builder/themes/{ulid}":{"get":{"operationId":"api_v1builderthemes_ulid_get","tags":["BuilderTheme"],"responses":{"200":{"description":"BuilderTheme resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderTheme.jsonld-builder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BuilderTheme resource.","description":"Retrieves a BuilderTheme resource.","parameters":[{"name":"ulid","in":"path","description":"BuilderTheme identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1builderthemes_ulid_delete","tags":["BuilderTheme"],"responses":{"204":{"description":"BuilderTheme resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the BuilderTheme resource.","description":"Removes the BuilderTheme resource.","parameters":[{"name":"ulid","in":"path","description":"BuilderTheme identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1builderthemes_ulid_patch","tags":["BuilderTheme"],"responses":{"200":{"description":"BuilderTheme resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderTheme.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Theme aendern (versioniert)","description":"Vor JEDEM Update wird der alte Stand als BuilderThemeVersion (versionNo = bisherige cssVersion) festgehalten, danach hebt `cssVersion` (Cache-Busting, ENT-BUILDER-10).","parameters":[{"name":"ulid","in":"path","description":"BuilderTheme identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BuilderTheme resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.write.jsonMergePatch"}}},"required":true}}},"/api/v1/builder/themes/{ulid}/restore":{"post":{"operationId":"builder_theme_restore","tags":["BuilderTheme"],"responses":{"201":{"description":"BuilderTheme resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderTheme.jsonld-builder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Alten Theme-Stand wiederherstellen","description":"Payload `{versionNo}`. Der aktuelle Stand wird als NEUE Version festgehalten (lueckenlose Historie), dann der alte Stand ins Theme kopiert und `cssVersion` gehoben.","parameters":[{"name":"ulid","in":"path","description":"BuilderTheme identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new BuilderTheme resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BuilderTheme-builder.write"}}},"required":true}}},"/api/v1/builder/themes/{ulid}/versions":{"get":{"operationId":"api_v1builderthemes_ulidversions_get_collection","tags":["BuilderThemeVersion"],"responses":{"200":{"description":"BuilderThemeVersion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BuilderThemeVersion-builder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BuilderThemeVersion.jsonld-builder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BuilderThemeVersion.jsonld-builder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Versions-Historie des Themes","description":"Alle festgehaltenen Staende, neueste zuerst — jede Aenderung am Theme hinterlaesst genau eine Zeile.","parameters":[{"name":"ulid","in":"path","description":"BuilderThemeVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/ticket-business-hours":{"get":{"operationId":"api_v1ticket-business-hours_get_collection","tags":["BusinessHours"],"responses":{"200":{"description":"BusinessHours collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BusinessHours-business_hours.read"}}},"application/ld+json":{"schema":{"type":"object","description":"BusinessHours.jsonld-business_hours.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/BusinessHours.jsonld-business_hours.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of BusinessHours resources.","description":"Retrieves the collection of BusinessHours resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-business-hours_post","tags":["BusinessHours"],"responses":{"201":{"description":"BusinessHours resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessHours-business_hours.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BusinessHours.jsonld-business_hours.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a BusinessHours resource.","description":"Creates a BusinessHours resource.","parameters":[],"requestBody":{"description":"The new BusinessHours resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessHours-business_hours.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BusinessHours-business_hours.write"}}},"required":true}}},"/api/v1/ticket-business-hours/{key}":{"get":{"operationId":"api_v1ticket-business-hours_key_get","tags":["BusinessHours"],"responses":{"200":{"description":"BusinessHours resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessHours-business_hours.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BusinessHours.jsonld-business_hours.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a BusinessHours resource.","description":"Retrieves a BusinessHours resource.","parameters":[{"name":"key","in":"path","description":"BusinessHours identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-business-hours_key_delete","tags":["BusinessHours"],"responses":{"204":{"description":"BusinessHours resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the BusinessHours resource.","description":"Removes the BusinessHours resource.","parameters":[{"name":"key","in":"path","description":"BusinessHours identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-business-hours_key_patch","tags":["BusinessHours"],"responses":{"200":{"description":"BusinessHours resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessHours-business_hours.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/BusinessHours.jsonld-business_hours.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the BusinessHours resource.","description":"Updates the BusinessHours resource.","parameters":[{"name":"key","in":"path","description":"BusinessHours identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated BusinessHours resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/BusinessHours-business_hours.update.jsonMergePatch"}}},"required":true}}},"/api/v1/canned-responses":{"get":{"operationId":"api_v1canned-responses_get_collection","tags":["CannedResponse"],"responses":{"200":{"description":"CannedResponse collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CannedResponse-canned.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CannedResponse.jsonld-canned.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CannedResponse.jsonld-canned.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CannedResponse resources.","description":"Retrieves the collection of CannedResponse resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1canned-responses_post","tags":["CannedResponse"],"responses":{"201":{"description":"CannedResponse resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CannedResponse-canned.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CannedResponse.jsonld-canned.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CannedResponse resource.","description":"Creates a CannedResponse resource.","parameters":[],"requestBody":{"description":"The new CannedResponse resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CannedResponse-canned.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CannedResponse-canned.write"}}},"required":true}}},"/api/v1/canned-responses/{ulid}":{"get":{"operationId":"api_v1canned-responses_ulid_get","tags":["CannedResponse"],"responses":{"200":{"description":"CannedResponse resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CannedResponse-canned.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CannedResponse.jsonld-canned.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CannedResponse resource.","description":"Retrieves a CannedResponse resource.","parameters":[{"name":"ulid","in":"path","description":"CannedResponse identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1canned-responses_ulid_delete","tags":["CannedResponse"],"responses":{"204":{"description":"CannedResponse resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CannedResponse resource.","description":"Removes the CannedResponse resource.","parameters":[{"name":"ulid","in":"path","description":"CannedResponse identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1canned-responses_ulid_patch","tags":["CannedResponse"],"responses":{"200":{"description":"CannedResponse resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CannedResponse-canned.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CannedResponse.jsonld-canned.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CannedResponse resource.","description":"Updates the CannedResponse resource.","parameters":[{"name":"ulid","in":"path","description":"CannedResponse identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CannedResponse resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CannedResponse-canned.write.jsonMergePatch"}}},"required":true}}},"/api/v1/capacity":{"get":{"operationId":"api_v1capacity_get_collection","tags":["Capacity"],"responses":{"200":{"description":"Capacity collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Capacity-capacity.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Capacity.jsonld-capacity.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Capacity.jsonld-capacity.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Capacity resources.","description":"Retrieves the collection of Capacity resources.","parameters":[{"name":"from","in":"query","description":"Zeitraum-Beginn (Default: Montag der laufenden Woche)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende (Default: from + 12 Wochen)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"granularity","in":"query","description":"Perioden-Raster (Default: week)","required":false,"deprecated":false,"schema":{"type":"string","enum":["day","week","month"]},"style":"form","explode":true},{"name":"includeFreelancers","in":"query","description":"Freelancer einbeziehen (Default: true; 0 blendet sie aus)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (nur innerhalb des eigenen Marken-Scopes zulässig)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Auf eine Person eingrenzen (Mitarbeiter-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/channels/connector-types":{"get":{"operationId":"api_v1channelsconnector-types_get_collection","tags":["ChannelConnectorType"],"responses":{"200":{"description":"ChannelConnectorType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChannelConnectorType-channel_connector_type.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ChannelConnectorType.jsonld-channel_connector_type.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ChannelConnectorType.jsonld-channel_connector_type.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ChannelConnectorType resources.","description":"Alle verfügbaren Kanal-Konnektoren mit Fähigkeiten und Konfigurationsfeldern. Konnektoren deaktivierter Plugins fehlen hier.","parameters":[]}},"/api/v1/channels/listings":{"get":{"operationId":"api_v1channelslistings_get_collection","tags":["ChannelListing"],"responses":{"200":{"description":"ChannelListing collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChannelListing-channel_listing.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ChannelListing.jsonld-channel_listing.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ChannelListing.jsonld-channel_listing.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ChannelListing resources.","description":"Retrieves the collection of ChannelListing resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"channelUlid","in":"query","description":"Nur Angebote dieses Kanals","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"draft|published|error|unpublished","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"productId","in":"query","description":"Nur Angebote dieses Artikels (über alle Kanäle)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1channelslistings_post","tags":["ChannelListing"],"responses":{"201":{"description":"ChannelListing resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ChannelListing.jsonld-channel_listing.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ChannelListing resource.","description":"Stellt einen Artikel in einen Kanal. `overrides` trägt NUR, was im Kanal anders ist — alles Ungesetzte kommt aus dem Artikel. Ein Artikel steht je Kanal genau einmal.","parameters":[],"requestBody":{"description":"The new ChannelListing resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.write"}}},"required":true}}},"/api/v1/channels/listings/{ulid}":{"get":{"operationId":"api_v1channelslistings_ulid_get","tags":["ChannelListing"],"responses":{"200":{"description":"ChannelListing resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ChannelListing.jsonld-channel_listing.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ChannelListing resource.","description":"Retrieves a ChannelListing resource.","parameters":[{"name":"ulid","in":"path","description":"ChannelListing identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1channelslistings_ulid_delete","tags":["ChannelListing"],"responses":{"204":{"description":"ChannelListing resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ChannelListing resource.","description":"Removes the ChannelListing resource.","parameters":[{"name":"ulid","in":"path","description":"ChannelListing identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1channelslistings_ulid_patch","tags":["ChannelListing"],"responses":{"200":{"description":"ChannelListing resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ChannelListing.jsonld-channel_listing.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ChannelListing resource.","description":"Updates the ChannelListing resource.","parameters":[{"name":"ulid","in":"path","description":"ChannelListing identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ChannelListing resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.write.jsonMergePatch"}}},"required":true}}},"/api/v1/channels/listings/{ulid}/republish":{"post":{"operationId":"channels_listing_republish","tags":["ChannelListing"],"responses":{"201":{"description":"ChannelListing resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ChannelListing.jsonld-channel_listing.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Angebot wieder in die Kanal-Läufe aufnehmen","description":"Nimmt das Angebot wieder in die Läufe auf (Zustand `draft`) und verwirft den Fingerabdruck, damit der nächste Lauf es sicher sendet.","parameters":[{"name":"ulid","in":"path","description":"ChannelListing identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ChannelListing resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.write"}}},"required":true}}},"/api/v1/channels/listings/{ulid}/unpublish":{"post":{"operationId":"channels_listing_unpublish","tags":["ChannelListing"],"responses":{"201":{"description":"ChannelListing resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ChannelListing.jsonld-channel_listing.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Angebot im Kanal zurückziehen","description":"Zieht das Angebot zurück: es wird von künftigen Läufen übersprungen. Der Eintrag bleibt stehen — ihn zu löschen nähme die Kennung im Fremdsystem mit, an der eingehende Bestellungen hängen.","parameters":[{"name":"ulid","in":"path","description":"ChannelListing identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ChannelListing resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ChannelListing-channel_listing.write"}}},"required":true}}},"/api/v1/wms/clarification-cases":{"get":{"operationId":"api_v1wmsclarification-cases_get_collection","tags":["ClarificationCase"],"responses":{"200":{"description":"ClarificationCase collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClarificationCase-clarification_case.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ClarificationCase.jsonld-clarification_case.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ClarificationCase.jsonld-clarification_case.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ClarificationCase resources.","description":"Retrieves the collection of ClarificationCase resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"open|resolved","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"reason","in":"query","description":"shortage|not_found|damaged|expired|skipped","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"orderId","in":"query","description":"Auftrags-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/wms/clarification-cases/{ulid}":{"get":{"operationId":"api_v1wmsclarification-cases_ulid_get","tags":["ClarificationCase"],"responses":{"200":{"description":"ClarificationCase resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClarificationCase-clarification_case.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ClarificationCase.jsonld-clarification_case.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ClarificationCase resource.","description":"Retrieves a ClarificationCase resource.","parameters":[{"name":"ulid","in":"path","description":"ClarificationCase identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/wms/clarification-cases/{ulid}/resolve":{"post":{"operationId":"wms_clarification_case_resolve","tags":["ClarificationCase"],"responses":{"201":{"description":"ClarificationCase resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClarificationCase-clarification_case.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ClarificationCase.jsonld-clarification_case.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Klärfall abschließen","description":"Payload `{resolution}` — wie der Fall aufgelöst wurde. Einmalig: ein zweiter Aufruf wäre eine stille Überschreibung der Begründung.","parameters":[{"name":"ulid","in":"path","description":"ClarificationCase identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ClarificationCase resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClarificationCase-clarification_case.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ClarificationCase-clarification_case.write"}}},"required":true}}},"/api/v1/communications":{"get":{"operationId":"api_v1communications_get_collection","tags":["Communication"],"responses":{"200":{"description":"Communication collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Communication-communication.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Communication.jsonld-communication.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Communication.jsonld-communication.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Communication resources.","description":"Retrieves the collection of Communication resources.","parameters":[{"name":"subjectType","in":"query","description":"Subjekt-Typ des Threads. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"subjectId","in":"query","description":"Subjekt-Kennung des Threads. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"visibility","in":"query","description":"Sichtbarkeit (exakter Match, z.B. internal|customer)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1communications_post","tags":["Communication"],"responses":{"201":{"description":"Communication resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Communication-communication.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Communication.jsonld-communication.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Communication resource.","description":"Creates a Communication resource.","parameters":[],"requestBody":{"description":"The new Communication resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Communication-communication.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Communication-communication.write"}}},"required":true}}},"/api/v1/communications/{ulid}":{"get":{"operationId":"api_v1communications_ulid_get","tags":["Communication"],"responses":{"200":{"description":"Communication resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Communication-communication.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Communication.jsonld-communication.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Communication resource.","description":"Retrieves a Communication resource.","parameters":[{"name":"ulid","in":"path","description":"Communication identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1communications_ulid_delete","tags":["Communication"],"responses":{"204":{"description":"Communication resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Communication resource.","description":"Removes the Communication resource.","parameters":[{"name":"ulid","in":"path","description":"Communication identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1communications_ulid_patch","tags":["Communication"],"responses":{"200":{"description":"Communication resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Communication-communication.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Communication.jsonld-communication.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Communication resource.","description":"Updates the Communication resource.","parameters":[{"name":"ulid","in":"path","description":"Communication identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Communication resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Communication-communication.write.jsonMergePatch"}}},"required":true}}},"/api/v1/communications/{ulid}/reactions":{"post":{"operationId":"communication_reaction_toggle","tags":["Communication"],"responses":{"201":{"description":"Communication resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Communication-communication.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Communication.jsonld-communication.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Emoji-Reaktion umschalten","description":"Schaltet die Emoji-Reaktion des aufrufenden Nutzers am Beitrag um (an/aus) und benachrichtigt beim Setzen den Autor. `emoji` ist Pflicht, höchstens 8 Zeichen.","parameters":[{"name":"ulid","in":"path","description":"Communication identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Communication resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Communication-communication.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Communication-communication.write"}}},"required":true}}},"/api/v1/connect/auth-methods":{"get":{"operationId":"api_v1connectauth-methods_get_collection","tags":["ConnectAuthMethod"],"responses":{"200":{"description":"ConnectAuthMethod collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectAuthMethod-connect_auth_method.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectAuthMethod.jsonld-connect_auth_method.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectAuthMethod.jsonld-connect_auth_method.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectAuthMethod resources.","description":"Alle verfügbaren Anmelde-Arten für ausgehende Aufrufe mit ihren Konfigurationsfeldern und den erwarteten Geheimnis-Schlüsseln.","parameters":[]}},"/api/v1/connect/flows":{"get":{"operationId":"api_v1connectflows_get_collection","tags":["ConnectFlow"],"responses":{"200":{"description":"ConnectFlow collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectFlow.jsonld-connect_flow.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectFlow resources.","description":"Retrieves the collection of ConnectFlow resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Flows","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"triggerType","in":"query","description":"Trigger-Art event|cron|webhook|manual|polling (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Schlüssel und Name","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1connectflows_post","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ConnectFlow resource.","description":"Legt einen Flow an. `nodes` beschreibt den Bauplan; jeder Baustein braucht `nodeKey`, `type` und `label`. Ein Flow wird INAKTIV angelegt — aktiv wird er erst über `activate`, und das prüft ihn.","parameters":[],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/import":{"post":{"operationId":"connect_flow_import","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ConnectFlow resource.","description":"Liest ein Bündel ein. IDEMPOTENT über `flowKey`: zweimal dasselbe Bündel ergibt denselben Zustand, nicht zwei Flows. Der Flow entsteht bzw. bleibt INAKTIV. Optional `flowKey` als abweichender Zielschlüssel (Kopie).","parameters":[],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/run-scheduled":{"post":{"operationId":"connect_flow_run_scheduled","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.ConnectScheduledRunResult-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.ConnectScheduledRunResult.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Fällige Zeitplan- und Abruf-Flows jetzt starten","description":"Fährt EINEN Durchgang über alles Fällige — genau den, den der Minuten-Tick des Systems fährt (Zeitplan-Flows nach Cron-Ausdruck, Abruf-Flows nach Takt und Wasserstand). Ohne diesen Weg wäre die Kernfähigkeit des Hubs nur über die Konsole erreichbar. Antwort: `startedFlowKeys`. Geschnitten wird an `connect.flow.execute` JE MARKE — ein fälliger Flow einer fremden Marke bleibt stehen.","parameters":[],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/{ulid}":{"get":{"operationId":"api_v1connectflows_ulid_get","tags":["ConnectFlow"],"responses":{"200":{"description":"ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ConnectFlow resource.","description":"Retrieves a ConnectFlow resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1connectflows_ulid_delete","tags":["ConnectFlow"],"responses":{"204":{"description":"ConnectFlow resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ConnectFlow resource.","description":"Removes the ConnectFlow resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1connectflows_ulid_patch","tags":["ConnectFlow"],"responses":{"200":{"description":"ConnectFlow resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ConnectFlow resource.","description":"Ändert einen Flow. Mitgesendete `nodes` ERSETZEN den Bauplan vollständig.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ConnectFlow resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write.jsonMergePatch"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/activate":{"post":{"operationId":"connect_flow_activate","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Activate flow","description":"Activate flow. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/deactivate":{"post":{"operationId":"connect_flow_deactivate","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Deactivate flow","description":"Deactivate flow. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/export":{"get":{"operationId":"connect_flow_export","tags":["ConnectFlow"],"responses":{"200":{"description":"ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ConnectFlow resource.","description":"Exportiert den Flow als Bündel (`bundle`) inklusive der benutzten Zuordnungen und Zuordnungstabellen. OHNE Webhook-Geheimnis, ohne ausführenden Benutzer, ohne Marke — die sind installations-eigen bzw. geheim. `bundle.requiredFlows` nennt Unter-Flows, die das Bündel NICHT mitbringt.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/connect/flows/{ulid}/nodes":{"post":{"operationId":"connect_flow_node_add","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einzelnen Baustein an den Flow anhängen","description":"Fügt EINEN Baustein hinzu, ohne den übrigen Bauplan zu senden. Feld `node` wie ein Eintrag in `nodes`; optional `after` (Baustein-Schlüssel) für die Verbindung davor.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/nodes/{nodeKey}":{"delete":{"operationId":"connect_flow_node_remove","tags":["ConnectFlow"],"responses":{"204":{"description":"ConnectFlow resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ConnectFlow resource.","description":"Entfernt EINEN Baustein samt seiner Verbindungen.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"nodeKey","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"connect_flow_node_update","tags":["ConnectFlow"],"responses":{"200":{"description":"ConnectFlow resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ConnectFlow resource.","description":"Ändert EINEN Baustein. Nur die gesendeten Felder von `node` werden übernommen — der übrige Bauplan bleibt unangetastet.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"nodeKey","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ConnectFlow resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write.jsonMergePatch"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/run":{"post":{"operationId":"connect_flow_run","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Flow asynchron starten","description":"Startet den Flow ASYNCHRON über die Queue. Nur bei aktivem Flow.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/test":{"post":{"operationId":"connect_flow_test","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Flow synchron testen","description":"Testlauf: SYNCHRON, ohne Queue, mit dem mitgegebenen `payload` als `{{trigger}}`. Erzeugt einen echten Lauf samt Journal — ein Testlauf ohne Journal hätte den halben Nutzen. Läuft auch bei inaktivem Flow.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/test-until/{nodeKey}":{"post":{"operationId":"connect_flow_test_until","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ConnectFlow resource.","description":"Testlauf BIS EINSCHLIESSLICH eines Bausteins — der Rest der Kette bleibt stehen. Beim Bauen der Unterschied zwischen Probieren und Auslösen: der Versand dahinter passiert nicht.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"nodeKey","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/validate":{"post":{"operationId":"connect_flow_validate","tags":["ConnectFlow"],"responses":{"201":{"description":"ConnectFlow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow.jsonld-connect_flow.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bauplan des Flows prüfen","description":"Prüft den Bauplan, ohne ihn zu ändern: Trigger vollständig, Baustein-Typen bekannt, Schlüssel eindeutig, Pflichtfelder gesetzt. Antwort: `valid` + `errors`.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectFlow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlow-connect_flow.write"}}},"required":true}}},"/api/v1/connect/flows/{ulid}/versions":{"get":{"operationId":"api_v1connectflows_ulidversions_get_collection","tags":["ConnectFlowVersion"],"responses":{"200":{"description":"ConnectFlowVersion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectFlowVersion-connect_flow_version.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectFlowVersion.jsonld-connect_flow_version.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectFlowVersion.jsonld-connect_flow_version.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectFlowVersion resources.","description":"Retrieves the collection of ConnectFlowVersion resources.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlowVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/connect/flows/{ulid}/versions/{versionNo}":{"get":{"operationId":"api_v1connectflows_ulidversions_versionNo_get","tags":["ConnectFlowVersion"],"responses":{"200":{"description":"ConnectFlowVersion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlowVersion-connect_flow_version.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlowVersion.jsonld-connect_flow_version.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ConnectFlowVersion resource.","description":"Eine Fassung mit vollständigem Bauplan-Schnappschuss — dieselbe Form wie ein Export-Bündel.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlowVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"versionNo","in":"path","description":"ConnectFlowVersion identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/connect/flows/{ulid}/versions/{versionNo}/restore":{"post":{"operationId":"connect_flow_version_restore","tags":["ConnectFlowVersion"],"responses":{"201":{"description":"ConnectFlowVersion resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlowVersion-connect_flow_version.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlowVersion.jsonld-connect_flow_version.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Restore version","description":"Restore version. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ConnectFlowVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"versionNo","in":"path","description":"ConnectFlowVersion identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectFlowVersion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFlowVersion"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectFlowVersion"}}},"required":true}}},"/api/v1/connect/lookup-tables":{"get":{"operationId":"api_v1connectlookup-tables_get_collection","tags":["ConnectLookupTable"],"responses":{"200":{"description":"ConnectLookupTable collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectLookupTable-connect_lookup.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectLookupTable.jsonld-connect_lookup.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectLookupTable.jsonld-connect_lookup.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectLookupTable resources.","description":"Retrieves the collection of ConnectLookupTable resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Schlüssel und Name","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1connectlookup-tables_post","tags":["ConnectLookupTable"],"responses":{"201":{"description":"ConnectLookupTable resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable-connect_lookup.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable.jsonld-connect_lookup.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ConnectLookupTable resource.","description":"`strict=true` macht einen unbekannten Fremdwert zum Fehler statt ihn durchzureichen — genau der Unterschied, der Bestellungen mit unbekannter Zahlart auffallen lässt.","parameters":[],"requestBody":{"description":"The new ConnectLookupTable resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable-connect_lookup.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable-connect_lookup.write"}}},"required":true}}},"/api/v1/connect/lookup-tables/{ulid}":{"get":{"operationId":"api_v1connectlookup-tables_ulid_get","tags":["ConnectLookupTable"],"responses":{"200":{"description":"ConnectLookupTable resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable-connect_lookup.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable.jsonld-connect_lookup.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ConnectLookupTable resource.","description":"Retrieves a ConnectLookupTable resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectLookupTable identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1connectlookup-tables_ulid_delete","tags":["ConnectLookupTable"],"responses":{"204":{"description":"ConnectLookupTable resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ConnectLookupTable resource.","description":"Removes the ConnectLookupTable resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectLookupTable identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1connectlookup-tables_ulid_patch","tags":["ConnectLookupTable"],"responses":{"200":{"description":"ConnectLookupTable resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable-connect_lookup.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable.jsonld-connect_lookup.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ConnectLookupTable resource.","description":"Updates the ConnectLookupTable resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectLookupTable identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ConnectLookupTable resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ConnectLookupTable-connect_lookup.write.jsonMergePatch"}}},"required":true}}},"/api/v1/connect/mappings":{"get":{"operationId":"api_v1connectmappings_get_collection","tags":["ConnectMapping"],"responses":{"200":{"description":"ConnectMapping collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectMapping.jsonld-connect_mapping.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectMapping.jsonld-connect_mapping.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectMapping resources.","description":"Retrieves the collection of ConnectMapping resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Schlüssel und Name","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1connectmappings_post","tags":["ConnectMapping"],"responses":{"201":{"description":"ConnectMapping resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectMapping.jsonld-connect_mapping.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ConnectMapping resource.","description":"Legt eine Zuordnung an. Je Regel: `target` (Punkt-Pfad in der Zielstruktur, `items.0.sku` legt Listen an), `source` (Ausdruck gegen `{{source.…}}`), optional `default`, `required`, `lookup`.","parameters":[],"requestBody":{"description":"The new ConnectMapping resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.write"}}},"required":true}}},"/api/v1/connect/mappings/{ulid}":{"get":{"operationId":"api_v1connectmappings_ulid_get","tags":["ConnectMapping"],"responses":{"200":{"description":"ConnectMapping resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectMapping.jsonld-connect_mapping.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ConnectMapping resource.","description":"Retrieves a ConnectMapping resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectMapping identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1connectmappings_ulid_delete","tags":["ConnectMapping"],"responses":{"204":{"description":"ConnectMapping resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ConnectMapping resource.","description":"Removes the ConnectMapping resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectMapping identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1connectmappings_ulid_patch","tags":["ConnectMapping"],"responses":{"200":{"description":"ConnectMapping resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectMapping.jsonld-connect_mapping.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ConnectMapping resource.","description":"Updates the ConnectMapping resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectMapping identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ConnectMapping resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.write.jsonMergePatch"}}},"required":true}}},"/api/v1/connect/mappings/{ulid}/preview":{"post":{"operationId":"connect_mapping_preview","tags":["ConnectMapping"],"responses":{"201":{"description":"ConnectMapping resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectMapping.jsonld-connect_mapping.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Feld-Zuordnung an einer Payload vorschauen","description":"Wendet die Zuordnung auf eine Payload an, ohne etwas zu ändern — `source` aus dem Aufruf, sonst die hinterlegte Beispiel-Payload. Antwort: `result` bzw. `errors`.","parameters":[{"name":"ulid","in":"path","description":"ConnectMapping identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectMapping resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectMapping-connect_mapping.write"}}},"required":true}}},"/api/v1/connect/node-groups":{"get":{"operationId":"api_v1connectnode-groups_get_collection","tags":["ConnectNodeGroup"],"responses":{"200":{"description":"ConnectNodeGroup collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectNodeGroup-connect_node_group.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectNodeGroup.jsonld-connect_node_group.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectNodeGroup.jsonld-connect_node_group.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectNodeGroup resources.","description":"Alle Baustein-Gruppen mit Hausfarbe, Symbol und Bildmarke. Eine Gruppe ist ein System („Shopware\", „DHL\", „Octibiz · Verkauf\"). Gruppen deaktivierter Plugins fehlen hier.","parameters":[]}},"/api/v1/connect/node-types":{"get":{"operationId":"api_v1connectnode-types_get_collection","tags":["ConnectNodeType"],"responses":{"200":{"description":"ConnectNodeType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectNodeType-connect_node_type.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectNodeType.jsonld-connect_node_type.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectNodeType.jsonld-connect_node_type.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectNodeType resources.","description":"Alle verfügbaren Baustein-Typen mit ihren Konfigurationsfeldern. Beiträge deaktivierter Plugins fehlen hier — ein abgeschalteter Konnektor darf nicht baubar aussehen.","parameters":[]}},"/api/v1/connect/runs":{"get":{"operationId":"api_v1connectruns_get_collection","tags":["ConnectRun"],"responses":{"200":{"description":"ConnectRun collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectRun-connect_run.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectRun.jsonld-connect_run.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectRun.jsonld-connect_run.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectRun resources.","description":"Retrieves the collection of ConnectRun resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"flowUlid","in":"query","description":"Nur Läufe dieses Flows","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"flowKey","in":"query","description":"Nur Läufe des Flows mit diesem Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"pending|running|completed|faulty (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"triggerSource","in":"query","description":"Womit der Lauf angestossen wurde (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[startedAt]","in":"query","description":"Sortierung nach Startzeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"order[finishedAt]","in":"query","description":"Sortierung nach Endzeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagezeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"order[triggerSource]","in":"query","description":"Sortierung nach Auslöser (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true}]}},"/api/v1/connect/runs/{ulid}":{"get":{"operationId":"api_v1connectruns_ulid_get","tags":["ConnectRun"],"responses":{"200":{"description":"ConnectRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRun-connect_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectRun.jsonld-connect_run.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ConnectRun resource.","description":"Ein Lauf mit allen Schritten — je Schritt Eingang, Ausgang, Fehler, Versuche und Dauer. Payloads über 65.000 Zeichen sind sichtbar gekürzt.","parameters":[{"name":"ulid","in":"path","description":"ConnectRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/connect/runs/{ulid}/cancel":{"post":{"operationId":"connect_run_cancel","tags":["ConnectRun"],"responses":{"201":{"description":"ConnectRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRun-connect_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectRun.jsonld-connect_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel run","description":"Cancel run. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ConnectRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRun"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectRun"}}},"required":true}}},"/api/v1/connect/runs/{ulid}/retry":{"post":{"operationId":"connect_run_retry","tags":["ConnectRun"],"responses":{"201":{"description":"ConnectRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRun-connect_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectRun.jsonld-connect_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Gescheiterten Lauf ab der Fehlerstelle wiederholen","description":"Lässt EINEN gescheiterten Lauf erneut laufen — AB DER FEHLERSTELLE, mit den Datensätzen der bereits gelaufenen Bausteine. Was in Fremdsystemen schon angelegt wurde, entsteht damit kein zweites Mal.","parameters":[{"name":"ulid","in":"path","description":"ConnectRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRun"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectRun"}}},"required":true}}},"/api/v1/connect/store":{"get":{"operationId":"api_v1connectstore_get_collection","tags":["ConnectStore"],"responses":{"200":{"description":"ConnectStore collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectStore-connect_store.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectStore.jsonld-connect_store.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectStore.jsonld-connect_store.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectStore resources.","description":"Retrieves the collection of ConnectStore resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über den Schlüssel","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"flowUlid","in":"query","description":"Nur die Ablage EINES Ablaufs","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"global","in":"query","description":"Nur die gemeinsame Ablage","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]}},"/api/v1/connect/store/{ulid}":{"get":{"operationId":"api_v1connectstore_ulid_get","tags":["ConnectStore"],"responses":{"200":{"description":"ConnectStore resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectStore-connect_store.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectStore.jsonld-connect_store.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ConnectStore resource.","description":"Retrieves a ConnectStore resource.","parameters":[{"name":"ulid","in":"path","description":"ConnectStore identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1connectstore_ulid_delete","tags":["ConnectStore"],"responses":{"204":{"description":"ConnectStore resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ConnectStore resource.","description":"Vergisst den Wert. Ein gelöschter Wasserstand heisst beim nächsten Abruf: von vorn.","parameters":[{"name":"ulid","in":"path","description":"ConnectStore identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1connectstore_ulid_patch","tags":["ConnectStore"],"responses":{"200":{"description":"ConnectStore resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectStore-connect_store.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectStore.jsonld-connect_store.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ConnectStore resource.","description":"Setzt den gemerkten Wert. Der übliche Griff: einen Wasserstand zurückdrehen, damit der nächste Abruf ein älteres Fenster noch einmal holt.","parameters":[{"name":"ulid","in":"path","description":"ConnectStore identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ConnectStore resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ConnectStore-connect_store.write.jsonMergePatch"}}},"required":true}}},"/api/v1/connect/templates":{"get":{"operationId":"api_v1connecttemplates_get_collection","tags":["ConnectTemplate"],"responses":{"200":{"description":"ConnectTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectTemplate-connect_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectTemplate.jsonld-connect_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectTemplate.jsonld-connect_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectTemplate resources.","description":"Alle verfügbaren Flow-Vorlagen mit ihren Parametern. Vorlagen deaktivierter Plugins fehlen hier.","parameters":[]}},"/api/v1/connect/templates/{key}/install":{"post":{"operationId":"connect_template_install","tags":["ConnectTemplate"],"responses":{"201":{"description":"ConnectTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectTemplate-connect_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectTemplate.jsonld-connect_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Install template","description":"Install template. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"key","in":"path","description":"ConnectTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new ConnectTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectTemplate-connect_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ConnectTemplate-connect_template.write"}}},"required":true}}},"/api/v1/connect/webhook-schemes":{"get":{"operationId":"api_v1connectwebhook-schemes_get_collection","tags":["ConnectWebhookScheme"],"responses":{"200":{"description":"ConnectWebhookScheme collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConnectWebhookScheme-connect_webhook_scheme.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ConnectWebhookScheme.jsonld-connect_webhook_scheme.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ConnectWebhookScheme.jsonld-connect_webhook_scheme.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ConnectWebhookScheme resources.","description":"Alle verfügbaren Signatur-Verfahren für eingehende Webhooks. Beiträge deaktivierter Plugins fehlen hier.","parameters":[]}},"/api/v1/contacts":{"get":{"operationId":"api_v1contacts_get_collection","tags":["Contact"],"responses":{"200":{"description":"Contact collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Contact-contact.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Contact.jsonld-contact.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Contact.jsonld-contact.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Contact resources.","description":"Retrieves the collection of Contact resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"customerUlid","in":"query","description":"Zugeordneter Kunde: Kunden-ULID oder numerische Kunden-ID","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Alias zu customerUlid (nur wirksam, wenn customerUlid fehlt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"search","in":"query","description":"Suche über Vorname, Nachname und E-Mail (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Alias zu search (nur wirksam, wenn search fehlt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"role","in":"query","description":"Exakte Kontaktrolle (z.B. decision_maker, billing, technical)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"statusId","in":"query","description":"Exakter Kontakt-Status (Katalog-Key aus contact-statuses)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marke (numerische PK) — zeigt nur Kontakte dieser Marke plus den markenlosen Bestand","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"order[fullName]","in":"query","description":"Sortierung nach Name = Nachname, Vorname (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[lastName]","in":"query","description":"Sortierung nach Nachname, Vorname (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[firstName]","in":"query","description":"Sortierung nach Vorname, Nachname (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[email]","in":"query","description":"Sortierung nach E-Mail (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[phone]","in":"query","description":"Sortierung nach Telefon (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[role]","in":"query","description":"Sortierung nach Kontaktrolle (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[statusId]","in":"query","description":"Sortierung nach Kontakt-Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[customerName]","in":"query","description":"Sortierung nach Kundenname (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1contacts_post","tags":["Contact"],"responses":{"201":{"description":"Contact resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact-contact.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contact.jsonld-contact.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Contact resource.","description":"Creates a Contact resource.","parameters":[],"requestBody":{"description":"The new Contact resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact-contact.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contact-contact.write"}}},"required":true}}},"/api/v1/contacts/{ulid}":{"get":{"operationId":"api_v1contacts_ulid_get","tags":["Contact"],"responses":{"200":{"description":"Contact resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact-contact.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contact.jsonld-contact.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Contact resource.","description":"Retrieves a Contact resource.","parameters":[{"name":"ulid","in":"path","description":"Contact identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contacts_ulid_delete","tags":["Contact"],"responses":{"204":{"description":"Contact resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Contact resource.","description":"Removes the Contact resource.","parameters":[{"name":"ulid","in":"path","description":"Contact identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contacts_ulid_patch","tags":["Contact"],"responses":{"200":{"description":"Contact resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact-contact.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contact.jsonld-contact.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Contact resource.","description":"Updates the Contact resource.","parameters":[{"name":"ulid","in":"path","description":"Contact identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Contact resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Contact-contact.write.jsonMergePatch"}}},"required":true}}},"/api/v1/contact-roles":{"get":{"operationId":"api_v1contact-roles_get_collection","tags":["ContactRole"],"responses":{"200":{"description":"ContactRole collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContactRole-contact_role.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContactRole.jsonld-contact_role.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContactRole.jsonld-contact_role.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContactRole resources.","description":"Retrieves the collection of ContactRole resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1contact-roles_post","tags":["ContactRole"],"responses":{"201":{"description":"ContactRole resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRole-contact_role.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContactRole.jsonld-contact_role.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ContactRole resource.","description":"Creates a ContactRole resource.","parameters":[],"requestBody":{"description":"The new ContactRole resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRole-contact_role.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContactRole-contact_role.write"}}},"required":true}}},"/api/v1/contact-roles/{key}":{"get":{"operationId":"api_v1contact-roles_key_get","tags":["ContactRole"],"responses":{"200":{"description":"ContactRole resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRole-contact_role.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContactRole.jsonld-contact_role.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ContactRole resource.","description":"Retrieves a ContactRole resource.","parameters":[{"name":"key","in":"path","description":"ContactRole identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contact-roles_key_delete","tags":["ContactRole"],"responses":{"204":{"description":"ContactRole resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ContactRole resource.","description":"Removes the ContactRole resource.","parameters":[{"name":"key","in":"path","description":"ContactRole identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contact-roles_key_patch","tags":["ContactRole"],"responses":{"200":{"description":"ContactRole resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRole-contact_role.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContactRole.jsonld-contact_role.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ContactRole resource.","description":"Updates the ContactRole resource.","parameters":[{"name":"key","in":"path","description":"ContactRole identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ContactRole resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ContactRole-contact_role.update.jsonMergePatch"}}},"required":true}}},"/api/v1/contact-statuses":{"get":{"operationId":"api_v1contact-statuses_get_collection","tags":["ContactStatus"],"responses":{"200":{"description":"ContactStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContactStatus-contact_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContactStatus.jsonld-contact_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContactStatus.jsonld-contact_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContactStatus resources.","description":"Retrieves the collection of ContactStatus resources.","parameters":[]},"post":{"operationId":"api_v1contact-statuses_post","tags":["ContactStatus"],"responses":{"201":{"description":"ContactStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactStatus-contact_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContactStatus.jsonld-contact_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ContactStatus resource.","description":"Creates a ContactStatus resource.","parameters":[],"requestBody":{"description":"The new ContactStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactStatus-contact_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContactStatus-contact_status.write"}}},"required":true}}},"/api/v1/contact-statuses/{key}":{"get":{"operationId":"api_v1contact-statuses_key_get","tags":["ContactStatus"],"responses":{"200":{"description":"ContactStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactStatus-contact_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContactStatus.jsonld-contact_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ContactStatus resource.","description":"Retrieves a ContactStatus resource.","parameters":[{"name":"key","in":"path","description":"ContactStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contact-statuses_key_delete","tags":["ContactStatus"],"responses":{"204":{"description":"ContactStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ContactStatus resource.","description":"Removes the ContactStatus resource.","parameters":[{"name":"key","in":"path","description":"ContactStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contact-statuses_key_patch","tags":["ContactStatus"],"responses":{"200":{"description":"ContactStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactStatus-contact_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContactStatus.jsonld-contact_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ContactStatus resource.","description":"Updates the ContactStatus resource.","parameters":[{"name":"key","in":"path","description":"ContactStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ContactStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ContactStatus-contact_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/content/adapters":{"get":{"operationId":"api_v1contentadapters_get_collection","tags":["ContentAdapter"],"responses":{"200":{"description":"ContentAdapter collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentAdapter-content_adapter.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContentAdapter.jsonld-content_adapter.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContentAdapter.jsonld-content_adapter.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verfügbare Ausspiel-Ziele","description":"Die Adapter, die diese Installation bereitstellt — abhängig davon, welche Plugins aktiv sind.","parameters":[]}},"/api/v1/content/ai":{"post":{"operationId":"api_v1contentai_post","tags":["ContentAi"],"responses":{"201":{"description":"ContentAi resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentAi-content_ai.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentAi.jsonld-content_ai.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"KI-Vorschlag für einen Beitrag","description":"Erzeugt einen Feld-Entwurf (`draft`), eine SERIE zusammenhängender Entwürfe (`series`, 2–30), Suchmaschinen-Angaben (`seo`) oder ein Bild (`image`, landet in der Dateiablage). Ohne aktive KI kommt eine leere Antwort mit `aiUsed=false` — kein Fehler. Marken-Schnitt: `seo` verlangt das Schreibrecht `content.item.manage` in der Marke des BEITRAGS (`content.brand.all` hebt die Marken-Bindung auf, ersetzt das Recht aber nie) — ein fremder Beitrag ist nicht auffindbar (404), ein `brandId` im Rumpf wird dabei ignoriert; `draft`, `series` und `image` verlangen dasselbe Recht in der angegebenen `brandId` (sonst 403), deren Instruktion, Budget und Ablage gelten.","parameters":[],"requestBody":{"description":"The new ContentAi resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentAi-content_ai.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentAi-content_ai.write"}}},"required":true}}},"/api/v1/content/channels":{"get":{"operationId":"api_v1contentchannels_get_collection","tags":["ContentChannel"],"responses":{"200":{"description":"ContentChannel collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentChannel-content_channel.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContentChannel.jsonld-content_channel.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContentChannel.jsonld-content_channel.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContentChannel resources.","description":"Retrieves the collection of ContentChannel resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1contentchannels_post","tags":["ContentChannel"],"responses":{"201":{"description":"ContentChannel resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentChannel-content_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentChannel.jsonld-content_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ContentChannel resource.","description":"Creates a ContentChannel resource.","parameters":[],"requestBody":{"description":"The new ContentChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentChannel-content_channel.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentChannel-content_channel.write"}}},"required":true}}},"/api/v1/content/channels/{ulid}":{"get":{"operationId":"api_v1contentchannels_ulid_get","tags":["ContentChannel"],"responses":{"200":{"description":"ContentChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentChannel-content_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentChannel.jsonld-content_channel.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ContentChannel resource.","description":"Retrieves a ContentChannel resource.","parameters":[{"name":"ulid","in":"path","description":"ContentChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contentchannels_ulid_delete","tags":["ContentChannel"],"responses":{"204":{"description":"ContentChannel resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ContentChannel resource.","description":"Removes the ContentChannel resource.","parameters":[{"name":"ulid","in":"path","description":"ContentChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contentchannels_ulid_patch","tags":["ContentChannel"],"responses":{"200":{"description":"ContentChannel resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentChannel-content_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentChannel.jsonld-content_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ContentChannel resource.","description":"Updates the ContentChannel resource.","parameters":[{"name":"ulid","in":"path","description":"ContentChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ContentChannel resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ContentChannel-content_channel.write.jsonMergePatch"}}},"required":true}}},"/api/v1/content/items":{"get":{"operationId":"api_v1contentitems_get_collection","tags":["ContentItem"],"responses":{"200":{"description":"ContentItem collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentItem-content_item.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContentItem.jsonld-content_item.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContentItem resources.","description":"Retrieves the collection of ContentItem resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"type","in":"query","description":"Auf einen Inhaltstyp einschränken (Typ-Schlüssel, z. B. `blog`).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Zustand: draft|review|scheduled|publishing|published|archived","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"locale","in":"query","description":"Sprache des Beitrags (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"category","in":"query","description":"Kategorie-Schlüssel","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Adresse und Feldwerte","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"publicationState","in":"query","description":"Beiträge mit mindestens EINER Publikation in diesem Zustand (pending|publishing|processing|published|failed|withdrawn) — die einzige Art, „nicht angekommen“ zu finden.","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[plannedPublishAt]","in":"query","description":"Sortierung nach geplantem Zeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[publishedAt]","in":"query","description":"Sortierung nach Veröffentlichung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlage (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1contentitems_post","tags":["ContentItem"],"responses":{"201":{"description":"ContentItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ContentItem resource.","description":"Creates a ContentItem resource.","parameters":[],"requestBody":{"description":"The new ContentItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}}},"required":true}}},"/api/v1/content/items/{ulid}":{"get":{"operationId":"api_v1contentitems_ulid_get","tags":["ContentItem"],"responses":{"200":{"description":"ContentItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ContentItem resource.","description":"Retrieves a ContentItem resource.","parameters":[{"name":"ulid","in":"path","description":"ContentItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contentitems_ulid_delete","tags":["ContentItem"],"responses":{"204":{"description":"ContentItem resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ContentItem resource.","description":"Removes the ContentItem resource.","parameters":[{"name":"ulid","in":"path","description":"ContentItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contentitems_ulid_patch","tags":["ContentItem"],"responses":{"200":{"description":"ContentItem resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ContentItem resource.","description":"Updates the ContentItem resource.","parameters":[{"name":"ulid","in":"path","description":"ContentItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ContentItem resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write.jsonMergePatch"}}},"required":true}}},"/api/v1/content/items/{ulid}/archive":{"post":{"operationId":"api_v1contentitems_ulidarchive_post","tags":["ContentItem"],"responses":{"201":{"description":"ContentItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Archivieren","description":"Nimmt den Beitrag aus dem Arbeitsvorrat, ohne ihn zu löschen.","parameters":[{"name":"ulid","in":"path","description":"ContentItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ContentItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}}},"required":true}}},"/api/v1/content/items/{ulid}/publish":{"post":{"operationId":"api_v1contentitems_ulidpublish_post","tags":["ContentItem"],"responses":{"201":{"description":"ContentItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sofort veröffentlichen","description":"Veröffentlicht den Beitrag jetzt und spielt ihn an alle passenden Ziele aus. Ein Ziel, das ausfällt, hält die anderen nicht auf — der Beitrag ist danach veröffentlicht, das betroffene Ziel trägt seinen Fehler selbst. Der Aufruf RESERVIERT den Beitrag per bedingtem UPDATE: von zwei gleichzeitigen Aufrufen spielt genau einer aus, der zweite antwortet 409 `errors.content.publishInProgress` — sonst stünde derselbe Beitrag zweimal beim Netzwerk, der zweite ohne Spur im System.","parameters":[{"name":"ulid","in":"path","description":"ContentItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ContentItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}}},"required":true}}},"/api/v1/content/items/{ulid}/schedule":{"post":{"operationId":"api_v1contentitems_ulidschedule_post","tags":["ContentItem"],"responses":{"201":{"description":"ContentItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Terminieren","description":"Setzt den Beitrag auf `scheduled`. Verlangt einen geplanten Zeitpunkt — ohne ihn greift der Zeitplan den Beitrag nie auf.","parameters":[{"name":"ulid","in":"path","description":"ContentItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ContentItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}}},"required":true}}},"/api/v1/content/items/{ulid}/submit":{"post":{"operationId":"api_v1contentitems_ulidsubmit_post","tags":["ContentItem"],"responses":{"201":{"description":"ContentItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zur Prüfung geben","description":"Setzt den Beitrag auf `review`. Er bleibt änderbar; die Prüfung ist ein Zustand, kein Schloss.","parameters":[{"name":"ulid","in":"path","description":"ContentItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ContentItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}}},"required":true}}},"/api/v1/content/items/{ulid}/unpublish":{"post":{"operationId":"api_v1contentitems_ulidunpublish_post","tags":["ContentItem"],"responses":{"201":{"description":"ContentItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem.jsonld-content_item.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zurückziehen","description":"Nimmt den Beitrag an allen Zielen zurück und setzt ihn auf `draft`. Der Veröffentlichungs-Zeitpunkt bleibt stehen — er sagt, wann der Beitrag erstmals draußen war. Je Ziel läuft die Rücknahme genau einmal (bedingtes UPDATE auf die Publikations-Zeile): ein zweiter gleichzeitiger Aufruf startet beim Fremdsystem keinen zweiten Vorgang.","parameters":[{"name":"ulid","in":"path","description":"ContentItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ContentItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItem-content_item.write"}}},"required":true}}},"/api/v1/content/items/bulk":{"post":{"operationId":"api_v1contentitemsbulk_post","tags":["ContentItemBulk"],"responses":{"201":{"description":"ContentItemBulk resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItemBulk-content_item_bulk.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItemBulk.jsonld-content_item_bulk.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Serie anlegen","description":"Legt mehrere Beiträge desselben Typs in einem Zug an — ganz oder gar nicht. Bricht ein Eintrag, ist keiner angelegt.","parameters":[],"requestBody":{"description":"The new ContentItemBulk resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItemBulk-content_item_bulk.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentItemBulk-content_item_bulk.write"}}},"required":true}}},"/api/v1/content/overview":{"get":{"operationId":"api_v1contentoverview_get_collection","tags":["ContentOverview"],"responses":{"200":{"description":"ContentOverview collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentOverview-content_overview.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContentOverview.jsonld-content_overview.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContentOverview.jsonld-content_overview.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Übersicht „Inhalte\"","description":"Funktionsstand (Ziele, KI, Inhaltstypen) und die Zahlen, die eine Handlung auslösen — inklusive fehlgeschlagener Veröffentlichungen mit Fehlertext.","parameters":[]}},"/api/v1/content/publications/report":{"post":{"operationId":"api_v1contentpublicationsreport_post","tags":["ContentPublicationReport"],"responses":{"201":{"description":"ContentPublicationReport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentPublicationReport-content_report.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentPublicationReport.jsonld-content_report.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Veröffentlichung melden","description":"Schreibt die Kennung zurück, die ein Zielsystem für einen Beitrag vergeben hat. Ohne sie legt der nächste Zug dort einen zweiten Beitrag an.","parameters":[],"requestBody":{"description":"The new ContentPublicationReport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentPublicationReport-content_report.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentPublicationReport-content_report.write"}}},"required":true}}},"/api/v1/content/types":{"get":{"operationId":"api_v1contenttypes_get_collection","tags":["ContentType"],"responses":{"200":{"description":"ContentType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentType-content_type.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContentType.jsonld-content_type.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContentType.jsonld-content_type.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContentType resources.","description":"Retrieves the collection of ContentType resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1contenttypes_post","tags":["ContentType"],"responses":{"201":{"description":"ContentType resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentType-content_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentType.jsonld-content_type.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ContentType resource.","description":"Creates a ContentType resource.","parameters":[],"requestBody":{"description":"The new ContentType resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentType-content_type.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentType-content_type.write"}}},"required":true}}},"/api/v1/content/types/{ulid}":{"get":{"operationId":"api_v1contenttypes_ulid_get","tags":["ContentType"],"responses":{"200":{"description":"ContentType resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentType-content_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentType.jsonld-content_type.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ContentType resource.","description":"Retrieves a ContentType resource.","parameters":[{"name":"ulid","in":"path","description":"ContentType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contenttypes_ulid_delete","tags":["ContentType"],"responses":{"204":{"description":"ContentType resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ContentType resource.","description":"Removes the ContentType resource.","parameters":[{"name":"ulid","in":"path","description":"ContentType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contenttypes_ulid_patch","tags":["ContentType"],"responses":{"200":{"description":"ContentType resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentType-content_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContentType.jsonld-content_type.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ContentType resource.","description":"Updates the ContentType resource.","parameters":[{"name":"ulid","in":"path","description":"ContentType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ContentType resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ContentType-content_type.write.jsonMergePatch"}}},"required":true}}},"/api/v1/contracts":{"get":{"operationId":"api_v1contracts_get_collection","tags":["Contract"],"responses":{"200":{"description":"Contract collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Contract-contract.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Contract.jsonld-contract.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Contract resources.","description":"Retrieves the collection of Contract resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Vertrags-Status","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"type","in":"query","description":"Vertragstyp","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"billingCycle","in":"query","description":"Abrechnungszyklus","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"endsBefore","in":"query","description":"Nur Verträge mit Enddatum vor/bis diesem Datum (YYYY-MM-DD)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"expiringInDays","in":"query","description":"Nur Verträge, die innerhalb der nächsten N Tage auslaufen (ab heute, inklusive)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Vertragsnummer, Titel und Kundenname","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[flatFeeAmount]","in":"query","description":"Sortierung nach Pauschale (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[startsAt]","in":"query","description":"Sortierung nach Vertragsbeginn (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[endsAt]","in":"query","description":"Sortierung nach Vertragsende (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[id]","in":"query","description":"Sortierung nach Anlage-Reihenfolge (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1contracts_post","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Contract resource.","description":"Creates a Contract resource.","parameters":[],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/from-quote":{"post":{"operationId":"contract_from_quote","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Create contract from a quote","description":"Create contract from a quote. Dedicated action endpoint — not a standard CRUD create.","parameters":[],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}":{"get":{"operationId":"api_v1contracts_ulid_get","tags":["Contract"],"responses":{"200":{"description":"Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Contract resource.","description":"Retrieves a Contract resource.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contracts_ulid_delete","tags":["Contract"],"responses":{"204":{"description":"Contract resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Contract resource.","description":"Removes the Contract resource.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contracts_ulid_patch","tags":["Contract"],"responses":{"200":{"description":"Contract resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Contract resource.","description":"Updates the Contract resource.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Contract resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write.jsonMergePatch"}}},"required":true}}},"/api/v1/contracts/{ulid}/activate":{"post":{"operationId":"contract_activate","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Activate contract","description":"Activate contract. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/index":{"post":{"operationId":"contract_index","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Indexierung anwenden","description":"Wendet die hinterlegte Indexierungsregel zum heutigen Stichtag an und passt die Vertragspreise an.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/items":{"post":{"operationId":"contract_add_item","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vertragsposition hinzufügen","description":"Fügt dem Vertrag eine Position hinzu.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/notice":{"post":{"operationId":"contract_notice","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kündigung zum Laufzeitende melden","description":"Meldet die Kündigung zum übergebenen `endsAt` an — der Vertrag läuft bis dahin weiter. `endsAt` ist Pflicht.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/pause":{"post":{"operationId":"contract_pause","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Pause contract","description":"Pause contract. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/pdf":{"get":{"operationId":"contract_pdf","tags":["Contract"],"responses":{"204":{"description":"Contract resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Contract resource.","description":"Retrieves a Contract resource.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/contracts/{ulid}/prepaid":{"post":{"operationId":"contract_add_prepaid","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Prepaid-Guthaben buchen","description":"Bucht ein Prepaid-Guthaben auf den Vertrag. Verlangt das eigene Prepaid-Recht.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/quotas":{"post":{"operationId":"contract_add_quota","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kontingent anlegen","description":"Legt ein Kontingent am Vertrag an (Grundlage der Verbrauchsabrechnung).","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/renew":{"post":{"operationId":"contract_renew","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vertrag verlängern","description":"Verlängert den Vertrag um eine Laufzeitperiode nach der hinterlegten Verlängerungsregel.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/resume":{"post":{"operationId":"contract_resume","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Resume contract","description":"Resume contract. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/summarize":{"post":{"operationId":"contract_summarize","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"KI-Zusammenfassung des Vertrags","description":"Erzeugt eine KI-Zusammenfassung des Vertrags, ohne ihn zu verändern — deshalb genügt das Leserecht.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contracts/{ulid}/terminate":{"post":{"operationId":"contract_terminate","tags":["Contract"],"responses":{"201":{"description":"Contract resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract.jsonld-contract.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vertrag sofort beenden","description":"Beendet den Vertrag ZUM JETZIGEN ZEITPUNKT (Status `terminated`, Enddatum heute, sofern nicht gesetzt) — nicht zum nächsten Kündigungstermin, dafür ist `/notice`. Offene Teilperioden werden vorher abgerechnet; danach entstehen keine Perioden und keine Serienrechnungen mehr. Bereits beendet/abgelaufen: 409. Body optional `{terminationReason}`.","parameters":[{"name":"ulid","in":"path","description":"Contract identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Contract resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Contract-contract.write"}}},"required":true}}},"/api/v1/contract-activity":{"get":{"operationId":"api_v1contract-activity_get_collection","tags":["ContractActivity"],"responses":{"200":{"description":"ContractActivity collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContractActivity-contract_activity.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContractActivity.jsonld-contract_activity.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContractActivity.jsonld-contract_activity.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContractActivity resources.","description":"Retrieves the collection of ContractActivity resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"itemsPerPage","in":"query","description":"The number of items per page","required":false,"deprecated":false,"schema":{"type":"integer","default":30,"minimum":0,"maximum":100},"style":"form","explode":true},{"name":"contractUlid","in":"query","description":"Vertrags-ULID (Pflichtfilter — ohne ihn antwortet die Operation mit 400)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[occurredAt]","in":"query","description":"Sortierung nach Zeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/contract-amendments":{"get":{"operationId":"api_v1contract-amendments_get_collection","tags":["ContractAmendment"],"responses":{"200":{"description":"ContractAmendment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContractAmendment-contract_amendment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContractAmendment.jsonld-contract_amendment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContractAmendment.jsonld-contract_amendment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContractAmendment resources.","description":"Retrieves the collection of ContractAmendment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"contractId","in":"query","description":"Vertrags-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Nachtrag-Status: draft oder active (ungültige Werte → 400)","required":false,"deprecated":false,"schema":{"type":"string","enum":["draft","active"]},"style":"form","explode":true}]},"post":{"operationId":"api_v1contract-amendments_post","tags":["ContractAmendment"],"responses":{"201":{"description":"ContractAmendment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractAmendment-contract_amendment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContractAmendment.jsonld-contract_amendment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ContractAmendment resource.","description":"Creates a ContractAmendment resource.","parameters":[],"requestBody":{"description":"The new ContractAmendment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractAmendment-contract_amendment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContractAmendment-contract_amendment.write"}}},"required":true}}},"/api/v1/contract-amendments/{ulid}":{"get":{"operationId":"api_v1contract-amendments_ulid_get","tags":["ContractAmendment"],"responses":{"200":{"description":"ContractAmendment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractAmendment-contract_amendment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContractAmendment.jsonld-contract_amendment.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ContractAmendment resource.","description":"Retrieves a ContractAmendment resource.","parameters":[{"name":"ulid","in":"path","description":"ContractAmendment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contract-amendments_ulid_delete","tags":["ContractAmendment"],"responses":{"204":{"description":"ContractAmendment resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ContractAmendment resource.","description":"Removes the ContractAmendment resource.","parameters":[{"name":"ulid","in":"path","description":"ContractAmendment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contract-amendments_ulid_patch","tags":["ContractAmendment"],"responses":{"200":{"description":"ContractAmendment resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractAmendment-contract_amendment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContractAmendment.jsonld-contract_amendment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ContractAmendment resource.","description":"Updates the ContractAmendment resource.","parameters":[{"name":"ulid","in":"path","description":"ContractAmendment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ContractAmendment resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ContractAmendment-contract_amendment.write.jsonMergePatch"}}},"required":true}}},"/api/v1/contract-history":{"get":{"operationId":"api_v1contract-history_get_collection","tags":["ContractHistory"],"responses":{"200":{"description":"ContractHistory collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContractHistory-contract_history.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContractHistory.jsonld-contract_history.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContractHistory.jsonld-contract_history.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContractHistory resources.","description":"Retrieves the collection of ContractHistory resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"contractId","in":"query","description":"Vertrags-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"event","in":"query","description":"Ereignis-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/contract-quota-periods":{"get":{"operationId":"api_v1contract-quota-periods_get_collection","tags":["ContractQuotaPeriod"],"responses":{"200":{"description":"ContractQuotaPeriod collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContractQuotaPeriod-quota_period.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContractQuotaPeriod.jsonld-quota_period.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContractQuotaPeriod.jsonld-quota_period.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContractQuotaPeriod resources.","description":"Retrieves the collection of ContractQuotaPeriod resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"contractId","in":"query","description":"Vertrags-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"quotaId","in":"query","description":"Kontingent-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/contract/contract-statuses":{"get":{"operationId":"api_v1contractcontract-statuses_get_collection","tags":["ContractStatus"],"responses":{"200":{"description":"ContractStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContractStatus-contract_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContractStatus.jsonld-contract_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContractStatus.jsonld-contract_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContractStatus resources.","description":"Retrieves the collection of ContractStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1contractcontract-statuses_post","tags":["ContractStatus"],"responses":{"201":{"description":"ContractStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractStatus-contract_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContractStatus.jsonld-contract_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ContractStatus resource.","description":"Creates a ContractStatus resource.","parameters":[],"requestBody":{"description":"The new ContractStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractStatus-contract_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContractStatus-contract_status.write"}}},"required":true}}},"/api/v1/contract/contract-statuses/{key}":{"get":{"operationId":"api_v1contractcontract-statuses_key_get","tags":["ContractStatus"],"responses":{"200":{"description":"ContractStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractStatus-contract_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContractStatus.jsonld-contract_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ContractStatus resource.","description":"Retrieves a ContractStatus resource.","parameters":[{"name":"key","in":"path","description":"ContractStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1contractcontract-statuses_key_delete","tags":["ContractStatus"],"responses":{"204":{"description":"ContractStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ContractStatus resource.","description":"Removes the ContractStatus resource.","parameters":[{"name":"key","in":"path","description":"ContractStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1contractcontract-statuses_key_patch","tags":["ContractStatus"],"responses":{"200":{"description":"ContractStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContractStatus-contract_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ContractStatus.jsonld-contract_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ContractStatus resource.","description":"Updates the ContractStatus resource.","parameters":[{"name":"key","in":"path","description":"ContractStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ContractStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ContractStatus-contract_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/contract-summary":{"get":{"operationId":"api_v1contract-summary_get_collection","tags":["ContractSummary"],"responses":{"200":{"description":"ContractSummary collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContractSummary-contract_summary.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ContractSummary.jsonld-contract_summary.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ContractSummary.jsonld-contract_summary.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ContractSummary resources.","description":"Retrieves the collection of ContractSummary resources.","parameters":[]}},"/api/v1/international/country-tax-rates":{"get":{"operationId":"api_v1internationalcountry-tax-rates_get_collection","tags":["CountryTaxRate"],"responses":{"200":{"description":"CountryTaxRate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CountryTaxRate-country_tax_rate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CountryTaxRate.jsonld-country_tax_rate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CountryTaxRate.jsonld-country_tax_rate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CountryTaxRate resources.","description":"Retrieves the collection of CountryTaxRate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"country","in":"query","description":"Nur dieses Bestimmungsland (ISO 3166-1 alpha-2)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"category","in":"query","description":"Kategorie-Rang: regular | reduced | exempt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. nur stillgelegte (false) Sätze","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"order[countryCode]","in":"query","description":"Sortierung nach Land (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[rate]","in":"query","description":"Sortierung nach Steuersatz (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1internationalcountry-tax-rates_post","tags":["CountryTaxRate"],"responses":{"201":{"description":"CountryTaxRate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate-country_tax_rate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate.jsonld-country_tax_rate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bestimmungsland-Steuersatz anlegen","description":"Payload `{countryCode, category, rate, validFrom?, validTo?}`. `countryCode` muss ein EU-Mitgliedstaat sein — für Drittländer gibt es keinen Bestimmungslandsatz, dort ist die Lieferung steuerfrei. Land und Kategorie zusammen sind eindeutig; ein zweiter Satz für dieselbe Kombination braucht ein abgegrenztes Gültigkeitsfenster.","parameters":[],"requestBody":{"description":"The new CountryTaxRate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate-country_tax_rate.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate-country_tax_rate.write"}}},"required":true}}},"/api/v1/international/country-tax-rates/{ulid}":{"get":{"operationId":"api_v1internationalcountry-tax-rates_ulid_get","tags":["CountryTaxRate"],"responses":{"200":{"description":"CountryTaxRate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate-country_tax_rate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate.jsonld-country_tax_rate.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CountryTaxRate resource.","description":"Retrieves a CountryTaxRate resource.","parameters":[{"name":"ulid","in":"path","description":"CountryTaxRate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1internationalcountry-tax-rates_ulid_patch","tags":["CountryTaxRate"],"responses":{"200":{"description":"CountryTaxRate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate-country_tax_rate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate.jsonld-country_tax_rate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bestimmungsland-Steuersatz ändern","description":"Satz, Gültigkeitsfenster und Aktiv-Kennzeichen. Land und Kategorie sind unveränderlich — ein umgehängter Satz träfe rückwirkend Belege, die mit ihm nichts zu tun haben.","parameters":[{"name":"ulid","in":"path","description":"CountryTaxRate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CountryTaxRate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CountryTaxRate-country_tax_rate.write.jsonMergePatch"}}},"required":true}}},"/api/v1/credit-control/overrides":{"get":{"operationId":"api_v1credit-controloverrides_get_collection","tags":["CreditOverride"],"responses":{"200":{"description":"CreditOverride collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreditOverride-credit_override.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CreditOverride.jsonld-credit_override.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CreditOverride.jsonld-credit_override.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CreditOverride resources.","description":"Retrieves the collection of CreditOverride resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunde (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"salesOrderUlid","in":"query","description":"Nur Freigaben zu diesem Auftrag","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"open","in":"query","description":"true = nur nicht widerrufene Freigaben","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1credit-controloverrides_post","tags":["CreditOverride"],"responses":{"201":{"description":"CreditOverride resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditOverride-credit_override.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CreditOverride.jsonld-credit_override.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CreditOverride resource.","description":"Gibt EINEN Auftrag trotz überschrittenem Kreditrahmen frei. `salesOrderUlid` und `reason` sind Pflicht. Saldo und Rahmen des Moments werden mitgeschrieben — ohne sie ist später nicht mehr nachvollziehbar, worüber entschieden wurde.","parameters":[],"requestBody":{"description":"The new CreditOverride resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditOverride-credit_override.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CreditOverride-credit_override.write"}}},"required":true}}},"/api/v1/credit-control/overrides/{ulid}/revoke":{"post":{"operationId":"credit_override_revoke","tags":["CreditOverride"],"responses":{"201":{"description":"CreditOverride resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditOverride-credit_override.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CreditOverride.jsonld-credit_override.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kreditlimit-Freigabe widerrufen","description":"Nimmt eine Freigabe zurück: der Auftrag fällt wieder unter die Kreditlimit-Sperre und wird ohne neue Freigabe nicht mehr ausgeliefert. Die Zeile bleibt bestehen und ist als widerrufen gekennzeichnet (kein DELETE).","parameters":[{"name":"ulid","in":"path","description":"CreditOverride identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CreditOverride resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditOverride-credit_override.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CreditOverride-credit_override.write"}}},"required":true}}},"/api/v1/credit-control/profiles":{"get":{"operationId":"api_v1credit-controlprofiles_get_collection","tags":["CreditProfile"],"responses":{"200":{"description":"CreditProfile collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreditProfile-credit_profile.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CreditProfile.jsonld-credit_profile.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CreditProfile.jsonld-credit_profile.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CreditProfile resources.","description":"Retrieves the collection of CreditProfile resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunde (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"riskClass","in":"query","description":"Risikoklasse low|normal|high (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. stillgelegte (false) Profile","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"exceeded","in":"query","description":"true = nur Profile, deren Rahmen aktuell überschritten ist","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1credit-controlprofiles_post","tags":["CreditProfile"],"responses":{"201":{"description":"CreditProfile resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditProfile-credit_profile.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CreditProfile.jsonld-credit_profile.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CreditProfile resource.","description":"Legt ein Kreditprofil an (ein Profil je Kunde). `limitAmount` null = kein Rahmen (das Limit greift nicht), 0 = ausdrücklich kein Kredit.","parameters":[],"requestBody":{"description":"The new CreditProfile resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditProfile-credit_profile.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CreditProfile-credit_profile.write"}}},"required":true}}},"/api/v1/credit-control/profiles/{ulid}":{"get":{"operationId":"api_v1credit-controlprofiles_ulid_get","tags":["CreditProfile"],"responses":{"200":{"description":"CreditProfile resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditProfile-credit_profile.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CreditProfile.jsonld-credit_profile.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CreditProfile resource.","description":"Retrieves a CreditProfile resource.","parameters":[{"name":"ulid","in":"path","description":"CreditProfile identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1credit-controlprofiles_ulid_delete","tags":["CreditProfile"],"responses":{"204":{"description":"CreditProfile resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CreditProfile resource.","description":"Soft-Delete des Profils — der Kunde hat danach kein Limit mehr.","parameters":[{"name":"ulid","in":"path","description":"CreditProfile identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1credit-controlprofiles_ulid_patch","tags":["CreditProfile"],"responses":{"200":{"description":"CreditProfile resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditProfile-credit_profile.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CreditProfile.jsonld-credit_profile.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CreditProfile resource.","description":"Updates the CreditProfile resource.","parameters":[{"name":"ulid","in":"path","description":"CreditProfile identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CreditProfile resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CreditProfile-credit_profile.write.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/activities":{"get":{"operationId":"api_v1crmactivities_get_collection","tags":["CrmActivity"],"responses":{"200":{"description":"CrmActivity collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CrmActivity-crm_activity.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CrmActivity.jsonld-crm_activity.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CrmActivity.jsonld-crm_activity.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CrmActivity resources.","description":"Retrieves the collection of CrmActivity resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"targetType","in":"query","description":"Zielobjekt-Typ (customer|contact|deal, exakter Match); zusammen mit targetId","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"targetId","in":"query","description":"Zielobjekt-ID — nur zusammen mit targetType wirksam","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"type","in":"query","description":"Aktivitäts-Typ; ein Wert oder Komma-Liste (z. B. meeting,call)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"dueFrom","in":"query","description":"Früheste Fälligkeit; reines Datum (YYYY-MM-DD) = Beginn dieses Kalendertags in Europe/Berlin, sonst ISO-8601-Zeitpunkt. Schließt Aktivitäten ohne Fälligkeit aus","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"dueTo","in":"query","description":"Späteste Fälligkeit (einschließlich); reines Datum (YYYY-MM-DD) = Ende dieses Kalendertags in Europe/Berlin, sonst ISO-8601-Zeitpunkt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"hasDueDate","in":"query","description":"true = nur Aktivitäten MIT Fälligkeit (Wiedervorlagen), false = nur solche ohne. Unabhängig vom Fenster dueFrom/dueTo","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"ownerId","in":"query","description":"Verantwortliche/r (User-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"isDone","in":"query","description":"true = erledigt, false = offen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Betreff und Notiz","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[subject]","in":"query","description":"Sortierung nach Betreff (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[type]","in":"query","description":"Sortierung nach Typ (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[dueAt]","in":"query","description":"Sortierung nach Fälligkeit (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1crmactivities_post","tags":["CrmActivity"],"responses":{"201":{"description":"CrmActivity resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmActivity-crm_activity.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmActivity.jsonld-crm_activity.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CrmActivity resource.","description":"Creates a CrmActivity resource.","parameters":[],"requestBody":{"description":"The new CrmActivity resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmActivity-crm_activity.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmActivity-crm_activity.write"}}},"required":true}}},"/api/v1/crm/activities/{ulid}":{"get":{"operationId":"api_v1crmactivities_ulid_get","tags":["CrmActivity"],"responses":{"200":{"description":"CrmActivity resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmActivity-crm_activity.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmActivity.jsonld-crm_activity.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CrmActivity resource.","description":"Retrieves a CrmActivity resource.","parameters":[{"name":"ulid","in":"path","description":"CrmActivity identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1crmactivities_ulid_delete","tags":["CrmActivity"],"responses":{"204":{"description":"CrmActivity resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CrmActivity resource.","description":"Removes the CrmActivity resource.","parameters":[{"name":"ulid","in":"path","description":"CrmActivity identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1crmactivities_ulid_patch","tags":["CrmActivity"],"responses":{"200":{"description":"CrmActivity resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmActivity-crm_activity.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmActivity.jsonld-crm_activity.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CrmActivity resource.","description":"Updates the CrmActivity resource.","parameters":[{"name":"ulid","in":"path","description":"CrmActivity identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CrmActivity resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CrmActivity-crm_activity.write.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/deals/{ulid}/assist":{"post":{"operationId":"crm_deal_assist","tags":["CrmAssist"],"responses":{"200":{"description":"CrmAssist resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmAssist-crm_assist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmAssist.jsonld-crm_assist.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"KI-Vertriebsassistenz am Deal","description":"Führt die KI-Vertriebsassistenz am Deal aus (`mode`, z. B. draft_email) und gibt den Vorschlagstext zurück, ohne etwas zu speichern. Erfordert zusätzlich Lesezugriff auf genau diesen Deal (`crm.deal.view` in dessen Marke, Datensatz-Sichtbarkeit) — sonst 404. Überschrittenes Budget: 409.","parameters":[{"name":"ulid","in":"path","description":"CrmAssist identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CrmAssist resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmAssist-crm_assist.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmAssist-crm_assist.write"}}},"required":true}}},"/api/v1/crm/leads/{ulid}/assist":{"post":{"operationId":"crm_lead_assist","tags":["CrmAssist"],"responses":{"200":{"description":"CrmAssist resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmAssist-crm_assist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmAssist.jsonld-crm_assist.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"KI-Vertriebsassistenz am Lead","description":"Führt die KI-Vertriebsassistenz am Lead aus (`mode`) und gibt den Vorschlagstext zurück, ohne etwas zu speichern. Erfordert zusätzlich Lesezugriff auf genau diesen Lead (`crm.lead.view`, Datensatz-Sichtbarkeit) — sonst 404. Überschrittenes Budget: 409.","parameters":[{"name":"ulid","in":"path","description":"CrmAssist identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CrmAssist resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmAssist-crm_assist.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmAssist-crm_assist.write"}}},"required":true}}},"/api/v1/crm/compose-mail":{"post":{"operationId":"api_v1crmcompose-mail_post","tags":["CrmComposeMail"],"responses":{"201":{"description":"CrmComposeMail resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmComposeMail-crm_compose_mail.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmComposeMail.jsonld-crm_compose_mail.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CrmComposeMail resource.","description":"Creates a CrmComposeMail resource.","parameters":[],"requestBody":{"description":"The new CrmComposeMail resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmComposeMail-crm_compose_mail.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmComposeMail-crm_compose_mail.write"}}},"required":true}}},"/api/v1/crm/deals/{ulid}/health":{"get":{"operationId":"api_v1crmdeals_ulidhealth_get","tags":["CrmDealHealth"],"responses":{"200":{"description":"CrmDealHealth resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmDealHealth-crm_deal_health.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmDealHealth.jsonld-crm_deal_health.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CrmDealHealth resource.","description":"Retrieves a CrmDealHealth resource.","parameters":[{"name":"ulid","in":"path","description":"CrmDealHealth identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/crm/forecast":{"get":{"operationId":"api_v1crmforecast_get_collection","tags":["CrmForecast"],"responses":{"200":{"description":"CrmForecast collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CrmForecast-crm_forecast.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CrmForecast.jsonld-crm_forecast.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CrmForecast.jsonld-crm_forecast.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CrmForecast resources.","description":"Retrieves the collection of CrmForecast resources.","parameters":[{"name":"ownerId","in":"query","description":"Verantwortliche/r (User-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"pipelineId","in":"query","description":"Pipeline-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/crm/analytics/funnel":{"get":{"operationId":"api_v1crmanalyticsfunnel_get_collection","tags":["CrmFunnelReport"],"responses":{"200":{"description":"CrmFunnelReport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CrmFunnelReport-crm_funnel.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CrmFunnelReport.jsonld-crm_funnel.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CrmFunnelReport.jsonld-crm_funnel.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CrmFunnelReport resources.","description":"Retrieves the collection of CrmFunnelReport resources.","parameters":[{"name":"pipelineId","in":"query","description":"Pipeline-ID (Pflicht)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"from","in":"query","description":"Anlage-Fenster Start (ISO-Datum) — Kalendertag in Europe/Berlin","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Anlage-Fenster Ende (ISO-Datum, einschließlich) — Kalendertag in Europe/Berlin","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/crm/lost-reasons":{"get":{"operationId":"api_v1crmlost-reasons_get_collection","tags":["CrmLostReason"],"responses":{"200":{"description":"CrmLostReason collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CrmLostReason-crm_lost_reason.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CrmLostReason.jsonld-crm_lost_reason.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CrmLostReason.jsonld-crm_lost_reason.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CrmLostReason resources.","description":"Retrieves the collection of CrmLostReason resources.","parameters":[]},"post":{"operationId":"api_v1crmlost-reasons_post","tags":["CrmLostReason"],"responses":{"201":{"description":"CrmLostReason resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmLostReason-crm_lost_reason.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmLostReason.jsonld-crm_lost_reason.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CrmLostReason resource.","description":"Creates a CrmLostReason resource.","parameters":[],"requestBody":{"description":"The new CrmLostReason resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmLostReason-crm_lost_reason.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmLostReason-crm_lost_reason.write"}}},"required":true}}},"/api/v1/crm/lost-reasons/{key}":{"get":{"operationId":"api_v1crmlost-reasons_key_get","tags":["CrmLostReason"],"responses":{"200":{"description":"CrmLostReason resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmLostReason-crm_lost_reason.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmLostReason.jsonld-crm_lost_reason.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CrmLostReason resource.","description":"Retrieves a CrmLostReason resource.","parameters":[{"name":"key","in":"path","description":"CrmLostReason identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1crmlost-reasons_key_delete","tags":["CrmLostReason"],"responses":{"204":{"description":"CrmLostReason resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CrmLostReason resource.","description":"Removes the CrmLostReason resource.","parameters":[{"name":"key","in":"path","description":"CrmLostReason identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1crmlost-reasons_key_patch","tags":["CrmLostReason"],"responses":{"200":{"description":"CrmLostReason resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmLostReason-crm_lost_reason.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmLostReason.jsonld-crm_lost_reason.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CrmLostReason resource.","description":"Updates the CrmLostReason resource.","parameters":[{"name":"key","in":"path","description":"CrmLostReason identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CrmLostReason resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CrmLostReason-crm_lost_reason.update.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/deals/{ulid}/merge":{"post":{"operationId":"crm_deal_merge","tags":["CrmMerge"],"responses":{"200":{"description":"CrmMerge resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmMerge-crm_merge.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmMerge.jsonld-crm_merge.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Merge deal","description":"Merge deal. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"CrmMerge identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CrmMerge resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmMerge-crm_merge.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmMerge-crm_merge.write"}}},"required":true}}},"/api/v1/crm/leads/{ulid}/merge":{"post":{"operationId":"crm_lead_merge","tags":["CrmMerge"],"responses":{"200":{"description":"CrmMerge resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmMerge-crm_merge.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmMerge.jsonld-crm_merge.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Merge lead","description":"Merge lead. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"CrmMerge identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CrmMerge resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmMerge-crm_merge.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmMerge-crm_merge.write"}}},"required":true}}},"/api/v1/crm/sources":{"get":{"operationId":"api_v1crmsources_get_collection","tags":["CrmSource"],"responses":{"200":{"description":"CrmSource collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CrmSource-crm_source.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CrmSource.jsonld-crm_source.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CrmSource.jsonld-crm_source.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CrmSource resources.","description":"Retrieves the collection of CrmSource resources.","parameters":[]},"post":{"operationId":"api_v1crmsources_post","tags":["CrmSource"],"responses":{"201":{"description":"CrmSource resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmSource-crm_source.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmSource.jsonld-crm_source.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CrmSource resource.","description":"Creates a CrmSource resource.","parameters":[],"requestBody":{"description":"The new CrmSource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmSource-crm_source.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmSource-crm_source.write"}}},"required":true}}},"/api/v1/crm/sources/{key}":{"get":{"operationId":"api_v1crmsources_key_get","tags":["CrmSource"],"responses":{"200":{"description":"CrmSource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmSource-crm_source.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmSource.jsonld-crm_source.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CrmSource resource.","description":"Retrieves a CrmSource resource.","parameters":[{"name":"key","in":"path","description":"CrmSource identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1crmsources_key_delete","tags":["CrmSource"],"responses":{"204":{"description":"CrmSource resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CrmSource resource.","description":"Removes the CrmSource resource.","parameters":[{"name":"key","in":"path","description":"CrmSource identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1crmsources_key_patch","tags":["CrmSource"],"responses":{"200":{"description":"CrmSource resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmSource-crm_source.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmSource.jsonld-crm_source.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CrmSource resource.","description":"Updates the CrmSource resource.","parameters":[{"name":"key","in":"path","description":"CrmSource identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CrmSource resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CrmSource-crm_source.update.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/ticket-links":{"get":{"operationId":"api_v1crmticket-links_get_collection","tags":["CrmTicketLink"],"responses":{"200":{"description":"CrmTicketLink collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CrmTicketLink-crmticketlink.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CrmTicketLink.jsonld-crmticketlink.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CrmTicketLink.jsonld-crmticketlink.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CrmTicketLink resources.","description":"Retrieves the collection of CrmTicketLink resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"subjectType","in":"query","description":"CRM-Seite des Ankers (deal|lead) — nur zusammen mit subjectId wirksam; Alternative zu workItemUlid","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"subjectId","in":"query","description":"ULID des Deals/Leads — nur zusammen mit subjectType wirksam; liefert die verknüpften Tickets","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"workItemUlid","in":"query","description":"Ticket-ULID — liefert die verknüpften Deals/Leads. Pflichtfilter: entweder subjectType+subjectId ODER workItemUlid, sonst antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1crmticket-links_post","tags":["CrmTicketLink"],"responses":{"201":{"description":"CrmTicketLink resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmTicketLink-crmticketlink.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmTicketLink.jsonld-crmticketlink.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CrmTicketLink resource.","description":"Creates a CrmTicketLink resource.","parameters":[],"requestBody":{"description":"The new CrmTicketLink resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrmTicketLink-crmticketlink.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CrmTicketLink-crmticketlink.write"}}},"required":true}}},"/api/v1/crm/ticket-links/{ulid}":{"delete":{"operationId":"api_v1crmticket-links_ulid_delete","tags":["CrmTicketLink"],"responses":{"204":{"description":"CrmTicketLink resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CrmTicketLink resource.","description":"Removes the CrmTicketLink resource.","parameters":[{"name":"ulid","in":"path","description":"CrmTicketLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/csat-ratings":{"get":{"operationId":"api_v1csat-ratings_get_collection","tags":["CsatRating"],"responses":{"200":{"description":"CsatRating collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CsatRating-csat.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CsatRating.jsonld-csat.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CsatRating.jsonld-csat.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CsatRating resources.","description":"Retrieves the collection of CsatRating resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"workItemId","in":"query","description":"WorkItem-ID (numerisch) des Tickets","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"ratedOnly","in":"query","description":"Nur abgegebene Bewertungen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"order[ratedAt]","in":"query","description":"Sortierung nach Bewertungszeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/csat-ratings/{ulid}":{"get":{"operationId":"api_v1csat-ratings_ulid_get","tags":["CsatRating"],"responses":{"200":{"description":"CsatRating resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsatRating-csat.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CsatRating.jsonld-csat.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CsatRating resource.","description":"Retrieves a CsatRating resource.","parameters":[{"name":"ulid","in":"path","description":"CsatRating identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/tickets/public/csat":{"post":{"operationId":"csat_submit","tags":["CsatRating"],"responses":{"201":{"description":"CsatRating resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsatRating-csat.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CsatRating.jsonld-csat.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CsatRating resource.","description":"Creates a CsatRating resource.","parameters":[],"requestBody":{"description":"The new CsatRating resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsatRating-csat.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CsatRating-csat.write"}}},"required":true}}},"/api/v1/commerce/currencies":{"get":{"operationId":"commerce_currency_options","tags":["CurrencyOption"],"responses":{"200":{"description":"CurrencyOption resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrencyOption-currency_option.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CurrencyOption.jsonld-currency_option.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verfügbare Belegwährungen","description":"Liefert `{base, multiCurrency, currencies}`. Ohne aktives Mehrwährungs-Modul ist `multiCurrency` false und `currencies` genau `[\"EUR\"]` — eine Oberfläche blendet die Auswahl dann aus, statt eine leere Liste anzubieten. Eine Währung erscheint hier erst, wenn für sie ein Kurs im Kursbuch steht; ohne Kurs entsteht ohnehin kein Beleg (422).","parameters":[]}},"/api/v1/custom-field-definitions":{"get":{"operationId":"api_v1custom-field-definitions_get_collection","tags":["CustomFieldDefinitionResource"],"responses":{"200":{"description":"CustomFieldDefinitionResource collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldDefinitionResource-custom_field_definition.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomFieldDefinitionResource.jsonld-custom_field_definition.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldDefinitionResource.jsonld-custom_field_definition.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomFieldDefinitionResource resources.","description":"Retrieves the collection of CustomFieldDefinitionResource resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"entityType","in":"query","description":"Ziel-Entitätstyp (targetEntity, exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Feldname und Label (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandScope","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1custom-field-definitions_post","tags":["CustomFieldDefinitionResource"],"responses":{"201":{"description":"CustomFieldDefinitionResource resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource-custom_field_definition.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource.jsonld-custom_field_definition.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CustomFieldDefinitionResource resource.","description":"Creates a CustomFieldDefinitionResource resource.","parameters":[],"requestBody":{"description":"The new CustomFieldDefinitionResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource-custom_field_definition.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource-custom_field_definition.write"}}},"required":true}}},"/api/v1/custom-field-definitions/{ulid}":{"get":{"operationId":"api_v1custom-field-definitions_ulid_get","tags":["CustomFieldDefinitionResource"],"responses":{"200":{"description":"CustomFieldDefinitionResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource-custom_field_definition.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource.jsonld-custom_field_definition.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CustomFieldDefinitionResource resource.","description":"Retrieves a CustomFieldDefinitionResource resource.","parameters":[{"name":"ulid","in":"path","description":"CustomFieldDefinitionResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1custom-field-definitions_ulid_delete","tags":["CustomFieldDefinitionResource"],"responses":{"204":{"description":"CustomFieldDefinitionResource resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CustomFieldDefinitionResource resource.","description":"Removes the CustomFieldDefinitionResource resource.","parameters":[{"name":"ulid","in":"path","description":"CustomFieldDefinitionResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1custom-field-definitions_ulid_patch","tags":["CustomFieldDefinitionResource"],"responses":{"200":{"description":"CustomFieldDefinitionResource resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource-custom_field_definition.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource.jsonld-custom_field_definition.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CustomFieldDefinitionResource resource.","description":"Updates the CustomFieldDefinitionResource resource.","parameters":[{"name":"ulid","in":"path","description":"CustomFieldDefinitionResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CustomFieldDefinitionResource resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionResource-custom_field_definition.write.jsonMergePatch"}}},"required":true}}},"/api/v1/custom-field-meta":{"get":{"operationId":"api_v1custom-field-meta_get_collection","tags":["CustomFieldMeta"],"responses":{"200":{"description":"CustomFieldMeta collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldMeta-custom_field_meta.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomFieldMeta.jsonld-custom_field_meta.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldMeta.jsonld-custom_field_meta.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomFieldMeta resources.","description":"Retrieves the collection of CustomFieldMeta resources.","parameters":[]}},"/api/v1/custom-field-values":{"get":{"operationId":"api_v1custom-field-values_get_collection","tags":["CustomFieldValue"],"responses":{"200":{"description":"CustomFieldValue collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValue-custom_field_value.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomFieldValue.jsonld-custom_field_value.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValue.jsonld-custom_field_value.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomFieldValue resources.","description":"Retrieves the collection of CustomFieldValue resources.","parameters":[{"name":"entityType","in":"query","description":"Maschinen-Schlüssel des Zielobjekt-Typs (z. B. customer, deal, ticket, work_item, employee, contract, quote, asset, supplier, license, campaign, purchase_order).","required":true,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"entityId","in":"query","description":"Numerische interne ID (PK) des Zielobjekts — NICHT die ULID.","required":true,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1custom-field-values_post","tags":["CustomFieldValue"],"responses":{"201":{"description":"CustomFieldValue resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldValue-custom_field_value.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomFieldValue.jsonld-custom_field_value.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CustomFieldValue resource.","description":"Creates a CustomFieldValue resource.","parameters":[],"requestBody":{"description":"The new CustomFieldValue resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldValue-custom_field_value.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomFieldValue-custom_field_value.write"}}},"required":true}}},"/api/v1/customers":{"get":{"operationId":"api_v1customers_get_collection","tags":["Customer"],"responses":{"200":{"description":"Customer collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Customer-customer.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Customer.jsonld-customer.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Customer.jsonld-customer.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Customer resources.","description":"Retrieves the collection of Customer resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"search","in":"query","description":"Volltextsuche über Name und E-Mail","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Alias zu search (nur wirksam, wenn search fehlt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"type","in":"query","description":"Kundentyp (business|individual)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"industry","in":"query","description":"Branche (Teilstring-Suche)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"statusId","in":"query","description":"Kundenstatus-/Beziehungstyp-Schlüssel (z.B. prospect, active)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parentCustomerUlid","in":"query","description":"ULID des Mutterkunden — listet dessen direkte Töchter","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marke (numerische PK) — zeigt nur Kunden dieser Marke plus den markenlosen Bestand","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[type]","in":"query","description":"Sortierung nach Kundentyp (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[statusId]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[industry]","in":"query","description":"Sortierung nach Branche (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1customers_post","tags":["Customer"],"responses":{"201":{"description":"Customer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer-customer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Customer.jsonld-customer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Customer resource.","description":"Creates a Customer resource.","parameters":[],"requestBody":{"description":"The new Customer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer-customer.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Customer-customer.write"}}},"required":true}}},"/api/v1/customers/{ulid}":{"get":{"operationId":"api_v1customers_ulid_get","tags":["Customer"],"responses":{"200":{"description":"Customer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer-customer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Customer.jsonld-customer.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Customer resource.","description":"Retrieves a Customer resource.","parameters":[{"name":"ulid","in":"path","description":"Customer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1customers_ulid_delete","tags":["Customer"],"responses":{"204":{"description":"Customer resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Customer resource.","description":"Removes the Customer resource.","parameters":[{"name":"ulid","in":"path","description":"Customer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1customers_ulid_patch","tags":["Customer"],"responses":{"200":{"description":"Customer resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer-customer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Customer.jsonld-customer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Customer resource.","description":"Updates the Customer resource.","parameters":[{"name":"ulid","in":"path","description":"Customer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Customer resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Customer-customer.write.jsonMergePatch"}}},"required":true}}},"/api/v1/customers/{ulid}/delivery-block":{"post":{"operationId":"customer_delivery_block","tags":["Customer"],"responses":{"201":{"description":"Customer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer-customer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Customer.jsonld-customer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Liefersperre setzen oder aufheben","description":"Liefersperre setzen (`reason` Pflicht) oder mit `release: true` aufheben. Die Auftragsampel steht daraufhin rot, und der Autoversand überspringt die Aufträge dieses Partners.","parameters":[{"name":"ulid","in":"path","description":"Customer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Customer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer-customer.delivery_block"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Customer-customer.delivery_block"}}},"required":true}}},"/api/v1/customers/{ulid}/merge":{"post":{"operationId":"customer_merge","tags":["Customer"],"responses":{"201":{"description":"Customer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer-customer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Customer.jsonld-customer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Merge customer","description":"Merge customer. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Customer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Customer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Customer-customer.merge"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Customer-customer.merge"}}},"required":true}}},"/api/v1/customer-activity":{"get":{"operationId":"api_v1customer-activity_get_collection","tags":["CustomerActivity"],"responses":{"200":{"description":"CustomerActivity collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerActivity-customer_activity.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerActivity.jsonld-customer_activity.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerActivity.jsonld-customer_activity.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerActivity resources.","description":"Retrieves the collection of CustomerActivity resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"itemsPerPage","in":"query","description":"The number of items per page","required":false,"deprecated":false,"schema":{"type":"integer","default":30,"minimum":0,"maximum":100},"style":"form","explode":true},{"name":"customerUlid","in":"query","description":"Kunden-ULID. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"types","in":"query","description":"Berührungsarten als Komma-Liste (email, call, meeting, note, chat, comment, task, system). Leer = alle; unbekannte Tokens werden ignoriert","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/customer-duplicates":{"get":{"operationId":"api_v1customer-duplicates_get_collection","tags":["CustomerDuplicateGroup"],"responses":{"200":{"description":"CustomerDuplicateGroup collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerDuplicateGroup-customer_duplicate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerDuplicateGroup.jsonld-customer_duplicate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerDuplicateGroup.jsonld-customer_duplicate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerDuplicateGroup resources.","description":"Retrieves the collection of CustomerDuplicateGroup resources.","parameters":[]}},"/api/v1/customer-groups":{"get":{"operationId":"api_v1customer-groups_get_collection","tags":["CustomerGroup"],"responses":{"200":{"description":"CustomerGroup collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerGroup-customer_group.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerGroup.jsonld-customer_group.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerGroup.jsonld-customer_group.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerGroup resources.","description":"Retrieves the collection of CustomerGroup resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Gruppen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Name und Key","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1customer-groups_post","tags":["CustomerGroup"],"responses":{"201":{"description":"CustomerGroup resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroup-customer_group.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroup.jsonld-customer_group.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CustomerGroup resource.","description":"Creates a CustomerGroup resource.","parameters":[],"requestBody":{"description":"The new CustomerGroup resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroup-customer_group.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroup-customer_group.write"}}},"required":true}}},"/api/v1/customer-groups/preview-rule":{"post":{"operationId":"api_v1customer-groupspreview-rule_post","tags":["CustomerGroup"],"responses":{"200":{"description":"CustomerGroup resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroup.RulePreviewResource-customer_group.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroup.RulePreviewResource.jsonld-customer_group.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Auto-Zuordnungs-Regel vorab auswerten","description":"Liefert Trefferzahl und eine Stichprobe der Kunden, auf die die Regel zutraefe — ohne etwas zu speichern.","parameters":[],"requestBody":{"description":"The new CustomerGroup resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroup-customer_group.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroup-customer_group.write"}}},"required":true}}},"/api/v1/customer-groups/{ulid}":{"get":{"operationId":"api_v1customer-groups_ulid_get","tags":["CustomerGroup"],"responses":{"200":{"description":"CustomerGroup resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroup-customer_group.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroup.jsonld-customer_group.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CustomerGroup resource.","description":"Retrieves a CustomerGroup resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroup identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1customer-groups_ulid_delete","tags":["CustomerGroup"],"responses":{"204":{"description":"CustomerGroup resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CustomerGroup resource.","description":"Removes the CustomerGroup resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroup identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1customer-groups_ulid_patch","tags":["CustomerGroup"],"responses":{"200":{"description":"CustomerGroup resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroup-customer_group.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroup.jsonld-customer_group.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CustomerGroup resource.","description":"Updates the CustomerGroup resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroup identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CustomerGroup resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CustomerGroup-customer_group.write.jsonMergePatch"}}},"required":true}}},"/api/v1/customer-groups/{ulid}/members":{"get":{"operationId":"api_v1customer-groups_ulidmembers_get_collection","tags":["CustomerGroupMember"],"responses":{"200":{"description":"CustomerGroupMember collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerGroupMember-customer_group_member.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerGroupMember.jsonld-customer_group_member.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerGroupMember.jsonld-customer_group_member.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerGroupMember resources.","description":"Retrieves the collection of CustomerGroupMember resources.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupMember identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"customer_group_member_add","tags":["CustomerGroupMember"],"responses":{"201":{"description":"CustomerGroupMember resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupMember-customer_group_member.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroupMember.jsonld-customer_group_member.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kunde der Gruppe zuordnen","description":"Ordnet einen Kunden (`customerUlid`) der Gruppe zu. Idempotent je Gruppe und Kunde.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupMember identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CustomerGroupMember resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupMember-customer_group_member.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroupMember-customer_group_member.write"}}},"required":true}}},"/api/v1/customer-groups/{ulid}/members/{memberUlid}":{"delete":{"operationId":"api_v1customer-groups_ulidmembers_memberUlid_delete","tags":["CustomerGroupMember"],"responses":{"204":{"description":"CustomerGroupMember resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CustomerGroupMember resource.","description":"Removes the CustomerGroupMember resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupMember identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"memberUlid","in":"path","description":"CustomerGroupMember identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/customer-groups/{ulid}/price-rules":{"get":{"operationId":"api_v1customer-groups_ulidprice-rules_get_collection","tags":["CustomerGroupPriceRule"],"responses":{"200":{"description":"CustomerGroupPriceRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerGroupPriceRule-customer_group_price_rule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerGroupPriceRule.jsonld-customer_group_price_rule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerGroupPriceRule.jsonld-customer_group_price_rule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerGroupPriceRule resources.","description":"Retrieves the collection of CustomerGroupPriceRule resources.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupPriceRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"customer_group_price_rule_add","tags":["CustomerGroupPriceRule"],"responses":{"201":{"description":"CustomerGroupPriceRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupPriceRule-customer_group_price_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroupPriceRule.jsonld-customer_group_price_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Preisregel der Gruppe anlegen","description":"Legt eine Preisregel der Gruppe an. `percent` ist Prozent mal 100, `fixed` ein Stückpreis in Cent.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupPriceRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CustomerGroupPriceRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupPriceRule-customer_group_price_rule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroupPriceRule-customer_group_price_rule.write"}}},"required":true}}},"/api/v1/customer-groups/{ulid}/price-rules/{ruleUlid}":{"delete":{"operationId":"api_v1customer-groups_ulidprice-rules_ruleUlid_delete","tags":["CustomerGroupPriceRule"],"responses":{"204":{"description":"CustomerGroupPriceRule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CustomerGroupPriceRule resource.","description":"Removes the CustomerGroupPriceRule resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupPriceRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ruleUlid","in":"path","description":"CustomerGroupPriceRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1customer-groups_ulidprice-rules_ruleUlid_patch","tags":["CustomerGroupPriceRule"],"responses":{"200":{"description":"CustomerGroupPriceRule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupPriceRule-customer_group_price_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroupPriceRule.jsonld-customer_group_price_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CustomerGroupPriceRule resource.","description":"Updates the CustomerGroupPriceRule resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupPriceRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ruleUlid","in":"path","description":"CustomerGroupPriceRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CustomerGroupPriceRule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CustomerGroupPriceRule-customer_group_price_rule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/customer-groups/{ulid}/visibility":{"get":{"operationId":"api_v1customer-groups_ulidvisibility_get_collection","tags":["CustomerGroupVisibility"],"responses":{"200":{"description":"CustomerGroupVisibility collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerGroupVisibility-customer_group_visibility.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerGroupVisibility.jsonld-customer_group_visibility.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerGroupVisibility.jsonld-customer_group_visibility.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerGroupVisibility resources.","description":"Retrieves the collection of CustomerGroupVisibility resources.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupVisibility identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"customer_group_visibility_upsert","tags":["CustomerGroupVisibility"],"responses":{"201":{"description":"CustomerGroupVisibility resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupVisibility-customer_group_visibility.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroupVisibility.jsonld-customer_group_visibility.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sichtbarkeit der Gruppe setzen","description":"Setzt die Sichtbarkeit je Gruppe, Geltungsbereich und Referenz neu (Upsert).","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupVisibility identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CustomerGroupVisibility resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerGroupVisibility-customer_group_visibility.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerGroupVisibility-customer_group_visibility.write"}}},"required":true}}},"/api/v1/customer-groups/{ulid}/visibility/{visibilityUlid}":{"delete":{"operationId":"api_v1customer-groups_ulidvisibility_visibilityUlid_delete","tags":["CustomerGroupVisibility"],"responses":{"204":{"description":"CustomerGroupVisibility resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CustomerGroupVisibility resource.","description":"Removes the CustomerGroupVisibility resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerGroupVisibility identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"visibilityUlid","in":"path","description":"CustomerGroupVisibility identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/customer-activity-frequency":{"get":{"operationId":"api_v1customer-activity-frequency_get_collection","tags":["CustomerInteractionFrequency"],"responses":{"200":{"description":"CustomerInteractionFrequency collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerInteractionFrequency-customer_frequency.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerInteractionFrequency.jsonld-customer_frequency.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerInteractionFrequency.jsonld-customer_frequency.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerInteractionFrequency resources.","description":"Retrieves the collection of CustomerInteractionFrequency resources.","parameters":[{"name":"customerUlid","in":"query","description":"Kunden-ULID. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/customer-prices":{"get":{"operationId":"api_v1customer-prices_get_collection","tags":["CustomerPriceList"],"responses":{"200":{"description":"CustomerPriceList collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerPriceList-customer_price_list.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerPriceList.jsonld-customer_price_list.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerPriceList.jsonld-customer_price_list.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerPriceList resources.","description":"Retrieves the collection of CustomerPriceList resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Preislisten","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"Namens-Teilsuche (z. B. für Auswahl-Picker)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marke (numerische PK) — zeigt nur Preislisten dieser Marke plus die markenlosen","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1customer-prices_post","tags":["CustomerPriceList"],"responses":{"201":{"description":"CustomerPriceList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList-customer_price_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList.jsonld-customer_price_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CustomerPriceList resource.","description":"Creates a CustomerPriceList resource.","parameters":[],"requestBody":{"description":"The new CustomerPriceList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList-customer_price_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList-customer_price_list.write"}}},"required":true}}},"/api/v1/customer-prices/{ulid}":{"get":{"operationId":"api_v1customer-prices_ulid_get","tags":["CustomerPriceList"],"responses":{"200":{"description":"CustomerPriceList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList-customer_price_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList.jsonld-customer_price_list.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CustomerPriceList resource.","description":"Retrieves a CustomerPriceList resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerPriceList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1customer-prices_ulid_delete","tags":["CustomerPriceList"],"responses":{"204":{"description":"CustomerPriceList resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CustomerPriceList resource.","description":"Removes the CustomerPriceList resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerPriceList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1customer-prices_ulid_patch","tags":["CustomerPriceList"],"responses":{"200":{"description":"CustomerPriceList resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList-customer_price_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList.jsonld-customer_price_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CustomerPriceList resource.","description":"Updates the CustomerPriceList resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerPriceList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CustomerPriceList resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CustomerPriceList-customer_price_list.write.jsonMergePatch"}}},"required":true}}},"/api/v1/customers/{ulid}/related-organizations":{"get":{"operationId":"api_v1customers_ulidrelated-organizations_get_collection","tags":["CustomerRelation"],"responses":{"200":{"description":"CustomerRelation collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerRelation-customer_relation.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerRelation.jsonld-customer_relation.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerRelation.jsonld-customer_relation.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerRelation resources.","description":"Retrieves the collection of CustomerRelation resources.","parameters":[{"name":"ulid","in":"path","description":"CustomerRelation identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1customers_ulidrelated-organizations_post","tags":["CustomerRelation"],"responses":{"200":{"description":"CustomerRelation resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerRelation-customer_relation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerRelation.jsonld-customer_relation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Organisation mit dem Kunden verknüpfen","description":"Verknüpft den Kunden symmetrisch mit einer weiteren Organisation (`relatedUlid`) — die Beziehung ist danach von beiden Seiten sichtbar.","parameters":[{"name":"ulid","in":"path","description":"CustomerRelation identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new CustomerRelation resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerRelation-customer_relation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerRelation-customer_relation.write"}}},"required":true}}},"/api/v1/customers/{ulid}/related-organizations/{relatedUlid}":{"delete":{"operationId":"api_v1customers_ulidrelated-organizations_relatedUlid_delete","tags":["CustomerRelation"],"responses":{"204":{"description":"CustomerRelation resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CustomerRelation resource.","description":"Removes the CustomerRelation resource.","parameters":[{"name":"ulid","in":"path","description":"CustomerRelation identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"relatedUlid","in":"path","description":"CustomerRelation identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/customer-statuses":{"get":{"operationId":"api_v1customer-statuses_get_collection","tags":["CustomerStatus"],"responses":{"200":{"description":"CustomerStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerStatus-customer_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"CustomerStatus.jsonld-customer_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/CustomerStatus.jsonld-customer_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of CustomerStatus resources.","description":"Retrieves the collection of CustomerStatus resources.","parameters":[]},"post":{"operationId":"api_v1customer-statuses_post","tags":["CustomerStatus"],"responses":{"201":{"description":"CustomerStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerStatus-customer_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerStatus.jsonld-customer_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a CustomerStatus resource.","description":"Creates a CustomerStatus resource.","parameters":[],"requestBody":{"description":"The new CustomerStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerStatus-customer_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerStatus-customer_status.write"}}},"required":true}}},"/api/v1/customer-statuses/{key}":{"get":{"operationId":"api_v1customer-statuses_key_get","tags":["CustomerStatus"],"responses":{"200":{"description":"CustomerStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerStatus-customer_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerStatus.jsonld-customer_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a CustomerStatus resource.","description":"Retrieves a CustomerStatus resource.","parameters":[{"name":"key","in":"path","description":"CustomerStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1customer-statuses_key_delete","tags":["CustomerStatus"],"responses":{"204":{"description":"CustomerStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the CustomerStatus resource.","description":"Removes the CustomerStatus resource.","parameters":[{"name":"key","in":"path","description":"CustomerStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1customer-statuses_key_patch","tags":["CustomerStatus"],"responses":{"200":{"description":"CustomerStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerStatus-customer_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/CustomerStatus.jsonld-customer_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the CustomerStatus resource.","description":"Updates the CustomerStatus resource.","parameters":[{"name":"key","in":"path","description":"CustomerStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated CustomerStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/CustomerStatus-customer_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/deals":{"get":{"operationId":"api_v1crmdeals_get_collection","tags":["Deal"],"responses":{"200":{"description":"Deal collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Deal-deal.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Deal.jsonld-deal.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Deal.jsonld-deal.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Deal resources.","description":"Retrieves the collection of Deal resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"stageId","in":"query","description":"Pipeline-Stufen-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"pipelineId","in":"query","description":"Pipeline-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"ownerId","in":"query","description":"Verantwortliche/r (User-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"search","in":"query","description":"Volltextsuche über den Titel","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Alias zu search (nur wirksam, wenn search fehlt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[valueAmount]","in":"query","description":"Sortierung nach Wert (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[weightedValue]","in":"query","description":"Sortierung nach gewichtetem Wert (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[probability]","in":"query","description":"Sortierung nach Wahrscheinlichkeit (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[expectedCloseDate]","in":"query","description":"Sortierung nach erwartetem Abschlussdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[cf.<feldschlüssel>]","in":"query","description":"Sortierung nach einem materialisierten Formelfeld (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"cfMin[<feldschlüssel>]","in":"query","description":"Formelfeld-Untergrenze (numerisch, inklusiv)","required":false,"deprecated":false,"schema":{"type":"number"},"style":"form","explode":true},{"name":"cfMax[<feldschlüssel>]","in":"query","description":"Formelfeld-Obergrenze (numerisch, inklusiv)","required":false,"deprecated":false,"schema":{"type":"number"},"style":"form","explode":true},{"name":"cfEq[<feldschlüssel>]","in":"query","description":"Formelfeld exakter Wert (Zahl oder Text)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1crmdeals_post","tags":["Deal"],"responses":{"201":{"description":"Deal resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal-deal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Deal.jsonld-deal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Deal resource.","description":"Creates a Deal resource.","parameters":[],"requestBody":{"description":"The new Deal resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal-deal.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Deal-deal.write"}}},"required":true}}},"/api/v1/crm/deals/{ulid}":{"get":{"operationId":"api_v1crmdeals_ulid_get","tags":["Deal"],"responses":{"200":{"description":"Deal resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal-deal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Deal.jsonld-deal.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Deal resource.","description":"Retrieves a Deal resource.","parameters":[{"name":"ulid","in":"path","description":"Deal identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1crmdeals_ulid_delete","tags":["Deal"],"responses":{"204":{"description":"Deal resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Deal resource.","description":"Removes the Deal resource.","parameters":[{"name":"ulid","in":"path","description":"Deal identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1crmdeals_ulid_patch","tags":["Deal"],"responses":{"200":{"description":"Deal resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal-deal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Deal.jsonld-deal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Deal resource.","description":"Updates the Deal resource.","parameters":[{"name":"ulid","in":"path","description":"Deal identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Deal resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Deal-deal.write.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/deals/{ulid}/create-quote":{"post":{"operationId":"deal_create_quote","tags":["Deal"],"responses":{"201":{"description":"Deal resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal-deal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Deal.jsonld-deal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Angebot aus dem Deal erzeugen","description":"Erzeugt aus dem Deal ein Angebot im Entwurf. Verlangt zusätzlich das Anlagerecht für Angebote.","parameters":[{"name":"ulid","in":"path","description":"Deal identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Deal resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Deal-deal.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Deal-deal.write"}}},"required":true}}},"/api/v1/purchasing/delivery-avis":{"get":{"operationId":"api_v1purchasingdelivery-avis_get_collection","tags":["DeliveryAvis"],"responses":{"200":{"description":"DeliveryAvis collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DeliveryAvis.jsonld-delivery_avis.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryAvis.jsonld-delivery_avis.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DeliveryAvis resources.","description":"Retrieves the collection of DeliveryAvis resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"announced|received|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"goodsOrderId","in":"query","description":"Bestellungs-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Avisnummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1purchasingdelivery-avis_post","tags":["DeliveryAvis"],"responses":{"201":{"description":"DeliveryAvis resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis.jsonld-delivery_avis.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferavis anlegen","description":"Kopf plus `packages` (`{identifier, trackingNumber, trackingUrl, weightGrams}`) und `items` (`{orderItemUlid, productId, description, qty, batchRef, expiresAt, serialRef, packageIdentifier}`). Der Paket-Identifier ist der Code, der später gescannt wird.","parameters":[],"requestBody":{"description":"The new DeliveryAvis resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.write"}}},"required":true}}},"/api/v1/purchasing/delivery-avis/resolve":{"get":{"operationId":"purchasing_avis_resolve","tags":["DeliveryAvis"],"responses":{"200":{"description":"DeliveryAvis collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DeliveryAvis.jsonld-delivery_avis.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryAvis.jsonld-delivery_avis.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Paket-Identifier zum Avis auflösen","description":"Query `?identifier=…` — der Code vom Paket (oder die Avisnummer). Antwort: das Avis MIT Einbuchungs-Vorschlag (`proposal`), also der erste und zweite Dialogschritt in einem Aufruf.","parameters":[{"name":"identifier","in":"query","description":"Gescannter Paket-Code oder Avisnummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/purchasing/delivery-avis/{ulid}":{"get":{"operationId":"api_v1purchasingdelivery-avis_ulid_get","tags":["DeliveryAvis"],"responses":{"200":{"description":"DeliveryAvis resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis.jsonld-delivery_avis.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DeliveryAvis resource.","description":"Retrieves a DeliveryAvis resource.","parameters":[{"name":"ulid","in":"path","description":"DeliveryAvis identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1purchasingdelivery-avis_ulid_delete","tags":["DeliveryAvis"],"responses":{"204":{"description":"DeliveryAvis resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the DeliveryAvis resource.","description":"Removes the DeliveryAvis resource.","parameters":[{"name":"ulid","in":"path","description":"DeliveryAvis identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1purchasingdelivery-avis_ulid_patch","tags":["DeliveryAvis"],"responses":{"200":{"description":"DeliveryAvis resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis.jsonld-delivery_avis.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the DeliveryAvis resource.","description":"Updates the DeliveryAvis resource.","parameters":[{"name":"ulid","in":"path","description":"DeliveryAvis identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated DeliveryAvis resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.write.jsonMergePatch"}}},"required":true}}},"/api/v1/purchasing/delivery-avis/{ulid}/cancel":{"post":{"operationId":"purchasing_avis_cancel","tags":["DeliveryAvis"],"responses":{"201":{"description":"DeliveryAvis resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis.jsonld-delivery_avis.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferavis verwerfen","description":"Payload `{note}` — warum die angekündigte Lieferung nicht kommt.","parameters":[{"name":"ulid","in":"path","description":"DeliveryAvis identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DeliveryAvis resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.write"}}},"required":true}}},"/api/v1/purchasing/delivery-avis/{ulid}/receive":{"post":{"operationId":"purchasing_avis_receive","tags":["DeliveryAvis"],"responses":{"201":{"description":"DeliveryAvis resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis.jsonld-delivery_avis.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferavis als Wareneingang buchen","description":"Payload `{release, deliveryNoteNumber}` — beides wird an den regulären Wareneingang durchgereicht, es gelten dieselben Hausregeln. Positionen ohne Bestellbezug werden NICHT gebucht; sie stehen mit Grund im Vorschlag.","parameters":[{"name":"ulid","in":"path","description":"DeliveryAvis identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DeliveryAvis resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryAvis-delivery_avis.write"}}},"required":true}}},"/api/v1/delivery-notes":{"get":{"operationId":"api_v1delivery-notes_get_collection","tags":["DeliveryNote"],"responses":{"200":{"description":"DeliveryNote collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DeliveryNote.jsonld-delivery_note.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryNote.jsonld-delivery_note.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DeliveryNote resources.","description":"Retrieves the collection of DeliveryNote resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"orderId","in":"query","description":"Auftrags-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Lieferschein-Nummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[number]","in":"query","description":"Sortierung nach Lieferschein-Nummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1delivery-notes_post","tags":["DeliveryNote"],"responses":{"201":{"description":"DeliveryNote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote.jsonld-delivery_note.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a DeliveryNote resource.","description":"Creates a DeliveryNote resource.","parameters":[],"requestBody":{"description":"The new DeliveryNote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.write"}}},"required":true}}},"/api/v1/delivery-notes/{ulid}":{"get":{"operationId":"api_v1delivery-notes_ulid_get","tags":["DeliveryNote"],"responses":{"200":{"description":"DeliveryNote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote.jsonld-delivery_note.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DeliveryNote resource.","description":"Retrieves a DeliveryNote resource.","parameters":[{"name":"ulid","in":"path","description":"DeliveryNote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/delivery-notes/{ulid}/commercial-invoice":{"get":{"operationId":"shipping_delivery_note_commercial_invoice","tags":["DeliveryNote"],"responses":{"204":{"description":"DeliveryNote resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Handelsrechnung (Ausfuhr-Begleitpapier) als PDF","description":"Erzeugt die Handelsrechnung zur Ausfuhr aus derselben Datengrundlage wie die Zollinhaltserklärung. Kein Ersatz für die Ausgangsrechnung — sie entsteht weiterhin in OctiInvoicing.","parameters":[{"name":"ulid","in":"path","description":"DeliveryNote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/delivery-notes/{ulid}/customs-declaration":{"get":{"operationId":"shipping_delivery_note_customs_declaration","tags":["DeliveryNote"],"responses":{"204":{"description":"DeliveryNote resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zollinhaltserklärung (CN22/CN23) als PDF","description":"Erzeugt die Zollinhaltserklärung des Lieferscheins. Das Formular (CN22 bis 2 kg und 425 € Warenwert, sonst CN23) bestimmt die Erklärung selbst. Liegt die Lieferanschrift im Zollgebiet der Union oder ist keine Position kommissioniert, antwortet die Operation mit 422.","parameters":[{"name":"ulid","in":"path","description":"DeliveryNote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/delivery-notes/{ulid}/delivered":{"post":{"operationId":"shipping_delivery_note_delivered","tags":["DeliveryNote"],"responses":{"201":{"description":"DeliveryNote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote.jsonld-delivery_note.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sendung als zugestellt vermerken","description":"Setzt alle offenen Sendungen dieses Lieferscheins auf zugestellt.","parameters":[{"name":"ulid","in":"path","description":"DeliveryNote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DeliveryNote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.write"}}},"required":true}}},"/api/v1/delivery-notes/{ulid}/pdf":{"get":{"operationId":"shipping_delivery_note_pdf","tags":["DeliveryNote"],"responses":{"204":{"description":"DeliveryNote resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DeliveryNote resource.","description":"Retrieves a DeliveryNote resource.","parameters":[{"name":"ulid","in":"path","description":"DeliveryNote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/delivery-notes/{ulid}/pick":{"post":{"operationId":"shipping_delivery_note_pick","tags":["DeliveryNote"],"responses":{"201":{"description":"DeliveryNote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote.jsonld-delivery_note.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferschein als kommissioniert vermerken","description":"Vermerkt den Lieferschein als kommissioniert (optional mit Mengen-Map je Position). Die Ware ist gepickt, aber noch nicht versendet — Bestand und Label entstehen erst beim Versenden.","parameters":[{"name":"ulid","in":"path","description":"DeliveryNote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DeliveryNote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.write"}}},"required":true}}},"/api/v1/delivery-notes/{ulid}/ship":{"post":{"operationId":"shipping_delivery_note_ship","tags":["DeliveryNote"],"responses":{"201":{"description":"DeliveryNote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote.jsonld-delivery_note.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Versenden: Sendung, Label und Bestandsabgang","description":"Erzeugt Sendung und Packstücke, holt das Carrier-Label und bucht den Bestand ab — der Punkt, ab dem die Ware das Haus verlässt.","parameters":[{"name":"ulid","in":"path","description":"DeliveryNote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DeliveryNote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DeliveryNote-delivery_note.write"}}},"required":true}}},"/api/v1/marketing/dispatch-statuses":{"get":{"operationId":"api_v1marketingdispatch-statuses_get_collection","tags":["DispatchStatus"],"responses":{"200":{"description":"DispatchStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DispatchStatus-dispatch_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DispatchStatus.jsonld-dispatch_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DispatchStatus.jsonld-dispatch_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DispatchStatus resources.","description":"Retrieves the collection of DispatchStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingdispatch-statuses_post","tags":["DispatchStatus"],"responses":{"201":{"description":"DispatchStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchStatus-dispatch_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DispatchStatus.jsonld-dispatch_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a DispatchStatus resource.","description":"Creates a DispatchStatus resource.","parameters":[],"requestBody":{"description":"The new DispatchStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchStatus-dispatch_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DispatchStatus-dispatch_status.write"}}},"required":true}}},"/api/v1/marketing/dispatch-statuses/{key}":{"get":{"operationId":"api_v1marketingdispatch-statuses_key_get","tags":["DispatchStatus"],"responses":{"200":{"description":"DispatchStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchStatus-dispatch_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DispatchStatus.jsonld-dispatch_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DispatchStatus resource.","description":"Retrieves a DispatchStatus resource.","parameters":[{"name":"key","in":"path","description":"DispatchStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1marketingdispatch-statuses_key_delete","tags":["DispatchStatus"],"responses":{"204":{"description":"DispatchStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the DispatchStatus resource.","description":"Removes the DispatchStatus resource.","parameters":[{"name":"key","in":"path","description":"DispatchStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1marketingdispatch-statuses_key_patch","tags":["DispatchStatus"],"responses":{"200":{"description":"DispatchStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchStatus-dispatch_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DispatchStatus.jsonld-dispatch_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the DispatchStatus resource.","description":"Updates the DispatchStatus resource.","parameters":[{"name":"key","in":"path","description":"DispatchStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated DispatchStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/DispatchStatus-dispatch_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/doc-topics":{"get":{"operationId":"api_v1doc-topics_get_collection","tags":["DocTopic"],"responses":{"200":{"description":"DocTopic collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocTopic-doc_topic.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DocTopic.jsonld-doc_topic.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DocTopic.jsonld-doc_topic.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Hilfe-/Doku-Themen auflisten (Index ohne Inhalt)","description":"Liefert den Themen-Index der Instanz: Schluessel, Klasse, Kanaele, Routen-Zuordnung, Titel und Zusammenfassung je Sprache — bewusst OHNE Body. Den Inhalt liefert der Einzelabruf.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"locale","in":"query","description":"Sprache der Titel/Zusammenfassungen (Default: Anfrage-Sprache, Fallback de)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"kind","in":"query","description":"Klasse: guide | module | admin | developer | reference","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"channel","in":"query","description":"Kanal: app | portal | web","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"audience","in":"query","description":"Zielgruppe: staff | portal | both","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"namespace","in":"query","description":"Namensraum (Modul-Ordner in der Quelle), z. B. crm","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status: draft | review | published","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"key","in":"query","description":"Genau ein Thema ueber seinen Schluessel (z. B. crm.deals)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Freitext ueber Schluessel, Titel und Zusammenfassung","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[sortOrder]","in":"query","description":"Sortierung nach Reihenfolge (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[key]","in":"query","description":"Sortierung nach Schluessel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1doc-topics_post","tags":["DocTopic"],"responses":{"201":{"description":"DocTopic resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocTopic.jsonld-doc_topic.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Eigenes Hilfe-Thema anlegen","description":"Legt ein instanz-eigenes Thema an (`providerKey=admin`). Themen aus der Auslieferung entstehen ausschliesslich ueber den Sync.","parameters":[],"requestBody":{"description":"The new DocTopic resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.write"}}},"required":true}}},"/api/v1/doc-topics/{ulid}":{"get":{"operationId":"api_v1doc-topics_ulid_get","tags":["DocTopic"],"responses":{"200":{"description":"DocTopic resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocTopic.jsonld-doc_topic.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ein Hilfe-/Doku-Thema mit Inhalt lesen","description":"Liefert den gerenderten Inhalt (`bodyHtml`) in der gewuenschten Sprache. Aufloesung: exakter Treffer → de → erste vorhandene Variante.","parameters":[{"name":"ulid","in":"path","description":"DocTopic identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"locale","in":"query","description":"Gewuenschte Sprache (Default: Anfrage-Sprache)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"delete":{"operationId":"api_v1doc-topics_ulid_delete","tags":["DocTopic"],"responses":{"204":{"description":"DocTopic resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Eigenes Hilfe-Thema loeschen","description":"Nur instanz-eigene Themen (`providerKey=admin`) sind loeschbar. Ausgelieferte Themen werden deaktiviert, nicht geloescht.","parameters":[{"name":"ulid","in":"path","description":"DocTopic identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1doc-topics_ulid_patch","tags":["DocTopic"],"responses":{"200":{"description":"DocTopic resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocTopic.jsonld-doc_topic.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Hilfe-Thema bearbeiten","description":"Aendert Metadaten und/oder den Inhalt EINER Sprache (`locale` + `bodyHtml` aus dem Editor bzw. `bodyMarkdown` aus einem Quell-Client). Ein Inhalts-Edit setzt `customized` fuer genau diese Sprache — der Sync laesst sie danach in Ruhe, die andere Sprache zieht weiter nach.","parameters":[{"name":"ulid","in":"path","description":"DocTopic identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated DocTopic resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.write.jsonMergePatch"}}},"required":true}}},"/api/v1/doc-topics/{ulid}/reset":{"post":{"operationId":"doc_topic_reset","tags":["DocTopic"],"responses":{"200":{"description":"DocTopic resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocTopic.jsonld-doc_topic.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Hilfe-Thema auf den Auslieferungsstand zuruecksetzen","description":"Liest die Quelldatei erneut und stellt Metadaten und Inhalte wieder her (`customized=false`). Mit `locale` nur eine Sprache. Ein instanz-eigenes Thema ohne Quelle antwortet 422.","parameters":[{"name":"ulid","in":"path","description":"DocTopic identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DocTopic resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocTopic-doc_topic.write"}}},"required":true}}},"/api/v1/document-templates/preview":{"post":{"operationId":"api_v1document-templatespreview_post","tags":["DocumentPreview"],"responses":{"201":{"description":"DocumentPreview resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentPreview-document_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentPreview.jsonld-document_preview.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a DocumentPreview resource.","description":"Creates a DocumentPreview resource.","parameters":[],"requestBody":{"description":"The new DocumentPreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentPreview-document_preview.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentPreview-document_preview.write"}}},"required":true}}},"/api/v1/document-attachments":{"get":{"operationId":"api_v1document-attachments_get_collection","tags":["DocumentStandingAttachment"],"responses":{"200":{"description":"DocumentStandingAttachment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentStandingAttachment-document_attachment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DocumentStandingAttachment.jsonld-document_attachment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DocumentStandingAttachment.jsonld-document_attachment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DocumentStandingAttachment resources.","description":"Retrieves the collection of DocumentStandingAttachment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Nur Beilagen dieser Marke (leer = markenübergreifende)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1document-attachments_post","tags":["DocumentStandingAttachment"],"responses":{"201":{"description":"DocumentStandingAttachment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment-document_attachment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment.jsonld-document_attachment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a DocumentStandingAttachment resource.","description":"Creates a DocumentStandingAttachment resource.","parameters":[],"requestBody":{"description":"The new DocumentStandingAttachment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment-document_attachment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment-document_attachment.write"}}},"required":true}}},"/api/v1/document-attachments/{ulid}":{"get":{"operationId":"api_v1document-attachments_ulid_get","tags":["DocumentStandingAttachment"],"responses":{"200":{"description":"DocumentStandingAttachment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment-document_attachment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment.jsonld-document_attachment.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DocumentStandingAttachment resource.","description":"Retrieves a DocumentStandingAttachment resource.","parameters":[{"name":"ulid","in":"path","description":"DocumentStandingAttachment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1document-attachments_ulid_delete","tags":["DocumentStandingAttachment"],"responses":{"204":{"description":"DocumentStandingAttachment resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the DocumentStandingAttachment resource.","description":"Removes the DocumentStandingAttachment resource.","parameters":[{"name":"ulid","in":"path","description":"DocumentStandingAttachment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1document-attachments_ulid_patch","tags":["DocumentStandingAttachment"],"responses":{"200":{"description":"DocumentStandingAttachment resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment-document_attachment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment.jsonld-document_attachment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the DocumentStandingAttachment resource.","description":"Updates the DocumentStandingAttachment resource.","parameters":[{"name":"ulid","in":"path","description":"DocumentStandingAttachment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated DocumentStandingAttachment resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/DocumentStandingAttachment-document_attachment.write.jsonMergePatch"}}},"required":true}}},"/api/v1/document-templates":{"get":{"operationId":"api_v1document-templates_get_collection","tags":["DocumentTemplate"],"responses":{"200":{"description":"DocumentTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentTemplate-document_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DocumentTemplate.jsonld-document_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DocumentTemplate.jsonld-document_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DocumentTemplate resources.","description":"Retrieves the collection of DocumentTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"docType","in":"query","description":"Belegtyp (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1document-templates_post","tags":["DocumentTemplate"],"responses":{"201":{"description":"DocumentTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate-document_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate.jsonld-document_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a DocumentTemplate resource.","description":"Creates a DocumentTemplate resource.","parameters":[],"requestBody":{"description":"The new DocumentTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate-document_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate-document_template.write"}}},"required":true}}},"/api/v1/document-templates/{ulid}":{"get":{"operationId":"api_v1document-templates_ulid_get","tags":["DocumentTemplate"],"responses":{"200":{"description":"DocumentTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate-document_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate.jsonld-document_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DocumentTemplate resource.","description":"Retrieves a DocumentTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"DocumentTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1document-templates_ulid_delete","tags":["DocumentTemplate"],"responses":{"204":{"description":"DocumentTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the DocumentTemplate resource.","description":"Removes the DocumentTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"DocumentTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1document-templates_ulid_patch","tags":["DocumentTemplate"],"responses":{"200":{"description":"DocumentTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate-document_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate.jsonld-document_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the DocumentTemplate resource.","description":"Updates the DocumentTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"DocumentTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated DocumentTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/DocumentTemplate-document_template.write.jsonMergePatch"}}},"required":true}}},"/api/v1/document-variables":{"get":{"operationId":"api_v1document-variables_get_collection","tags":["DocumentVariable"],"responses":{"200":{"description":"DocumentVariable collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentVariable-document_variable.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DocumentVariable.jsonld-document_variable.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DocumentVariable.jsonld-document_variable.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DocumentVariable resources.","description":"Retrieves the collection of DocumentVariable resources.","parameters":[{"name":"docType","in":"query","description":"Belegtyp: liefert dessen Variablen-Katalog; ohne Filter werden die registrierten Belegtypen geliefert","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/purchasing/dropship-dispatches":{"get":{"operationId":"api_v1purchasingdropship-dispatches_get_collection","tags":["DropshipDispatch"],"responses":{"200":{"description":"DropshipDispatch collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DropshipDispatch-purchasing_dispatch.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DropshipDispatch.jsonld-purchasing_dispatch.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DropshipDispatch.jsonld-purchasing_dispatch.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DropshipDispatch resources.","description":"Retrieves the collection of DropshipDispatch resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"goodsOrderId","in":"query","description":"Nur Meldungen zu dieser Bestellung","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"sourceSalesOrderId","in":"query","description":"Nur Meldungen zu diesem Kundenauftrag — „wo ist das Paket meines Kunden\"","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/purchasing/orders/{ulid}/dropship-dispatch":{"post":{"operationId":"purchasing_dropship_dispatch","tags":["DropshipDispatch"],"responses":{"201":{"description":"DropshipDispatch resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DropshipDispatch-purchasing_dispatch.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DropshipDispatch.jsonld-purchasing_dispatch.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Versandmeldung des Lieferanten zu einer Strecken-Bestellung","description":"Payload `{trackingNumber, items: {<Positions-ULID>: Menge}, carrier?, trackingUrl?, note?}`. Schreibt den Fortschritt auf Bestellung UND Herkunfts-Kundenauftrag fort — **ohne** Bestandsbuchung, denn die Ware lief nie über das eigene Lager. Mehr als bestellt wird abgewiesen (422).","parameters":[{"name":"ulid","in":"path","description":"DropshipDispatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DropshipDispatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DropshipDispatch-purchasing_dispatch.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DropshipDispatch-purchasing_dispatch.write"}}},"required":true}}},"/api/v1/dsgvo/data-requests":{"get":{"operationId":"api_v1dsgvodata-requests_get_collection","tags":["DsgvoDataRequest"],"responses":{"200":{"description":"DsgvoDataRequest collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DsgvoDataRequest.jsonld-dsgvo_request.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DsgvoDataRequest.jsonld-dsgvo_request.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DsgvoDataRequest resources.","description":"Retrieves the collection of DsgvoDataRequest resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1dsgvodata-requests_post","tags":["DsgvoDataRequest"],"responses":{"201":{"description":"DsgvoDataRequest resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest.jsonld-dsgvo_request.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a DsgvoDataRequest resource.","description":"Creates a DsgvoDataRequest resource.","parameters":[],"requestBody":{"description":"The new DsgvoDataRequest resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write"}}},"required":true}}},"/api/v1/dsgvo/data-requests/{ulid}":{"get":{"operationId":"api_v1dsgvodata-requests_ulid_get","tags":["DsgvoDataRequest"],"responses":{"200":{"description":"DsgvoDataRequest resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest.jsonld-dsgvo_request.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DsgvoDataRequest resource.","description":"Retrieves a DsgvoDataRequest resource.","parameters":[{"name":"ulid","in":"path","description":"DsgvoDataRequest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1dsgvodata-requests_ulid_delete","tags":["DsgvoDataRequest"],"responses":{"204":{"description":"DsgvoDataRequest resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the DsgvoDataRequest resource.","description":"Removes the DsgvoDataRequest resource.","parameters":[{"name":"ulid","in":"path","description":"DsgvoDataRequest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1dsgvodata-requests_ulid_patch","tags":["DsgvoDataRequest"],"responses":{"200":{"description":"DsgvoDataRequest resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest.jsonld-dsgvo_request.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the DsgvoDataRequest resource.","description":"Updates the DsgvoDataRequest resource.","parameters":[{"name":"ulid","in":"path","description":"DsgvoDataRequest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated DsgvoDataRequest resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write.jsonMergePatch"}}},"required":true}}},"/api/v1/dsgvo/data-requests/{ulid}/erase":{"post":{"operationId":"dsgvo_data_request_erase","tags":["DsgvoDataRequest"],"responses":{"201":{"description":"DsgvoDataRequest resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest.jsonld-dsgvo_request.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Löschung bzw. Anonymisierung ausführen (Art. 17)","description":"Führt die Löschung bzw. Anonymisierung zur Betroffenen-Anfrage aus und setzt sie auf done. NICHT rückgängig zu machen.","parameters":[{"name":"ulid","in":"path","description":"DsgvoDataRequest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DsgvoDataRequest resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write"}}},"required":true}}},"/api/v1/dsgvo/data-requests/{ulid}/export":{"post":{"operationId":"dsgvo_data_request_export","tags":["DsgvoDataRequest"],"responses":{"201":{"description":"DsgvoDataRequest resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest.jsonld-dsgvo_request.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Auskunft erzeugen (Art. 15)","description":"Stellt die Betroffenen-Daten zusammen, legt das Auskunfts-JSON im DMS ab und schiebt die Anfrage im Status weiter.","parameters":[{"name":"ulid","in":"path","description":"DsgvoDataRequest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DsgvoDataRequest resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write"}}},"required":true}}},"/api/v1/dsgvo/data-requests/{ulid}/export-file":{"get":{"operationId":"dsgvo_data_request_export_file","tags":["DsgvoDataRequest"],"responses":{"204":{"description":"DsgvoDataRequest resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DsgvoDataRequest resource.","description":"Retrieves a DsgvoDataRequest resource.","parameters":[{"name":"ulid","in":"path","description":"DsgvoDataRequest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/dsgvo/data-requests/{ulid}/rectify":{"post":{"operationId":"dsgvo_data_request_rectify","tags":["DsgvoDataRequest"],"responses":{"201":{"description":"DsgvoDataRequest resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest.jsonld-dsgvo_request.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Berichtigung fortschreiben (Art. 16)","description":"Berichtigt die Stammdaten des Betroffenen aus `corrections` und setzt die Anfrage auf done.","parameters":[{"name":"ulid","in":"path","description":"DsgvoDataRequest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DsgvoDataRequest resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.rectify"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.rectify"}}},"required":true}}},"/api/v1/dsgvo/data-requests/{ulid}/reject":{"post":{"operationId":"dsgvo_data_request_reject","tags":["DsgvoDataRequest"],"responses":{"201":{"description":"DsgvoDataRequest resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest.jsonld-dsgvo_request.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Betroffenen-Anfrage ablehnen","description":"Schließt die DSGVO-Anfrage endgültig als `rejected` ab — es wird weder ausgekunftet noch gelöscht oder berichtigt. Die Ablehnung wird als Compliance-Entscheidung protokolliert; Weiterbearbeiten setzt eine NEUE Anfrage voraus.","parameters":[{"name":"ulid","in":"path","description":"DsgvoDataRequest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new DsgvoDataRequest resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoDataRequest-dsgvo_request.write"}}},"required":true}}},"/api/v1/dsgvo/retention-entity-types":{"get":{"operationId":"api_v1dsgvoretention-entity-types_get_collection","tags":["DsgvoRetentionEntityTypeCatalog"],"responses":{"200":{"description":"DsgvoRetentionEntityTypeCatalog collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DsgvoRetentionEntityTypeCatalog-dsgvo_retention_types.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DsgvoRetentionEntityTypeCatalog.jsonld-dsgvo_retention_types.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DsgvoRetentionEntityTypeCatalog.jsonld-dsgvo_retention_types.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DsgvoRetentionEntityTypeCatalog resources.","description":"Retrieves the collection of DsgvoRetentionEntityTypeCatalog resources.","parameters":[]}},"/api/v1/dsgvo/retention-policies":{"get":{"operationId":"api_v1dsgvoretention-policies_get_collection","tags":["DsgvoRetentionPolicy"],"responses":{"200":{"description":"DsgvoRetentionPolicy collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DsgvoRetentionPolicy-dsgvo_retention.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DsgvoRetentionPolicy.jsonld-dsgvo_retention.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DsgvoRetentionPolicy.jsonld-dsgvo_retention.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DsgvoRetentionPolicy resources.","description":"Retrieves the collection of DsgvoRetentionPolicy resources.","parameters":[]},"post":{"operationId":"api_v1dsgvoretention-policies_post","tags":["DsgvoRetentionPolicy"],"responses":{"201":{"description":"DsgvoRetentionPolicy resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy-dsgvo_retention.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy.jsonld-dsgvo_retention.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a DsgvoRetentionPolicy resource.","description":"Creates a DsgvoRetentionPolicy resource.","parameters":[],"requestBody":{"description":"The new DsgvoRetentionPolicy resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy-dsgvo_retention.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy-dsgvo_retention.write"}}},"required":true}}},"/api/v1/dsgvo/retention-policies/{ulid}":{"get":{"operationId":"api_v1dsgvoretention-policies_ulid_get","tags":["DsgvoRetentionPolicy"],"responses":{"200":{"description":"DsgvoRetentionPolicy resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy-dsgvo_retention.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy.jsonld-dsgvo_retention.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DsgvoRetentionPolicy resource.","description":"Retrieves a DsgvoRetentionPolicy resource.","parameters":[{"name":"ulid","in":"path","description":"DsgvoRetentionPolicy identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1dsgvoretention-policies_ulid_delete","tags":["DsgvoRetentionPolicy"],"responses":{"204":{"description":"DsgvoRetentionPolicy resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the DsgvoRetentionPolicy resource.","description":"Removes the DsgvoRetentionPolicy resource.","parameters":[{"name":"ulid","in":"path","description":"DsgvoRetentionPolicy identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1dsgvoretention-policies_ulid_patch","tags":["DsgvoRetentionPolicy"],"responses":{"200":{"description":"DsgvoRetentionPolicy resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy-dsgvo_retention.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy.jsonld-dsgvo_retention.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the DsgvoRetentionPolicy resource.","description":"Updates the DsgvoRetentionPolicy resource.","parameters":[{"name":"ulid","in":"path","description":"DsgvoRetentionPolicy identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated DsgvoRetentionPolicy resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/DsgvoRetentionPolicy-dsgvo_retention.write.jsonMergePatch"}}},"required":true}}},"/api/v1/dunning-levels":{"get":{"operationId":"api_v1dunning-levels_get_collection","tags":["DunningLevel"],"responses":{"200":{"description":"DunningLevel collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DunningLevel-dunning_level.read"}}},"application/ld+json":{"schema":{"type":"object","description":"DunningLevel.jsonld-dunning_level.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/DunningLevel.jsonld-dunning_level.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of DunningLevel resources.","description":"Retrieves the collection of DunningLevel resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1dunning-levels_post","tags":["DunningLevel"],"responses":{"201":{"description":"DunningLevel resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DunningLevel-dunning_level.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DunningLevel.jsonld-dunning_level.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a DunningLevel resource.","description":"Creates a DunningLevel resource.","parameters":[],"requestBody":{"description":"The new DunningLevel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DunningLevel-dunning_level.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DunningLevel-dunning_level.write"}}},"required":true}}},"/api/v1/dunning-levels/{ulid}":{"get":{"operationId":"api_v1dunning-levels_ulid_get","tags":["DunningLevel"],"responses":{"200":{"description":"DunningLevel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DunningLevel-dunning_level.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DunningLevel.jsonld-dunning_level.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a DunningLevel resource.","description":"Retrieves a DunningLevel resource.","parameters":[{"name":"ulid","in":"path","description":"DunningLevel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1dunning-levels_ulid_delete","tags":["DunningLevel"],"responses":{"204":{"description":"DunningLevel resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the DunningLevel resource.","description":"Removes the DunningLevel resource.","parameters":[{"name":"ulid","in":"path","description":"DunningLevel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1dunning-levels_ulid_patch","tags":["DunningLevel"],"responses":{"200":{"description":"DunningLevel resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DunningLevel-dunning_level.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/DunningLevel.jsonld-dunning_level.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the DunningLevel resource.","description":"Updates the DunningLevel resource.","parameters":[{"name":"ulid","in":"path","description":"DunningLevel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated DunningLevel resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/DunningLevel-dunning_level.write.jsonMergePatch"}}},"required":true}}},"/api/v1/employees":{"get":{"operationId":"api_v1employees_get_collection","tags":["Employee"],"responses":{"200":{"description":"Employee collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Employee-employee.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Employee.jsonld-employee.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Employee resources.","description":"Retrieves the collection of Employee resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Mitarbeiter-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"employmentType","in":"query","description":"Beschäftigungsart (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Vorname, Nachname, Anzeigename und E-Mail (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"skillCode","in":"query","description":"Nur Mitarbeiter mit diesem Skill","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"minLevel","in":"query","description":"Mindest-Skill-Level (nur zusammen mit skillCode, Default 1)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"includeSkills","in":"query","description":"Skill-Profile in der Antwort einbetten","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Nachname (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[lastName]","in":"query","description":"Sortierung nach Nachname (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[hiredAt]","in":"query","description":"Sortierung nach Eintrittsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1employees_post","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Employee resource.","description":"Creates a Employee resource.","parameters":[],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}":{"get":{"operationId":"api_v1employees_ulid_get","tags":["Employee"],"responses":{"200":{"description":"Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Employee resource.","description":"Retrieves a Employee resource.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1employees_ulid_delete","tags":["Employee"],"responses":{"204":{"description":"Employee resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Employee resource.","description":"Removes the Employee resource.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1employees_ulid_patch","tags":["Employee"],"responses":{"200":{"description":"Employee resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Employee resource.","description":"Updates the Employee resource.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Employee resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write.jsonMergePatch"}}},"required":true}}},"/api/v1/employees/{ulid}/activate":{"post":{"operationId":"employee_activate","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Activate employee","description":"Activate employee. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/cost-rate":{"post":{"operationId":"employee_cost_rate","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Datierten Kostensatz anlegen","description":"Legt einen datierten Kostensatz des Mitarbeiters an. Verlangt das Spezialrecht für Kostensätze.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/hire":{"post":{"operationId":"employee_hire","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Eintritt setzen","description":"Setzt Eintrittsdatum und Status aktiv — das Gegenstück zu /terminate.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/onboarding":{"post":{"operationId":"employee_onboarding","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Onboarding-Checkliste anstoßen","description":"Erzeugt aus der Vorlage die Onboarding-Checkliste des Mitarbeiters. Verlangt das eigene Onboarding-Recht.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/private-contact":{"post":{"operationId":"employee_private_contact","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verschlüsselte Privatkontaktdaten speichern","description":"Speichert die verschlüsselte private Kontaktablage des Mitarbeiters. Nur mit objektbezogenem Bearbeitungsrecht.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/reactivate":{"post":{"operationId":"employee_reactivate","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Reactivate employee","description":"Reactivate employee. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/set-inactive":{"post":{"operationId":"employee_set_inactive","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Mitarbeiter inaktiv setzen","description":"Setzt den Mitarbeiter inaktiv, ohne das Arbeitsverhältnis zu beenden.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/skills":{"post":{"operationId":"employee_set_skill","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Skill des Mitarbeiters setzen","description":"Setzt einen Skill des Mitarbeiters neu (Code und Level). Verlangt das eigene Skill-Recht.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/skills/remove":{"post":{"operationId":"employee_remove_skill","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Skill vom Mitarbeiter entfernen","description":"Pflichtfeld `skillCode`. Löscht die Skill-Zuordnung samt Level unwiderruflich — der Mitarbeiter fällt danach aus jeder Skill-Suche (`skillCode`/`minLevel`) und aus der Besetzungsvorschlags-Liste heraus.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/employees/{ulid}/terminate":{"post":{"operationId":"employee_terminate","tags":["Employee"],"responses":{"201":{"description":"Employee resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee.jsonld-employee.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Arbeitsverhältnis beenden (Austritt setzen)","description":"Pflichtfeld `terminatedAtInput` (Austrittsdatum). Setzt den Mitarbeiter auf Status `leaving`, friert das Austrittsdatum ein und legt die Offboarding-Checkliste an. Bereits offgeboardet: 409.","parameters":[{"name":"ulid","in":"path","description":"Employee identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Employee resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Employee-employee.write"}}},"required":true}}},"/api/v1/hr/employee-calendar-connections":{"get":{"operationId":"api_v1hremployee-calendar-connections_get_collection","tags":["EmployeeCalendarConnection"],"responses":{"200":{"description":"EmployeeCalendarConnection collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.read"}}},"application/ld+json":{"schema":{"type":"object","description":"EmployeeCalendarConnection.jsonld-emp_cal.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/EmployeeCalendarConnection.jsonld-emp_cal.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of EmployeeCalendarConnection resources.","description":"Retrieves the collection of EmployeeCalendarConnection resources.","parameters":[]},"post":{"operationId":"api_v1hremployee-calendar-connections_post","tags":["EmployeeCalendarConnection"],"responses":{"201":{"description":"EmployeeCalendarConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection.jsonld-emp_cal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a EmployeeCalendarConnection resource.","description":"Creates a EmployeeCalendarConnection resource.","parameters":[],"requestBody":{"description":"The new EmployeeCalendarConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.write"}}},"required":true}}},"/api/v1/hr/employee-calendar-connections/{ulid}":{"get":{"operationId":"api_v1hremployee-calendar-connections_ulid_get","tags":["EmployeeCalendarConnection"],"responses":{"200":{"description":"EmployeeCalendarConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection.jsonld-emp_cal.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a EmployeeCalendarConnection resource.","description":"Retrieves a EmployeeCalendarConnection resource.","parameters":[{"name":"ulid","in":"path","description":"EmployeeCalendarConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1hremployee-calendar-connections_ulid_delete","tags":["EmployeeCalendarConnection"],"responses":{"204":{"description":"EmployeeCalendarConnection resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the EmployeeCalendarConnection resource.","description":"Removes the EmployeeCalendarConnection resource.","parameters":[{"name":"ulid","in":"path","description":"EmployeeCalendarConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1hremployee-calendar-connections_ulid_patch","tags":["EmployeeCalendarConnection"],"responses":{"200":{"description":"EmployeeCalendarConnection resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection.jsonld-emp_cal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the EmployeeCalendarConnection resource.","description":"Updates the EmployeeCalendarConnection resource.","parameters":[{"name":"ulid","in":"path","description":"EmployeeCalendarConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated EmployeeCalendarConnection resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.write.jsonMergePatch"}}},"required":true}}},"/api/v1/hr/employee-calendar-connections/{ulid}/sync":{"post":{"operationId":"api_v1hremployee-calendar-connections_ulidsync_post","tags":["EmployeeCalendarConnection"],"responses":{"201":{"description":"EmployeeCalendarConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection.jsonld-emp_cal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sync employee calendar connection","description":"Sync employee calendar connection. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"EmployeeCalendarConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new EmployeeCalendarConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/EmployeeCalendarConnection-emp_cal.write"}}},"required":true}}},"/api/v1/employee-directory":{"get":{"operationId":"api_v1employee-directory_get_collection","tags":["EmployeeDirectory"],"responses":{"200":{"description":"EmployeeDirectory collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmployeeDirectory-employee_directory.read"}}},"application/ld+json":{"schema":{"type":"object","description":"EmployeeDirectory.jsonld-employee_directory.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/EmployeeDirectory.jsonld-employee_directory.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of EmployeeDirectory resources.","description":"Retrieves the collection of EmployeeDirectory resources.","parameters":[{"name":"q","in":"query","description":"Suche über Vorname, Nachname, Anzeigename und E-Mail (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/international/exchange-rates":{"get":{"operationId":"api_v1internationalexchange-rates_get_collection","tags":["ExchangeRate"],"responses":{"200":{"description":"ExchangeRate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExchangeRate-exchange_rate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ExchangeRate.jsonld-exchange_rate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ExchangeRate.jsonld-exchange_rate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ExchangeRate resources.","description":"Retrieves the collection of ExchangeRate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"currency","in":"query","description":"Nur diese Währung (ISO 4217, z. B. USD)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Kurstag ab (inklusive, Y-m-d)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Kurstag bis (inklusive, Y-m-d)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"source","in":"query","description":"Herkunft: ecb | manual","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[rateDate]","in":"query","description":"Sortierung nach Kurstag (asc|desc, Default desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1internationalexchange-rates_post","tags":["ExchangeRate"],"responses":{"201":{"description":"ExchangeRate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRate-exchange_rate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ExchangeRate.jsonld-exchange_rate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kurs von Hand setzen","description":"Payload `{currency, rateDate, rate}`. `rate` ist die Zahl der FREMDWÄHRUNGSEINHEITEN je 1 EUR (EZB-Konvention: 1 EUR = 1,0850 USD → `\"1.0850\"`). Ein bereits vorhandener Kurs desselben Tages wird überschrieben und auf `manual` gesetzt — der EZB-Import lässt handgepflegte Kurse danach in Ruhe.","parameters":[],"requestBody":{"description":"The new ExchangeRate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRate-exchange_rate.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ExchangeRate-exchange_rate.write"}}},"required":true}}},"/api/v1/international/exchange-rates/import":{"post":{"operationId":"api_v1internationalexchange-ratesimport_post","tags":["ExchangeRate"],"responses":{"201":{"description":"ExchangeRate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRate.ExchangeRateImportResult-exchange_rate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ExchangeRate.ExchangeRateImportResult.jsonld-exchange_rate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"EZB-Tagesreferenzkurse importieren","description":"Holt den Tages-Feed der Europäischen Zentralbank und schreibt ihn ins Kursbuch. Idempotent: ein zweiter Aufruf am selben Tag ändert nichts. Handgepflegte Kurse (`source=manual`) bleiben unangetastet und werden in `skipped` gezählt. Ohne Netz antwortet die Operation mit 502 und das Kursbuch bleibt, wie es war.","parameters":[],"requestBody":{"description":"The new ExchangeRate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeRate-exchange_rate.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ExchangeRate-exchange_rate.write"}}},"required":true}}},"/api/v1/time/external-entries":{"get":{"operationId":"api_v1timeexternal-entries_get_collection","tags":["ExternalTimeEntry"],"responses":{"200":{"description":"ExternalTimeEntry collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExternalTimeEntry-external_time_entry.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ExternalTimeEntry.jsonld-external_time_entry.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ExternalTimeEntry.jsonld-external_time_entry.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ExternalTimeEntry resources.","description":"Retrieves the collection of ExternalTimeEntry resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"workItemId","in":"query","description":"Vorgangs-ID (WorkItem)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID (über den zugehörigen Vorgang)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"from","in":"query","description":"Arbeitsdatum ab (inklusive, YYYY-MM-DD)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Arbeitsdatum bis (inklusive, YYYY-MM-DD)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]},"post":{"operationId":"api_v1timeexternal-entries_post","tags":["ExternalTimeEntry"],"responses":{"201":{"description":"ExternalTimeEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry-external_time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry.jsonld-external_time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ExternalTimeEntry resource.","description":"Creates a ExternalTimeEntry resource.","parameters":[],"requestBody":{"description":"The new ExternalTimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry-external_time_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry-external_time_entry.write"}}},"required":true}}},"/api/v1/time/external-entries/{ulid}":{"get":{"operationId":"api_v1timeexternal-entries_ulid_get","tags":["ExternalTimeEntry"],"responses":{"200":{"description":"ExternalTimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry-external_time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry.jsonld-external_time_entry.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ExternalTimeEntry resource.","description":"Retrieves a ExternalTimeEntry resource.","parameters":[{"name":"ulid","in":"path","description":"ExternalTimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1timeexternal-entries_ulid_delete","tags":["ExternalTimeEntry"],"responses":{"204":{"description":"ExternalTimeEntry resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ExternalTimeEntry resource.","description":"Removes the ExternalTimeEntry resource.","parameters":[{"name":"ulid","in":"path","description":"ExternalTimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1timeexternal-entries_ulid_patch","tags":["ExternalTimeEntry"],"responses":{"200":{"description":"ExternalTimeEntry resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry-external_time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry.jsonld-external_time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ExternalTimeEntry resource.","description":"Updates the ExternalTimeEntry resource.","parameters":[{"name":"ulid","in":"path","description":"ExternalTimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ExternalTimeEntry resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ExternalTimeEntry-external_time_entry.write.jsonMergePatch"}}},"required":true}}},"/api/v1/feature-flags":{"get":{"operationId":"api_v1feature-flags_get_collection","tags":["FeatureFlag"],"responses":{"200":{"description":"FeatureFlag collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeatureFlag-feature_flag.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FeatureFlag.jsonld-feature_flag.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FeatureFlag.jsonld-feature_flag.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FeatureFlag resources.","description":"Feature-Flags des Systems. Plugin-Modul-Flags (module.<plugin>) erscheinen nicht — Plugins werden über /v1/plugins aktiviert/deaktiviert.","parameters":[{"name":"search","in":"query","description":"Suche über Flag-Name und Beschreibung (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"enabled","in":"query","description":"Nur aktivierte (true) bzw. deaktivierte (false) Flags","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1feature-flags_post","tags":["FeatureFlag"],"responses":{"201":{"description":"FeatureFlag resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlag-feature_flag.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FeatureFlag.jsonld-feature_flag.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FeatureFlag resource.","description":"Feature-Flag anlegen. module.*-Namen sind system-/plugin-verwaltet → 422; Plugins werden über /v1/plugins installiert/aktiviert.","parameters":[],"requestBody":{"description":"The new FeatureFlag resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlag-feature_flag.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FeatureFlag-feature_flag.write"}}},"required":true}}},"/api/v1/feature-flags/{name}":{"get":{"operationId":"api_v1feature-flags_name_get","tags":["FeatureFlag"],"responses":{"200":{"description":"FeatureFlag resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlag-feature_flag.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FeatureFlag.jsonld-feature_flag.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FeatureFlag resource.","description":"Einzelnes Feature-Flag. Plugin-Modul-Flags (module.<plugin>) sind systemintern → 404; Plugin-Zustand liefert /v1/plugins.","parameters":[{"name":"name","in":"path","description":"FeatureFlag identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1feature-flags_name_delete","tags":["FeatureFlag"],"responses":{"204":{"description":"FeatureFlag resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the FeatureFlag resource.","description":"Feature-Flag löschen. Jedes module.*-Flag → 422: Plugin-Flags löscht ausschließlich der Plugin-Uninstall, module.portal ist Katalog-Bestand.","parameters":[{"name":"name","in":"path","description":"FeatureFlag identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1feature-flags_name_patch","tags":["FeatureFlag"],"responses":{"200":{"description":"FeatureFlag resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlag-feature_flag.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FeatureFlag.jsonld-feature_flag.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the FeatureFlag resource.","description":"Feature-Flag umschalten/bearbeiten. Plugin-Modul-Flags (module.<plugin>) → 422 (Schaltung über /v1/plugins); einzige module.*-Ausnahme ist module.portal.","parameters":[{"name":"name","in":"path","description":"FeatureFlag identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated FeatureFlag resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/FeatureFlag-feature_flag.write.jsonMergePatch"}}},"required":true}}},"/api/v1/platform/files":{"get":{"operationId":"api_v1platformfiles_get_collection","tags":["File"],"responses":{"200":{"description":"File collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/File-file.read"}}},"application/ld+json":{"schema":{"type":"object","description":"File.jsonld-file.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/File.jsonld-file.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of File resources.","description":"Retrieves the collection of File resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"folderId","in":"query","description":"Ordner-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"ownerType","in":"query","description":"Eigentümer-Typ der polymorphen Ablage (nur zusammen mit ownerId)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"ownerId","in":"query","description":"Eigentümer-ID der polymorphen Ablage (nur zusammen mit ownerType)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über den Dateinamen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1platformfiles_post","tags":["File"],"responses":{"201":{"description":"File resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File.jsonld-file.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a File resource.","description":"Creates a File resource.","parameters":[],"requestBody":{"description":"The new File resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.write_file.create"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File-file.write_file.create"}}},"required":true}}},"/api/v1/platform/files/{ulid}":{"get":{"operationId":"api_v1platformfiles_ulid_get","tags":["File"],"responses":{"200":{"description":"File resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File.jsonld-file.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a File resource.","description":"Retrieves a File resource.","parameters":[{"name":"ulid","in":"path","description":"File identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1platformfiles_ulid_delete","tags":["File"],"responses":{"204":{"description":"File resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the File resource.","description":"Removes the File resource.","parameters":[{"name":"ulid","in":"path","description":"File identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1platformfiles_ulid_patch","tags":["File"],"responses":{"200":{"description":"File resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File.jsonld-file.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the File resource.","description":"Updates the File resource.","parameters":[{"name":"ulid","in":"path","description":"File identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated File resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/File-file.write.jsonMergePatch"}}},"required":true}}},"/api/v1/platform/files/{ulid}/download":{"get":{"operationId":"file_download","tags":["File"],"responses":{"204":{"description":"File resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a File resource.","description":"Retrieves a File resource.","parameters":[{"name":"ulid","in":"path","description":"File identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"version","in":"query","description":"Versionsnummer laut …/versions; ohne Angabe die aktuelle Fassung","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/platform/files/{ulid}/move":{"post":{"operationId":"file_move","tags":["File"],"responses":{"201":{"description":"File resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File.jsonld-file.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Move file","description":"Move file. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"File identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new File resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.move"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File-file.move"}}},"required":true}}},"/api/v1/platform/files/{ulid}/restore-version":{"post":{"operationId":"file_restore_version","tags":["File"],"responses":{"201":{"description":"File resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File.jsonld-file.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ältere Dateiversion wiederherstellen","description":"Stellt eine ältere Version wieder her, indem deren Bytes als NEUE, aktuelle Version angelegt werden — überschrieben wird nichts.","parameters":[{"name":"ulid","in":"path","description":"File identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new File resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File-file.write"}}},"required":true}}},"/api/v1/platform/files/{ulid}/versions":{"get":{"operationId":"file_versions","tags":["File"],"responses":{"200":{"description":"File resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File.jsonld-file.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a File resource.","description":"Retrieves a File resource.","parameters":[{"name":"ulid","in":"path","description":"File identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"file_add_version","tags":["File"],"responses":{"201":{"description":"File resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File.jsonld-file.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Neue Dateiversion hochladen","description":"Lädt eine neue Version der Datei hoch (append-only). Die bisherige Version bleibt erhalten und abrufbar.","parameters":[{"name":"ulid","in":"path","description":"File identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new File resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/File-file.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/File-file.write"}}},"required":true}}},"/api/v1/accounting/bank-accounts":{"get":{"operationId":"api_v1accountingbank-accounts_get_collection","tags":["FinanceBankAccount"],"responses":{"200":{"description":"FinanceBankAccount collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankAccount-finance_bank_account.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceBankAccount.jsonld-finance_bank_account.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankAccount.jsonld-finance_bank_account.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceBankAccount resources.","description":"Retrieves the collection of FinanceBankAccount resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Konten","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingbank-accounts_post","tags":["FinanceBankAccount"],"responses":{"201":{"description":"FinanceBankAccount resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount-finance_bank_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount.jsonld-finance_bank_account.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceBankAccount resource.","description":"Creates a FinanceBankAccount resource.","parameters":[],"requestBody":{"description":"The new FinanceBankAccount resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount-finance_bank_account.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount-finance_bank_account.write"}}},"required":true}}},"/api/v1/accounting/bank-accounts/{ulid}":{"get":{"operationId":"api_v1accountingbank-accounts_ulid_get","tags":["FinanceBankAccount"],"responses":{"200":{"description":"FinanceBankAccount resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount-finance_bank_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount.jsonld-finance_bank_account.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceBankAccount resource.","description":"Retrieves a FinanceBankAccount resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1accountingbank-accounts_ulid_delete","tags":["FinanceBankAccount"],"responses":{"204":{"description":"FinanceBankAccount resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the FinanceBankAccount resource.","description":"Removes the FinanceBankAccount resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1accountingbank-accounts_ulid_patch","tags":["FinanceBankAccount"],"responses":{"200":{"description":"FinanceBankAccount resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount-finance_bank_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount.jsonld-finance_bank_account.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the FinanceBankAccount resource.","description":"Updates the FinanceBankAccount resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated FinanceBankAccount resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/FinanceBankAccount-finance_bank_account.write.jsonMergePatch"}}},"required":true}}},"/api/v1/accounting/bank-connections":{"get":{"operationId":"api_v1accountingbank-connections_get_collection","tags":["FinanceBankConnection"],"responses":{"200":{"description":"FinanceBankConnection collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceBankConnection.jsonld-finance_bank_connection.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankConnection.jsonld-finance_bank_connection.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceBankConnection resources.","description":"Retrieves the collection of FinanceBankConnection resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Zustand (draft | pending | active | expired | error | unknown)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"providerKey","in":"query","description":"Anbieter-Schlüssel","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingbank-connections_post","tags":["FinanceBankConnection"],"responses":{"201":{"description":"FinanceBankConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection.jsonld-finance_bank_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceBankConnection resource.","description":"Creates a FinanceBankConnection resource.","parameters":[],"requestBody":{"description":"The new FinanceBankConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.write"}}},"required":true}}},"/api/v1/accounting/bank-connections/{ulid}":{"get":{"operationId":"api_v1accountingbank-connections_ulid_get","tags":["FinanceBankConnection"],"responses":{"200":{"description":"FinanceBankConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection.jsonld-finance_bank_connection.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceBankConnection resource.","description":"Retrieves a FinanceBankConnection resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1accountingbank-connections_ulid_delete","tags":["FinanceBankConnection"],"responses":{"204":{"description":"FinanceBankConnection resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the FinanceBankConnection resource.","description":"Removes the FinanceBankConnection resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/accounting/bank-connections/{ulid}/begin":{"post":{"operationId":"finance_bank_connection_begin","tags":["FinanceBankConnection"],"responses":{"200":{"description":"FinanceBankConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection.jsonld-finance_bank_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bank-Zustimmung starten oder erneuern","description":"Startet beim Aggregator Zustimmung bzw. starke Kundenauthentifizierung. Ändert keine Kontodaten — es entsteht nichts Neues (200).","parameters":[{"name":"ulid","in":"path","description":"FinanceBankConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceBankConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.write"}}},"required":true}}},"/api/v1/accounting/bank-connections/{ulid}/refresh":{"post":{"operationId":"finance_bank_connection_refresh","tags":["FinanceBankConnection"],"responses":{"200":{"description":"FinanceBankConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection.jsonld-finance_bank_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zustand und Kontenliste neu holen","description":"Holt Status und Kontenliste beim Anbieter neu und schreibt sie an der Verknüpfung fort. Vorbedingung: eine gültige Einwilligung.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceBankConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.write"}}},"required":true}}},"/api/v1/accounting/bank-connections/{ulid}/sync":{"post":{"operationId":"finance_bank_connection_sync","tags":["FinanceBankConnection"],"responses":{"200":{"description":"FinanceBankConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection.jsonld-finance_bank_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sync bank connection","description":"Sync bank connection. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceBankConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnection-finance_bank_connection.write"}}},"required":true}}},"/api/v1/accounting/bank-connection-accounts":{"get":{"operationId":"api_v1accountingbank-connection-accounts_get_collection","tags":["FinanceBankConnectionAccount"],"responses":{"200":{"description":"FinanceBankConnectionAccount collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankConnectionAccount-finance_bank_connection_account.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceBankConnectionAccount.jsonld-finance_bank_connection_account.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankConnectionAccount.jsonld-finance_bank_connection_account.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceBankConnectionAccount resources.","description":"Retrieves the collection of FinanceBankConnectionAccount resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"connectionUlid","in":"query","description":"Nur Konten dieser Verknüpfung","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"linked","in":"query","description":"Nur zugeordnete (true) bzw. nicht zugeordnete (false) Konten","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]}},"/api/v1/accounting/bank-connection-accounts/{ulid}":{"patch":{"operationId":"api_v1accountingbank-connection-accounts_ulid_patch","tags":["FinanceBankConnectionAccount"],"responses":{"200":{"description":"FinanceBankConnectionAccount resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnectionAccount-finance_bank_connection_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnectionAccount.jsonld-finance_bank_connection_account.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the FinanceBankConnectionAccount resource.","description":"Updates the FinanceBankConnectionAccount resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankConnectionAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated FinanceBankConnectionAccount resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnectionAccount-finance_bank_connection_account.write.jsonMergePatch"}}},"required":true}}},"/api/v1/accounting/bank-connection-providers":{"get":{"operationId":"api_v1accountingbank-connection-providers_get_collection","tags":["FinanceBankConnectionProvider"],"responses":{"200":{"description":"FinanceBankConnectionProvider collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankConnectionProvider-finance_bank_provider.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceBankConnectionProvider.jsonld-finance_bank_provider.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankConnectionProvider.jsonld-finance_bank_provider.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceBankConnectionProvider resources.","description":"Retrieves the collection of FinanceBankConnectionProvider resources.","parameters":[]}},"/api/v1/accounting/bank-connection-providers/{providerKey}":{"get":{"operationId":"api_v1accountingbank-connection-providers_providerKey_get","tags":["FinanceBankConnectionProvider"],"responses":{"200":{"description":"FinanceBankConnectionProvider resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnectionProvider-finance_bank_provider.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankConnectionProvider.jsonld-finance_bank_provider.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceBankConnectionProvider resource.","description":"Retrieves a FinanceBankConnectionProvider resource.","parameters":[{"name":"providerKey","in":"path","description":"FinanceBankConnectionProvider identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/accounting/bank-accounts/{ulid}/import":{"post":{"operationId":"finance_bank_statement_import","tags":["FinanceBankStatementImport"],"responses":{"201":{"description":"FinanceBankStatementImport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankStatementImport-finance_statement_import.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankStatementImport.jsonld-finance_statement_import.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kontoauszug einlesen","description":"Liest einen Kontoauszug in dieses Bankkonto ein (`format` camt053|mt940|auto, Inhalt base64). Derselbe Auszug ein zweites Mal erzeugt keine Dubletten, sondern zählt sie unter `duplicates`.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankStatementImport identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceBankStatementImport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankStatementImport-finance_statement_import.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankStatementImport-finance_statement_import.write"}}},"required":true}}},"/api/v1/accounting/bank-transactions":{"get":{"operationId":"api_v1accountingbank-transactions_get_collection","tags":["FinanceBankTransaction"],"responses":{"200":{"description":"FinanceBankTransaction collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceBankTransaction.jsonld-finance_bank_transaction.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceBankTransaction.jsonld-finance_bank_transaction.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceBankTransaction resources.","description":"Retrieves the collection of FinanceBankTransaction resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"accountUlid","in":"query","description":"Konto-ULID — unbekannte/unzugängliche ULIDs liefern eine leere Collection","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Abgleich-Zustand (unmatched | matched | ignored)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Buchungsdatum ab (inklusive, Y-m-d)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Buchungsdatum bis (inklusive, Y-m-d)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Filter auf Verwendungszweck/Gegenpartei","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingbank-transactions_post","tags":["FinanceBankTransaction"],"responses":{"201":{"description":"FinanceBankTransaction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction.jsonld-finance_bank_transaction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceBankTransaction resource.","description":"Creates a FinanceBankTransaction resource.","parameters":[],"requestBody":{"description":"The new FinanceBankTransaction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}}},"required":true}}},"/api/v1/accounting/bank-transactions/auto-match":{"post":{"operationId":"finance_bank_transaction_auto_match","tags":["FinanceBankTransaction"],"responses":{"201":{"description":"FinanceBankTransaction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction.jsonld-finance_bank_transaction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceBankTransaction resource.","description":"Creates a FinanceBankTransaction resource.","parameters":[],"requestBody":{"description":"The new FinanceBankTransaction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}}},"required":true}}},"/api/v1/accounting/bank-transactions/{ulid}":{"get":{"operationId":"api_v1accountingbank-transactions_ulid_get","tags":["FinanceBankTransaction"],"responses":{"200":{"description":"FinanceBankTransaction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction.jsonld-finance_bank_transaction.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceBankTransaction resource.","description":"Retrieves a FinanceBankTransaction resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankTransaction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/accounting/bank-transactions/{ulid}/ignore":{"post":{"operationId":"finance_bank_transaction_ignore","tags":["FinanceBankTransaction"],"responses":{"201":{"description":"FinanceBankTransaction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction.jsonld-finance_bank_transaction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kontoumsatz als „nicht zuzuordnen\" beiseitelegen","description":"Setzt den Umsatz von `unmatched` auf `ignored` (Body optional `{note}`). Er verschwindet damit aus dem Zahlungsabgleich und aus jedem Auto-Match-Lauf — offene Rechnungen bleiben offen. Nur aus `unmatched` möglich (sonst 409); reversibel über `/unignore`.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankTransaction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceBankTransaction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}}},"required":true}}},"/api/v1/accounting/bank-transactions/{ulid}/match":{"post":{"operationId":"finance_bank_transaction_match","tags":["FinanceBankTransaction"],"responses":{"201":{"description":"FinanceBankTransaction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction.jsonld-finance_bank_transaction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Umsatz einer Rechnung zuordnen","description":"Ordnet den Bankumsatz Ausgangsrechnungen oder einer Eingangsrechnung zu und schreibt die Zahlung fort. ENDGÜLTIG — eine Rücknahme gibt es nicht (GoBD).","parameters":[{"name":"ulid","in":"path","description":"FinanceBankTransaction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceBankTransaction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}}},"required":true}}},"/api/v1/accounting/bank-transactions/{ulid}/unignore":{"post":{"operationId":"finance_bank_transaction_unignore","tags":["FinanceBankTransaction"],"responses":{"201":{"description":"FinanceBankTransaction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction.jsonld-finance_bank_transaction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ignoriert-Markierung zurücknehmen","description":"Nimmt die Ignoriert-Markierung zurück; der Umsatz erscheint wieder im offenen Abgleich.","parameters":[{"name":"ulid","in":"path","description":"FinanceBankTransaction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceBankTransaction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceBankTransaction-finance_bank_transaction.write"}}},"required":true}}},"/api/v1/accounting/cash-books":{"get":{"operationId":"api_v1accountingcash-books_get_collection","tags":["FinanceCashBook"],"responses":{"200":{"description":"FinanceCashBook collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceCashBook-finance_cash_book.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceCashBook.jsonld-finance_cash_book.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceCashBook.jsonld-finance_cash_book.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceCashBook resources.","description":"Retrieves the collection of FinanceCashBook resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true, Default) bzw. stillgelegte (false) Kassenbücher","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Nur Kassenbücher dieser Marke","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingcash-books_post","tags":["FinanceCashBook"],"responses":{"201":{"description":"FinanceCashBook resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook-finance_cash_book.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook.jsonld-finance_cash_book.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceCashBook resource.","description":"Creates a FinanceCashBook resource.","parameters":[],"requestBody":{"description":"The new FinanceCashBook resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook-finance_cash_book.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook-finance_cash_book.write"}}},"required":true}}},"/api/v1/accounting/cash-books/{ulid}":{"get":{"operationId":"api_v1accountingcash-books_ulid_get","tags":["FinanceCashBook"],"responses":{"200":{"description":"FinanceCashBook resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook-finance_cash_book.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook.jsonld-finance_cash_book.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceCashBook resource.","description":"Retrieves a FinanceCashBook resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceCashBook identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1accountingcash-books_ulid_patch","tags":["FinanceCashBook"],"responses":{"200":{"description":"FinanceCashBook resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook-finance_cash_book.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook.jsonld-finance_cash_book.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the FinanceCashBook resource.","description":"Updates the FinanceCashBook resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceCashBook identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated FinanceCashBook resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/FinanceCashBook-finance_cash_book.write.jsonMergePatch"}}},"required":true}}},"/api/v1/accounting/cash-books/{ulid}/close":{"post":{"operationId":"finance_cash_book_close","tags":["FinanceCashEntry"],"responses":{"201":{"description":"FinanceCashEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry.jsonld-finance_cash_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kassenbuch bis zu einem Tag festschreiben","description":"Schreibt den Zeitraum bis `through` (Default heute) unwiderruflich fest: danach ist in diesem Buch KEINE Buchung mehr auf oder vor diesem Tag möglich. Ein bereits abgeschlossener oder späterer Tag: 409, ein Datum in der Zukunft: 422. Die Antwort trägt den festgeschriebenen Bestand.","parameters":[{"name":"ulid","in":"path","description":"FinanceCashEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceCashEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.write"}}},"required":true}}},"/api/v1/accounting/cash-books/{ulid}/entries":{"get":{"operationId":"api_v1accountingcash-books_ulidentries_get_collection","tags":["FinanceCashEntry"],"responses":{"200":{"description":"FinanceCashEntry collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceCashEntry.jsonld-finance_cash_entry.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceCashEntry.jsonld-finance_cash_entry.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceCashEntry resources.","description":"Retrieves the collection of FinanceCashEntry resources.","parameters":[{"name":"ulid","in":"path","description":"FinanceCashEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"from","in":"query","description":"Nur Buchungen ab diesem Tag (YYYY-MM-DD)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Nur Buchungen bis einschließlich diesem Tag (YYYY-MM-DD)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]},"post":{"operationId":"finance_cash_entry_book","tags":["FinanceCashEntry"],"responses":{"201":{"description":"FinanceCashEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry.jsonld-finance_cash_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kassenzeile buchen","description":"Bucht eine Zeile in das Kassenbuch. Gebuchte Zeilen sind unveränderlich (§ 146 AO) — eine Korrektur läuft ausschließlich über eine Storno-Gegenbuchung.","parameters":[{"name":"ulid","in":"path","description":"FinanceCashEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceCashEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.write"}}},"required":true}}},"/api/v1/accounting/cash-books/{ulid}/entries/{entryUlid}/reverse":{"post":{"operationId":"finance_cash_entry_reverse","tags":["FinanceCashEntry"],"responses":{"201":{"description":"FinanceCashEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry.jsonld-finance_cash_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kassenzeile stornieren (Gegenbuchung)","description":"Legt eine NEUE Zeile mit umgekehrtem Vorzeichen an und verändert den Kassenbestand. Die Ursprungszeile bleibt unangetastet stehen (§146 AO) — beide gehen in den DATEV-Export. Es gibt kein Zurücknehmen der Stornierung. Body optional `{reason}`.","parameters":[{"name":"ulid","in":"path","description":"FinanceCashEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"entryUlid","in":"path","description":"FinanceCashEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceCashEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceCashEntry-finance_cash_entry.write"}}},"required":true}}},"/api/v1/accounting/export/file":{"get":{"operationId":"finance_datev_export_file","tags":["FinanceDatevExport"],"responses":{"204":{"description":"FinanceDatevExport resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceDatevExport resource.","description":"Retrieves a FinanceDatevExport resource.","parameters":[{"name":"from","in":"query","description":"Belegdatum ab (inklusive, Y-m-d, Pflicht)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Belegdatum bis (inklusive, Y-m-d, Pflicht)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"scope","in":"query","description":"Beleg-Auswahl: outgoing | incoming | both (Default both)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"format","in":"query","description":"Dateiformat: datev-extf (Default und einziges Format)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/accounting/export/preview":{"get":{"operationId":"finance_datev_export_preview","tags":["FinanceDatevExport"],"responses":{"200":{"description":"FinanceDatevExport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDatevExport-finance_datev_export.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDatevExport.jsonld-finance_datev_export.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceDatevExport resource.","description":"Retrieves a FinanceDatevExport resource.","parameters":[{"name":"from","in":"query","description":"Belegdatum ab (inklusive, Y-m-d, Pflicht)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Belegdatum bis (inklusive, Y-m-d, Pflicht)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"scope","in":"query","description":"Beleg-Auswahl: outgoing | incoming | both (Default both)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/accounting/direct-debit-returns":{"get":{"operationId":"api_v1accountingdirect-debit-returns_get_collection","tags":["FinanceDirectDebitReturn"],"responses":{"200":{"description":"FinanceDirectDebitReturn collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceDirectDebitReturn-finance_dd_return.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceDirectDebitReturn.jsonld-finance_dd_return.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceDirectDebitReturn.jsonld-finance_dd_return.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceDirectDebitReturn resources.","description":"Retrieves the collection of FinanceDirectDebitReturn resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"invoiceUlid","in":"query","description":"Nur Rückgaben zu dieser Ausgangsrechnung","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"sepaMandateUlid","in":"query","description":"Nur Rückgaben, die dieses Mandat betrafen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"reasonCategory","in":"query","description":"Kategorie des Rückgabegrunds (funds | mandate | technical | unknown)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingdirect-debit-returns_post","tags":["FinanceDirectDebitReturn"],"responses":{"201":{"description":"FinanceDirectDebitReturn resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDirectDebitReturn-finance_dd_return.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDirectDebitReturn.jsonld-finance_dd_return.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceDirectDebitReturn resource.","description":"Creates a FinanceDirectDebitReturn resource.","parameters":[],"requestBody":{"description":"The new FinanceDirectDebitReturn resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDirectDebitReturn-finance_dd_return.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDirectDebitReturn-finance_dd_return.write"}}},"required":true}}},"/api/v1/accounting/document-extractions":{"get":{"operationId":"api_v1accountingdocument-extractions_get_collection","tags":["FinanceDocumentExtraction"],"responses":{"200":{"description":"FinanceDocumentExtraction collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceDocumentExtraction.jsonld-finance_document_extraction.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceDocumentExtraction.jsonld-finance_document_extraction.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceDocumentExtraction resources.","description":"Retrieves the collection of FinanceDocumentExtraction resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"pending | confirmed | discarded","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"source","in":"query","description":"e_invoice | ai | none","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingdocument-extractions_post","tags":["FinanceDocumentExtraction"],"responses":{"201":{"description":"FinanceDocumentExtraction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction.jsonld-finance_document_extraction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceDocumentExtraction resource.","description":"Creates a FinanceDocumentExtraction resource.","parameters":[],"requestBody":{"description":"The new FinanceDocumentExtraction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.write"}}},"required":true}}},"/api/v1/accounting/document-extractions/{ulid}":{"get":{"operationId":"api_v1accountingdocument-extractions_ulid_get","tags":["FinanceDocumentExtraction"],"responses":{"200":{"description":"FinanceDocumentExtraction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction.jsonld-finance_document_extraction.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceDocumentExtraction resource.","description":"Retrieves a FinanceDocumentExtraction resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceDocumentExtraction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1accountingdocument-extractions_ulid_patch","tags":["FinanceDocumentExtraction"],"responses":{"200":{"description":"FinanceDocumentExtraction resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction.jsonld-finance_document_extraction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the FinanceDocumentExtraction resource.","description":"Updates the FinanceDocumentExtraction resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceDocumentExtraction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated FinanceDocumentExtraction resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.write.jsonMergePatch"}}},"required":true}}},"/api/v1/accounting/document-extractions/{ulid}/confirm":{"post":{"operationId":"finance_document_extraction_confirm","tags":["FinanceDocumentExtraction"],"responses":{"201":{"description":"FinanceDocumentExtraction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction.jsonld-finance_document_extraction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Belegerkennung bestätigen","description":"Übernimmt den bestätigten Vorschlag als Eingangsrechnung im ENTWURF. Korrekturen vorher per PATCH am Vorschlag.","parameters":[{"name":"ulid","in":"path","description":"FinanceDocumentExtraction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceDocumentExtraction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.write"}}},"required":true}}},"/api/v1/accounting/document-extractions/{ulid}/discard":{"post":{"operationId":"finance_document_extraction_discard","tags":["FinanceDocumentExtraction"],"responses":{"201":{"description":"FinanceDocumentExtraction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction.jsonld-finance_document_extraction.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Beleg-Vorschlag verwerfen","description":"Setzt den Extraktions-Vorschlag endgültig auf `discarded` (Body optional `{notes}`). Es entsteht KEINE Eingangsrechnung, und der Vorschlag lässt sich danach nicht mehr bestätigen — der Beleg muss neu eingelesen werden. Nur aus `pending` möglich (sonst 409).","parameters":[{"name":"ulid","in":"path","description":"FinanceDocumentExtraction identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceDocumentExtraction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceDocumentExtraction-finance_document_extraction.write"}}},"required":true}}},"/api/v1/accounting/incoming-invoices/import-e-invoice":{"post":{"operationId":"finance_e_invoice_import","tags":["FinanceEInvoiceImport"],"responses":{"201":{"description":"FinanceEInvoiceImport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceEInvoiceImport-finance_einvoice_import.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceEInvoiceImport.jsonld-finance_einvoice_import.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceEInvoiceImport resource.","description":"Creates a FinanceEInvoiceImport resource.","parameters":[],"requestBody":{"description":"The new FinanceEInvoiceImport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceEInvoiceImport-finance_einvoice_import.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceEInvoiceImport-finance_einvoice_import.write"}}},"required":true}}},"/api/v1/accounting/incoming-invoices":{"get":{"operationId":"api_v1accountingincoming-invoices_get_collection","tags":["FinanceIncomingInvoice"],"responses":{"200":{"description":"FinanceIncomingInvoice collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceIncomingInvoice.jsonld-finance_incoming_invoice.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceIncomingInvoice.jsonld-finance_incoming_invoice.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceIncomingInvoice resources.","description":"Retrieves the collection of FinanceIncomingInvoice resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"statusId","in":"query","description":"Status-Schlüssel (captured | approved | paid | void)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Filter auf Lieferanten-Name/Lieferanten-Rechnungsnummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Rechnungsdatum ab (inklusive, Y-m-d)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Rechnungsdatum bis (inklusive, Y-m-d)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"matchStatusId","in":"query","description":"3-Wege-Abgleich (matched | deviation | unmatched | none = nie abgeglichen)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingincoming-invoices_post","tags":["FinanceIncomingInvoice"],"responses":{"201":{"description":"FinanceIncomingInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice.jsonld-finance_incoming_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceIncomingInvoice resource.","description":"Creates a FinanceIncomingInvoice resource.","parameters":[],"requestBody":{"description":"The new FinanceIncomingInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.write"}}},"required":true}}},"/api/v1/accounting/incoming-invoices/{ulid}":{"get":{"operationId":"api_v1accountingincoming-invoices_ulid_get","tags":["FinanceIncomingInvoice"],"responses":{"200":{"description":"FinanceIncomingInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice.jsonld-finance_incoming_invoice.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceIncomingInvoice resource.","description":"Retrieves a FinanceIncomingInvoice resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceIncomingInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1accountingincoming-invoices_ulid_delete","tags":["FinanceIncomingInvoice"],"responses":{"204":{"description":"FinanceIncomingInvoice resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the FinanceIncomingInvoice resource.","description":"Removes the FinanceIncomingInvoice resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceIncomingInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1accountingincoming-invoices_ulid_patch","tags":["FinanceIncomingInvoice"],"responses":{"200":{"description":"FinanceIncomingInvoice resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice.jsonld-finance_incoming_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the FinanceIncomingInvoice resource.","description":"Updates the FinanceIncomingInvoice resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceIncomingInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated FinanceIncomingInvoice resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.write.jsonMergePatch"}}},"required":true}}},"/api/v1/accounting/incoming-invoices/{ulid}/approve":{"post":{"operationId":"finance_incoming_invoice_approve","tags":["FinanceIncomingInvoice"],"responses":{"201":{"description":"FinanceIncomingInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice.jsonld-finance_incoming_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Approve incoming invoice","description":"Approve incoming invoice. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"FinanceIncomingInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceIncomingInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.write"}}},"required":true}}},"/api/v1/accounting/incoming-invoices/{ulid}/mark-paid":{"post":{"operationId":"finance_incoming_invoice_mark_paid","tags":["FinanceIncomingInvoice"],"responses":{"201":{"description":"FinanceIncomingInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice.jsonld-finance_incoming_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Mark incoming invoice as paid","description":"Mark incoming invoice as paid. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"FinanceIncomingInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceIncomingInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoice-finance_incoming_invoice.write"}}},"required":true}}},"/api/v1/accounting/incoming-invoices/{ulid}/match":{"get":{"operationId":"finance_incoming_invoice_match_preview","tags":["FinanceIncomingInvoiceMatch"],"responses":{"200":{"description":"FinanceIncomingInvoiceMatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoiceMatch-finance_incoming_invoice_match.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoiceMatch.jsonld-finance_incoming_invoice_match.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceIncomingInvoiceMatch resource.","description":"Retrieves a FinanceIncomingInvoiceMatch resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceIncomingInvoiceMatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"finance_incoming_invoice_match_apply","tags":["FinanceIncomingInvoiceMatch"],"responses":{"201":{"description":"FinanceIncomingInvoiceMatch resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoiceMatch-finance_incoming_invoice_match.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoiceMatch.jsonld-finance_incoming_invoice_match.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Drei-Wege-Abgleich festhalten","description":"Hält das Urteil des Abgleichs Bestellung/Wareneingang/Rechnung am Beleg fest und gibt die Rechnung frei, wenn sie in Toleranz liegt und die Auto-Freigabe eingeschaltet ist — deshalb das Freigabe-Recht.","parameters":[{"name":"ulid","in":"path","description":"FinanceIncomingInvoiceMatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceIncomingInvoiceMatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoiceMatch"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceIncomingInvoiceMatch"}}},"required":true}}},"/api/v1/accounting/payment-proposal":{"get":{"operationId":"finance_payment_proposal","tags":["FinancePaymentProposal"],"responses":{"200":{"description":"FinancePaymentProposal resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentProposal-finance_payment_proposal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentProposal.jsonld-finance_payment_proposal.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinancePaymentProposal resource.","description":"Retrieves a FinancePaymentProposal resource.","parameters":[{"name":"bankAccountUlid","in":"query","description":"Zahlendes Bankkonto (Pflicht)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"executionDate","in":"query","description":"Ausführungstag (Y-m-d, Default heute)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"horizonDays","in":"query","description":"Vorlauf in Tagen über den Ausführungstag hinaus (Default aus den Einstellungen)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/accounting/payment-runs":{"get":{"operationId":"api_v1accountingpayment-runs_get_collection","tags":["FinancePaymentRun"],"responses":{"200":{"description":"FinancePaymentRun collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinancePaymentRun.jsonld-finance_payment_run.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinancePaymentRun.jsonld-finance_payment_run.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinancePaymentRun resources.","description":"Retrieves the collection of FinancePaymentRun resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"statusId","in":"query","description":"Status-Schlüssel (draft | exported | executed | cancelled)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"bankAccountUlid","in":"query","description":"Nur Läufe dieses Bankkontos","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingpayment-runs_post","tags":["FinancePaymentRun"],"responses":{"201":{"description":"FinancePaymentRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun.jsonld-finance_payment_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinancePaymentRun resource.","description":"Creates a FinancePaymentRun resource.","parameters":[],"requestBody":{"description":"The new FinancePaymentRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.write"}}},"required":true}}},"/api/v1/accounting/payment-runs/{ulid}":{"get":{"operationId":"api_v1accountingpayment-runs_ulid_get","tags":["FinancePaymentRun"],"responses":{"200":{"description":"FinancePaymentRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun.jsonld-finance_payment_run.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinancePaymentRun resource.","description":"Retrieves a FinancePaymentRun resource.","parameters":[{"name":"ulid","in":"path","description":"FinancePaymentRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/accounting/payment-runs/{ulid}/cancel":{"post":{"operationId":"finance_payment_run_cancel","tags":["FinancePaymentRun"],"responses":{"201":{"description":"FinancePaymentRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun.jsonld-finance_payment_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel payment run","description":"Cancel payment run. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"FinancePaymentRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinancePaymentRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.write"}}},"required":true}}},"/api/v1/accounting/payment-runs/{ulid}/execute":{"post":{"operationId":"finance_payment_run_execute","tags":["FinancePaymentRun"],"responses":{"201":{"description":"FinancePaymentRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun.jsonld-finance_payment_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zahllauf als ausgeführt vermerken","description":"Vermerkt den Zahllauf als ausgeführt. Ab hier ist das Geld unterwegs: der Lauf lässt sich nicht mehr verwerfen.","parameters":[{"name":"ulid","in":"path","description":"FinancePaymentRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinancePaymentRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.write"}}},"required":true}}},"/api/v1/accounting/payment-runs/{ulid}/export":{"post":{"operationId":"finance_payment_run_export","tags":["FinancePaymentRun"],"responses":{"201":{"description":"FinancePaymentRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun.jsonld-finance_payment_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"SEPA-Datei zum Zahllauf erzeugen","description":"Erzeugt die SEPA-Bankdatei zum Zahllauf zum Einreichen bei der Bank. Verlangt das Ausführungsrecht.","parameters":[{"name":"ulid","in":"path","description":"FinancePaymentRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinancePaymentRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinancePaymentRun-finance_payment_run.write"}}},"required":true}}},"/api/v1/accounting/payment-runs/{ulid}/file":{"get":{"operationId":"finance_payment_run_file","tags":["FinancePaymentRun"],"responses":{"204":{"description":"FinancePaymentRun resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinancePaymentRun resource.","description":"Retrieves a FinancePaymentRun resource.","parameters":[{"name":"ulid","in":"path","description":"FinancePaymentRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/accounting/sepa-mandates":{"get":{"operationId":"api_v1accountingsepa-mandates_get_collection","tags":["FinanceSepaMandate"],"responses":{"200":{"description":"FinanceSepaMandate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"FinanceSepaMandate.jsonld-finance_sepa_mandate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/FinanceSepaMandate.jsonld-finance_sepa_mandate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of FinanceSepaMandate resources.","description":"Retrieves the collection of FinanceSepaMandate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"active | revoked","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Nur Mandate dieses Kunden","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1accountingsepa-mandates_post","tags":["FinanceSepaMandate"],"responses":{"201":{"description":"FinanceSepaMandate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate.jsonld-finance_sepa_mandate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a FinanceSepaMandate resource.","description":"Creates a FinanceSepaMandate resource.","parameters":[],"requestBody":{"description":"The new FinanceSepaMandate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.write"}}},"required":true}}},"/api/v1/accounting/sepa-mandates/{ulid}":{"get":{"operationId":"api_v1accountingsepa-mandates_ulid_get","tags":["FinanceSepaMandate"],"responses":{"200":{"description":"FinanceSepaMandate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate.jsonld-finance_sepa_mandate.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a FinanceSepaMandate resource.","description":"Retrieves a FinanceSepaMandate resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceSepaMandate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1accountingsepa-mandates_ulid_patch","tags":["FinanceSepaMandate"],"responses":{"200":{"description":"FinanceSepaMandate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate.jsonld-finance_sepa_mandate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the FinanceSepaMandate resource.","description":"Updates the FinanceSepaMandate resource.","parameters":[{"name":"ulid","in":"path","description":"FinanceSepaMandate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated FinanceSepaMandate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.write.jsonMergePatch"}}},"required":true}}},"/api/v1/accounting/sepa-mandates/{ulid}/revoke":{"post":{"operationId":"finance_sepa_mandate_revoke","tags":["FinanceSepaMandate"],"responses":{"201":{"description":"FinanceSepaMandate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate.jsonld-finance_sepa_mandate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lastschriftmandat widerrufen","description":"Entzieht die Einzugsermächtigung: das Mandat geht auf `revoked` und wird in KEINEN Lastschrift-Lauf mehr aufgenommen — offene Rechnungen dieses Kunden bleiben unbezahlt stehen. Der Datensatz bleibt als Nachweis erhalten (kein DELETE). Body optional `{notes}`.","parameters":[{"name":"ulid","in":"path","description":"FinanceSepaMandate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new FinanceSepaMandate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/FinanceSepaMandate-finance_sepa_mandate.write"}}},"required":true}}},"/api/v1/platform/folders":{"get":{"operationId":"api_v1platformfolders_get_collection","tags":["Folder"],"responses":{"200":{"description":"Folder collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Folder-folder.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Folder.jsonld-folder.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Folder.jsonld-folder.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Folder resources.","description":"Retrieves the collection of Folder resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"parentId","in":"query","description":"Übergeordneter Ordner (ID, exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"root","in":"query","description":"true = nur Wurzelordner (nur ohne parentId wirksam)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Ordnernamen (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1platformfolders_post","tags":["Folder"],"responses":{"201":{"description":"Folder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder-folder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Folder.jsonld-folder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Folder resource.","description":"Creates a Folder resource.","parameters":[],"requestBody":{"description":"The new Folder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder-folder.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Folder-folder.write"}}},"required":true}}},"/api/v1/platform/folders/{ulid}":{"get":{"operationId":"api_v1platformfolders_ulid_get","tags":["Folder"],"responses":{"200":{"description":"Folder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder-folder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Folder.jsonld-folder.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Folder resource.","description":"Retrieves a Folder resource.","parameters":[{"name":"ulid","in":"path","description":"Folder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1platformfolders_ulid_delete","tags":["Folder"],"responses":{"204":{"description":"Folder resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Folder resource.","description":"Removes the Folder resource.","parameters":[{"name":"ulid","in":"path","description":"Folder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1platformfolders_ulid_patch","tags":["Folder"],"responses":{"200":{"description":"Folder resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder-folder.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Folder.jsonld-folder.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Folder resource.","description":"Updates the Folder resource.","parameters":[{"name":"ulid","in":"path","description":"Folder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Folder resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Folder-folder.write.jsonMergePatch"}}},"required":true}}},"/api/v1/forecasts":{"get":{"operationId":"api_v1forecasts_get_collection","tags":["Forecast"],"responses":{"200":{"description":"Forecast collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Forecast-forecast.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Forecast.jsonld-forecast.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Forecast.jsonld-forecast.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Forecast resources.","description":"Retrieves the collection of Forecast resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"scope","in":"query","description":"Scope (exakter Match: employee|team|brand|global)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"refId","in":"query","description":"Referenz-ID des Scopes (Mitarbeiter- bzw. Marken-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"granularity","in":"query","description":"Perioden-Raster (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"severity","in":"query","description":"Severity (exakter Match: ok|idle|warn|critical)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Zeitraum-Beginn — nur Perioden, die bis mindestens zu diesem Datum reichen","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende — nur Perioden, die spätestens an diesem Datum beginnen","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]}},"/api/v1/purchasing/acceptances":{"get":{"operationId":"api_v1purchasingacceptances_get_collection","tags":["GoodsAcceptance"],"responses":{"200":{"description":"GoodsAcceptance collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.read"}}},"application/ld+json":{"schema":{"type":"object","description":"GoodsAcceptance.jsonld-goods_acceptance.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/GoodsAcceptance.jsonld-goods_acceptance.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of GoodsAcceptance resources.","description":"Retrieves the collection of GoodsAcceptance resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"open|received|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"supplierRoleId","in":"query","description":"Lieferanten-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1purchasingacceptances_post","tags":["GoodsAcceptance"],"responses":{"201":{"description":"GoodsAcceptance resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance.jsonld-goods_acceptance.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a GoodsAcceptance resource.","description":"Creates a GoodsAcceptance resource.","parameters":[],"requestBody":{"description":"The new GoodsAcceptance resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.write"}}},"required":true}}},"/api/v1/purchasing/acceptances/{ulid}":{"get":{"operationId":"api_v1purchasingacceptances_ulid_get","tags":["GoodsAcceptance"],"responses":{"200":{"description":"GoodsAcceptance resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance.jsonld-goods_acceptance.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a GoodsAcceptance resource.","description":"Retrieves a GoodsAcceptance resource.","parameters":[{"name":"ulid","in":"path","description":"GoodsAcceptance identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1purchasingacceptances_ulid_patch","tags":["GoodsAcceptance"],"responses":{"200":{"description":"GoodsAcceptance resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance.jsonld-goods_acceptance.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the GoodsAcceptance resource.","description":"Updates the GoodsAcceptance resource.","parameters":[{"name":"ulid","in":"path","description":"GoodsAcceptance identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated GoodsAcceptance resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.write.jsonMergePatch"}}},"required":true}}},"/api/v1/purchasing/acceptances/{ulid}/close":{"post":{"operationId":"purchasing_acceptance_close","tags":["GoodsAcceptance"],"responses":{"201":{"description":"GoodsAcceptance resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance.jsonld-goods_acceptance.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Warenannahme abschließen","description":"Payload `{goodsReceiptUlid}` zieht die Annahme auf einen erfassten Wareneingang; ohne ihn wird sie verworfen (`{note}` als Begründung). Einmalig — eine bereits geschlossene Annahme antwortet 422.","parameters":[{"name":"ulid","in":"path","description":"GoodsAcceptance identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new GoodsAcceptance resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsAcceptance-goods_acceptance.write"}}},"required":true}}},"/api/v1/purchasing/orders":{"get":{"operationId":"api_v1purchasingorders_get_collection","tags":["GoodsOrder"],"responses":{"200":{"description":"GoodsOrder collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.read"}}},"application/ld+json":{"schema":{"type":"object","description":"GoodsOrder.jsonld-purchasing_order.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/GoodsOrder.jsonld-purchasing_order.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of GoodsOrder resources.","description":"Retrieves the collection of GoodsOrder resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"supplierRoleId","in":"query","description":"Lieferanten-Rollen-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Bestellnummer, Notizen und Lieferanten-Name","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[number]","in":"query","description":"Sortierung nach Bestellnummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[totalAmount]","in":"query","description":"Sortierung nach Gesamtsumme (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1purchasingorders_post","tags":["GoodsOrder"],"responses":{"201":{"description":"GoodsOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder.jsonld-purchasing_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a GoodsOrder resource.","description":"Creates a GoodsOrder resource.","parameters":[],"requestBody":{"description":"The new GoodsOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write"}}},"required":true}}},"/api/v1/purchasing/orders/{ulid}":{"get":{"operationId":"api_v1purchasingorders_ulid_get","tags":["GoodsOrder"],"responses":{"200":{"description":"GoodsOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder.jsonld-purchasing_order.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a GoodsOrder resource.","description":"Retrieves a GoodsOrder resource.","parameters":[{"name":"ulid","in":"path","description":"GoodsOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1purchasingorders_ulid_delete","tags":["GoodsOrder"],"responses":{"204":{"description":"GoodsOrder resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the GoodsOrder resource.","description":"Removes the GoodsOrder resource.","parameters":[{"name":"ulid","in":"path","description":"GoodsOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1purchasingorders_ulid_patch","tags":["GoodsOrder"],"responses":{"200":{"description":"GoodsOrder resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder.jsonld-purchasing_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the GoodsOrder resource.","description":"Updates the GoodsOrder resource.","parameters":[{"name":"ulid","in":"path","description":"GoodsOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated GoodsOrder resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write.jsonMergePatch"}}},"required":true}}},"/api/v1/purchasing/orders/{ulid}/cancel":{"post":{"operationId":"purchasing_order_cancel","tags":["GoodsOrder"],"responses":{"201":{"description":"GoodsOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder.jsonld-purchasing_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel order","description":"Cancel order. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"GoodsOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new GoodsOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write"}}},"required":true}}},"/api/v1/purchasing/orders/{ulid}/pdf":{"get":{"operationId":"purchasing_order_pdf","tags":["GoodsOrder"],"responses":{"204":{"description":"GoodsOrder resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a GoodsOrder resource.","description":"Retrieves a GoodsOrder resource.","parameters":[{"name":"ulid","in":"path","description":"GoodsOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/purchasing/orders/{ulid}/place":{"post":{"operationId":"purchasing_order_place","tags":["GoodsOrder"],"responses":{"201":{"description":"GoodsOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder.jsonld-purchasing_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Waren-Bestellung beim Lieferanten auslösen","description":"Stellt die Bestellung beim Lieferanten: vergibt die Nummer aus dem Markenkreis, setzt den Status auf bestellt und meldet `GoodsOrderPlaced`. Nur aus dem Entwurf und nur mit mindestens einer Position (sonst 409); die Marke ist ab hier eingefroren, änderbar bleibt der Beleg bis zum ersten Wareneingang.","parameters":[{"name":"ulid","in":"path","description":"GoodsOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new GoodsOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write"}}},"required":true}}},"/api/v1/purchasing/orders/{ulid}/receive":{"post":{"operationId":"purchasing_order_receive","tags":["GoodsOrder"],"responses":{"201":{"description":"GoodsOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder.jsonld-purchasing_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Receive order","description":"Receive order. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"GoodsOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new GoodsOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsOrder-purchasing_order.write"}}},"required":true}}},"/api/v1/purchasing/receipts":{"get":{"operationId":"api_v1purchasingreceipts_get_collection","tags":["GoodsReceipt"],"responses":{"200":{"description":"GoodsReceipt collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GoodsReceipt-purchasing_receipt.read"}}},"application/ld+json":{"schema":{"type":"object","description":"GoodsReceipt.jsonld-purchasing_receipt.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/GoodsReceipt.jsonld-purchasing_receipt.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of GoodsReceipt resources.","description":"Retrieves the collection of GoodsReceipt resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"goodsOrderId","in":"query","description":"Bestellungs-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Sperrlager-Zustand: blocked (Sperrbestand ohne Freigabe), released (freigegeben), booked (direkt zugebucht)","required":false,"deprecated":false,"schema":{"type":"string","enum":["blocked","released","booked"]},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Notiz und Bestellnummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/purchasing/receipts/{ulid}/release":{"post":{"operationId":"purchasing_receipt_release","tags":["GoodsReceipt"],"responses":{"201":{"description":"GoodsReceipt resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsReceipt-purchasing_receipt.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsReceipt.jsonld-purchasing_receipt.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Release receipt","description":"Release receipt. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"GoodsReceipt identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new GoodsReceipt resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoodsReceipt-purchasing_receipt.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/GoodsReceipt-purchasing_receipt.write"}}},"required":true}}},"/api/v1/hr-absences":{"get":{"operationId":"api_v1hr-absences_get_collection","tags":["HrAbsence"],"responses":{"200":{"description":"HrAbsence collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrAbsence-hr_absence.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrAbsence.jsonld-hr_absence.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrAbsence.jsonld-hr_absence.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrAbsence resources.","description":"Retrieves the collection of HrAbsence resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID — nur mit hr.absence.view_team/approve wirksam, sonst gilt der eigene Scope","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Zeitraum-Beginn — nur Abwesenheiten, die bis mindestens zu diesem Datum reichen","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende — nur Abwesenheiten, die spätestens an diesem Datum beginnen","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"typeCode","in":"query","description":"Code der Abwesenheitsart (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Mitarbeitername und Grund","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[startDate]","in":"query","description":"Sortierung nach Beginn-Datum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[period]","in":"query","description":"Sortierung nach Zeitraum (Alias für startDate, asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"hr_absence_request","tags":["HrAbsence"],"responses":{"201":{"description":"HrAbsence resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence.jsonld-hr_absence.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrAbsence resource.","description":"Creates a HrAbsence resource.","parameters":[],"requestBody":{"description":"The new HrAbsence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}}},"required":true}}},"/api/v1/hr-absences/{ulid}":{"get":{"operationId":"api_v1hr-absences_ulid_get","tags":["HrAbsence"],"responses":{"200":{"description":"HrAbsence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence.jsonld-hr_absence.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrAbsence resource.","description":"Retrieves a HrAbsence resource.","parameters":[{"name":"ulid","in":"path","description":"HrAbsence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/hr-absences/{ulid}/approve":{"post":{"operationId":"hr_absence_approve","tags":["HrAbsence"],"responses":{"201":{"description":"HrAbsence resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence.jsonld-hr_absence.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Approve hr absence","description":"Approve hr absence. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"HrAbsence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new HrAbsence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}}},"required":true}}},"/api/v1/hr-absences/{ulid}/cancel":{"post":{"operationId":"hr_absence_cancel","tags":["HrAbsence"],"responses":{"201":{"description":"HrAbsence resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence.jsonld-hr_absence.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel hr absence","description":"Cancel hr absence. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"HrAbsence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new HrAbsence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}}},"required":true}}},"/api/v1/hr-absences/{ulid}/provide-proof":{"post":{"operationId":"hr_absence_provide_proof","tags":["HrAbsence"],"responses":{"201":{"description":"HrAbsence resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence.jsonld-hr_absence.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Nachweis zur Abwesenheit nachreichen","description":"Reicht den geforderten Nachweis nach: verknüpft das Dokument mit der Abwesenheit und setzt `proofProvidedAt`.","parameters":[{"name":"ulid","in":"path","description":"HrAbsence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new HrAbsence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}}},"required":true}}},"/api/v1/hr-absences/{ulid}/reject":{"post":{"operationId":"hr_absence_reject","tags":["HrAbsence"],"responses":{"201":{"description":"HrAbsence resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence.jsonld-hr_absence.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Abwesenheitsantrag ablehnen","description":"Endgültige Ablehnung: Status `rejected`, Entscheider und Zeitpunkt werden festgehalten, das Urlaubskonto bleibt unberührt. Nur aus `requested` möglich (sonst 409) — eine bereits genehmigte Abwesenheit wird über `/cancel` zurückgenommen, nicht hier. Body optional `{decisionNote}`.","parameters":[{"name":"ulid","in":"path","description":"HrAbsence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new HrAbsence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsence-hr_absence.write"}}},"required":true}}},"/api/v1/hr-absence-balances":{"get":{"operationId":"api_v1hr-absence-balances_get_collection","tags":["HrAbsenceBalance"],"responses":{"200":{"description":"HrAbsenceBalance collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrAbsenceBalance-hr_balance.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrAbsenceBalance.jsonld-hr_balance.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrAbsenceBalance.jsonld-hr_balance.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrAbsenceBalance resources.","description":"Retrieves the collection of HrAbsenceBalance resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID — nur mit hr.absence.view_team/hr.employee.view wirksam, sonst gilt der eigene Scope","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"year","in":"query","description":"Jahr des Urlaubskontos (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/hr-absence-balances/{ulid}":{"get":{"operationId":"api_v1hr-absence-balances_ulid_get","tags":["HrAbsenceBalance"],"responses":{"200":{"description":"HrAbsenceBalance resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceBalance-hr_balance.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceBalance.jsonld-hr_balance.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrAbsenceBalance resource.","description":"Retrieves a HrAbsenceBalance resource.","parameters":[{"name":"ulid","in":"path","description":"HrAbsenceBalance identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/hr/absence-statuses":{"get":{"operationId":"api_v1hrabsence-statuses_get_collection","tags":["HrAbsenceStatus"],"responses":{"200":{"description":"HrAbsenceStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrAbsenceStatus-hr_absence_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrAbsenceStatus.jsonld-hr_absence_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrAbsenceStatus.jsonld-hr_absence_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrAbsenceStatus resources.","description":"Retrieves the collection of HrAbsenceStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1hrabsence-statuses_post","tags":["HrAbsenceStatus"],"responses":{"201":{"description":"HrAbsenceStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus-hr_absence_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus.jsonld-hr_absence_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrAbsenceStatus resource.","description":"Creates a HrAbsenceStatus resource.","parameters":[],"requestBody":{"description":"The new HrAbsenceStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus-hr_absence_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus-hr_absence_status.write"}}},"required":true}}},"/api/v1/hr/absence-statuses/{key}":{"get":{"operationId":"api_v1hrabsence-statuses_key_get","tags":["HrAbsenceStatus"],"responses":{"200":{"description":"HrAbsenceStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus-hr_absence_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus.jsonld-hr_absence_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrAbsenceStatus resource.","description":"Retrieves a HrAbsenceStatus resource.","parameters":[{"name":"key","in":"path","description":"HrAbsenceStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1hrabsence-statuses_key_delete","tags":["HrAbsenceStatus"],"responses":{"204":{"description":"HrAbsenceStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the HrAbsenceStatus resource.","description":"Removes the HrAbsenceStatus resource.","parameters":[{"name":"key","in":"path","description":"HrAbsenceStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1hrabsence-statuses_key_patch","tags":["HrAbsenceStatus"],"responses":{"200":{"description":"HrAbsenceStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus-hr_absence_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus.jsonld-hr_absence_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the HrAbsenceStatus resource.","description":"Updates the HrAbsenceStatus resource.","parameters":[{"name":"key","in":"path","description":"HrAbsenceStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated HrAbsenceStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceStatus-hr_absence_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/hr-absence-types":{"get":{"operationId":"api_v1hr-absence-types_get_collection","tags":["HrAbsenceType"],"responses":{"200":{"description":"HrAbsenceType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrAbsenceType-hr_abstype.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrAbsenceType.jsonld-hr_abstype.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrAbsenceType.jsonld-hr_abstype.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrAbsenceType resources.","description":"Retrieves the collection of HrAbsenceType resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1hr-absence-types_post","tags":["HrAbsenceType"],"responses":{"201":{"description":"HrAbsenceType resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType-hr_abstype.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType.jsonld-hr_abstype.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrAbsenceType resource.","description":"Creates a HrAbsenceType resource.","parameters":[],"requestBody":{"description":"The new HrAbsenceType resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType-hr_abstype.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType-hr_abstype.write"}}},"required":true}}},"/api/v1/hr-absence-types/{ulid}":{"get":{"operationId":"api_v1hr-absence-types_ulid_get","tags":["HrAbsenceType"],"responses":{"200":{"description":"HrAbsenceType resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType-hr_abstype.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType.jsonld-hr_abstype.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrAbsenceType resource.","description":"Retrieves a HrAbsenceType resource.","parameters":[{"name":"ulid","in":"path","description":"HrAbsenceType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1hr-absence-types_ulid_delete","tags":["HrAbsenceType"],"responses":{"204":{"description":"HrAbsenceType resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the HrAbsenceType resource.","description":"Removes the HrAbsenceType resource.","parameters":[{"name":"ulid","in":"path","description":"HrAbsenceType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1hr-absence-types_ulid_patch","tags":["HrAbsenceType"],"responses":{"200":{"description":"HrAbsenceType resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType-hr_abstype.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType.jsonld-hr_abstype.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the HrAbsenceType resource.","description":"Updates the HrAbsenceType resource.","parameters":[{"name":"ulid","in":"path","description":"HrAbsenceType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated HrAbsenceType resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/HrAbsenceType-hr_abstype.write.jsonMergePatch"}}},"required":true}}},"/api/v1/hr-availability":{"get":{"operationId":"api_v1hr-availability_get_collection","tags":["HrAvailability"],"responses":{"200":{"description":"HrAvailability collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrAvailability-hr_availability.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrAvailability.jsonld-hr_availability.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrAvailability.jsonld-hr_availability.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrAvailability resources.","description":"Retrieves the collection of HrAvailability resources.","parameters":[{"name":"from","in":"query","description":"Zeitraum-Beginn. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende (max. 366 Tage). Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Auf eine Person eingrenzen (Mitarbeiter-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/hr-checklist-templates":{"get":{"operationId":"api_v1hr-checklist-templates_get_collection","tags":["HrChecklistTemplate"],"responses":{"200":{"description":"HrChecklistTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrChecklistTemplate-hr_cltpl.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrChecklistTemplate.jsonld-hr_cltpl.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrChecklistTemplate.jsonld-hr_cltpl.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrChecklistTemplate resources.","description":"Retrieves the collection of HrChecklistTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"mode","in":"query","description":"Modus (onboarding|offboarding, exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1hr-checklist-templates_post","tags":["HrChecklistTemplate"],"responses":{"201":{"description":"HrChecklistTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate-hr_cltpl.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate.jsonld-hr_cltpl.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrChecklistTemplate resource.","description":"Creates a HrChecklistTemplate resource.","parameters":[],"requestBody":{"description":"The new HrChecklistTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate-hr_cltpl.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate-hr_cltpl.write"}}},"required":true}}},"/api/v1/hr-checklist-templates/{ulid}":{"get":{"operationId":"api_v1hr-checklist-templates_ulid_get","tags":["HrChecklistTemplate"],"responses":{"200":{"description":"HrChecklistTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate-hr_cltpl.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate.jsonld-hr_cltpl.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrChecklistTemplate resource.","description":"Retrieves a HrChecklistTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"HrChecklistTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1hr-checklist-templates_ulid_delete","tags":["HrChecklistTemplate"],"responses":{"204":{"description":"HrChecklistTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the HrChecklistTemplate resource.","description":"Removes the HrChecklistTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"HrChecklistTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1hr-checklist-templates_ulid_patch","tags":["HrChecklistTemplate"],"responses":{"200":{"description":"HrChecklistTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate-hr_cltpl.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate.jsonld-hr_cltpl.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the HrChecklistTemplate resource.","description":"Updates the HrChecklistTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"HrChecklistTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated HrChecklistTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/HrChecklistTemplate-hr_cltpl.write.jsonMergePatch"}}},"required":true}}},"/api/v1/hr-employee-documents":{"get":{"operationId":"api_v1hr-employee-documents_get_collection","tags":["HrEmployeeDocument"],"responses":{"200":{"description":"HrEmployeeDocument collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrEmployeeDocument-hr_doc.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrEmployeeDocument.jsonld-hr_doc.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrEmployeeDocument.jsonld-hr_doc.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrEmployeeDocument resources.","description":"Retrieves the collection of HrEmployeeDocument resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID — nur mit hr.document.manage wirksam, sonst gilt der eigene Scope","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"type","in":"query","description":"Dokumenttyp (exakter Match, z. B. contract|certificate|payslip|id|proof|other)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Titel-Teilsuche (z. B. für Auswahl-Picker)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1hr-employee-documents_post","tags":["HrEmployeeDocument"],"responses":{"201":{"description":"HrEmployeeDocument resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrEmployeeDocument-hr_doc.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrEmployeeDocument.jsonld-hr_doc.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrEmployeeDocument resource.","description":"Creates a HrEmployeeDocument resource.","parameters":[],"requestBody":{"description":"The new HrEmployeeDocument resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrEmployeeDocument-hr_doc.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrEmployeeDocument-hr_doc.write"}}},"required":true}}},"/api/v1/hr-employee-documents/{ulid}":{"get":{"operationId":"api_v1hr-employee-documents_ulid_get","tags":["HrEmployeeDocument"],"responses":{"200":{"description":"HrEmployeeDocument resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrEmployeeDocument-hr_doc.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrEmployeeDocument.jsonld-hr_doc.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrEmployeeDocument resource.","description":"Retrieves a HrEmployeeDocument resource.","parameters":[{"name":"ulid","in":"path","description":"HrEmployeeDocument identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1hr-employee-documents_ulid_delete","tags":["HrEmployeeDocument"],"responses":{"204":{"description":"HrEmployeeDocument resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the HrEmployeeDocument resource.","description":"Removes the HrEmployeeDocument resource.","parameters":[{"name":"ulid","in":"path","description":"HrEmployeeDocument identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/hr-holiday-calendars":{"get":{"operationId":"api_v1hr-holiday-calendars_get_collection","tags":["HrHolidayCalendar"],"responses":{"200":{"description":"HrHolidayCalendar collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrHolidayCalendar-hr_holcal.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrHolidayCalendar.jsonld-hr_holcal.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrHolidayCalendar.jsonld-hr_holcal.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrHolidayCalendar resources.","description":"Retrieves the collection of HrHolidayCalendar resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1hr-holiday-calendars_post","tags":["HrHolidayCalendar"],"responses":{"201":{"description":"HrHolidayCalendar resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar-hr_holcal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar.jsonld-hr_holcal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrHolidayCalendar resource.","description":"Creates a HrHolidayCalendar resource.","parameters":[],"requestBody":{"description":"The new HrHolidayCalendar resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar-hr_holcal.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar-hr_holcal.write"}}},"required":true}}},"/api/v1/hr-holiday-calendars/{ulid}":{"get":{"operationId":"api_v1hr-holiday-calendars_ulid_get","tags":["HrHolidayCalendar"],"responses":{"200":{"description":"HrHolidayCalendar resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar-hr_holcal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar.jsonld-hr_holcal.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrHolidayCalendar resource.","description":"Retrieves a HrHolidayCalendar resource.","parameters":[{"name":"ulid","in":"path","description":"HrHolidayCalendar identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1hr-holiday-calendars_ulid_delete","tags":["HrHolidayCalendar"],"responses":{"204":{"description":"HrHolidayCalendar resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the HrHolidayCalendar resource.","description":"Removes the HrHolidayCalendar resource.","parameters":[{"name":"ulid","in":"path","description":"HrHolidayCalendar identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1hr-holiday-calendars_ulid_patch","tags":["HrHolidayCalendar"],"responses":{"200":{"description":"HrHolidayCalendar resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar-hr_holcal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar.jsonld-hr_holcal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the HrHolidayCalendar resource.","description":"Updates the HrHolidayCalendar resource.","parameters":[{"name":"ulid","in":"path","description":"HrHolidayCalendar identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated HrHolidayCalendar resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/HrHolidayCalendar-hr_holcal.write.jsonMergePatch"}}},"required":true}}},"/api/v1/hr-onboarding-checklists":{"get":{"operationId":"api_v1hr-onboarding-checklists_get_collection","tags":["HrOnboardingChecklist"],"responses":{"200":{"description":"HrOnboardingChecklist collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrOnboardingChecklist.jsonld-hr_checklist.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrOnboardingChecklist.jsonld-hr_checklist.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrOnboardingChecklist resources.","description":"Retrieves the collection of HrOnboardingChecklist resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"mode","in":"query","description":"Modus (onboarding|offboarding, exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/hr-onboarding-checklists/from-template":{"post":{"operationId":"hr_checklist_from_template","tags":["HrOnboardingChecklist"],"responses":{"201":{"description":"HrOnboardingChecklist resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist.jsonld-hr_checklist.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrOnboardingChecklist resource.","description":"Creates a HrOnboardingChecklist resource.","parameters":[],"requestBody":{"description":"The new HrOnboardingChecklist resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.write"}}},"required":true}}},"/api/v1/hr-onboarding-checklists/{ulid}":{"get":{"operationId":"api_v1hr-onboarding-checklists_ulid_get","tags":["HrOnboardingChecklist"],"responses":{"200":{"description":"HrOnboardingChecklist resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist.jsonld-hr_checklist.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrOnboardingChecklist resource.","description":"Retrieves a HrOnboardingChecklist resource.","parameters":[{"name":"ulid","in":"path","description":"HrOnboardingChecklist identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/hr-onboarding-checklists/{ulid}/complete-item":{"post":{"operationId":"hr_checklist_complete_item","tags":["HrOnboardingChecklist"],"responses":{"201":{"description":"HrOnboardingChecklist resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist.jsonld-hr_checklist.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Checklisten-Eintrag erledigen","description":"Markiert einen Eintrag als erledigt und löst idempotent die daran hängenden Schritte aus (Provisionierung, Betriebsmittel, Aufgabe).","parameters":[{"name":"ulid","in":"path","description":"HrOnboardingChecklist identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new HrOnboardingChecklist resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.write"}}},"required":true}}},"/api/v1/hr-onboarding-checklists/{ulid}/items":{"post":{"operationId":"hr_checklist_add_item","tags":["HrOnboardingChecklist"],"responses":{"201":{"description":"HrOnboardingChecklist resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist.jsonld-hr_checklist.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Checklisten-Eintrag hinzufügen","description":"Fügt der On- bzw. Offboarding-Checkliste einen Eintrag hinzu.","parameters":[{"name":"ulid","in":"path","description":"HrOnboardingChecklist identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new HrOnboardingChecklist resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.write"}}},"required":true}}},"/api/v1/hr-onboarding-checklists/{ulid}/skip-item":{"post":{"operationId":"hr_checklist_skip_item","tags":["HrOnboardingChecklist"],"responses":{"201":{"description":"HrOnboardingChecklist resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist.jsonld-hr_checklist.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Checklisten-Eintrag überspringen","description":"Überspringt einen Eintrag, ohne die daran hängenden Schritte auszulösen.","parameters":[{"name":"ulid","in":"path","description":"HrOnboardingChecklist identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new HrOnboardingChecklist resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrOnboardingChecklist-hr_checklist.write"}}},"required":true}}},"/api/v1/hr-payroll-exports":{"post":{"operationId":"api_v1hr-payroll-exports_post","tags":["HrPayrollExport"],"responses":{"201":{"description":"HrPayrollExport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrPayrollExport-hr_payroll.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrPayrollExport.jsonld-hr_payroll.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrPayrollExport resource.","description":"Creates a HrPayrollExport resource.","parameters":[],"requestBody":{"description":"The new HrPayrollExport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrPayrollExport-hr_payroll.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrPayrollExport-hr_payroll.write"}}},"required":true}}},"/api/v1/hr-payroll-export-runs":{"get":{"operationId":"api_v1hr-payroll-export-runs_get_collection","tags":["HrPayrollExportRun"],"responses":{"200":{"description":"HrPayrollExportRun collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrPayrollExportRun-hr_payroll_run.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrPayrollExportRun.jsonld-hr_payroll_run.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrPayrollExportRun.jsonld-hr_payroll_run.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrPayrollExportRun resources.","description":"Retrieves the collection of HrPayrollExportRun resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"format","in":"query","description":"Ausgabeformat (csv|datev), exakter Match","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/hr-payroll-export-runs/{ulid}":{"get":{"operationId":"api_v1hr-payroll-export-runs_ulid_get","tags":["HrPayrollExportRun"],"responses":{"200":{"description":"HrPayrollExportRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrPayrollExportRun-hr_payroll_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrPayrollExportRun.jsonld-hr_payroll_run.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrPayrollExportRun resource.","description":"Retrieves a HrPayrollExportRun resource.","parameters":[{"name":"ulid","in":"path","description":"HrPayrollExportRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/hr-skills":{"get":{"operationId":"api_v1hr-skills_get_collection","tags":["HrSkill"],"responses":{"200":{"description":"HrSkill collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HrSkill-hr_skill.read"}}},"application/ld+json":{"schema":{"type":"object","description":"HrSkill.jsonld-hr_skill.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/HrSkill.jsonld-hr_skill.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of HrSkill resources.","description":"Retrieves the collection of HrSkill resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"category","in":"query","description":"Kategorie (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive bzw. inaktive Skills","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1hr-skills_post","tags":["HrSkill"],"responses":{"201":{"description":"HrSkill resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrSkill-hr_skill.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrSkill.jsonld-hr_skill.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a HrSkill resource.","description":"Creates a HrSkill resource.","parameters":[],"requestBody":{"description":"The new HrSkill resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrSkill-hr_skill.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrSkill-hr_skill.write"}}},"required":true}}},"/api/v1/hr-skills/{ulid}":{"get":{"operationId":"api_v1hr-skills_ulid_get","tags":["HrSkill"],"responses":{"200":{"description":"HrSkill resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrSkill-hr_skill.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrSkill.jsonld-hr_skill.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a HrSkill resource.","description":"Retrieves a HrSkill resource.","parameters":[{"name":"ulid","in":"path","description":"HrSkill identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1hr-skills_ulid_delete","tags":["HrSkill"],"responses":{"204":{"description":"HrSkill resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the HrSkill resource.","description":"Removes the HrSkill resource.","parameters":[{"name":"ulid","in":"path","description":"HrSkill identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1hr-skills_ulid_patch","tags":["HrSkill"],"responses":{"200":{"description":"HrSkill resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrSkill-hr_skill.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/HrSkill.jsonld-hr_skill.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the HrSkill resource.","description":"Updates the HrSkill resource.","parameters":[{"name":"ulid","in":"path","description":"HrSkill identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated HrSkill resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/HrSkill-hr_skill.write.jsonMergePatch"}}},"required":true}}},"/api/v1/import-jobs":{"get":{"operationId":"api_v1import-jobs_get_collection","tags":["ImportJob"],"responses":{"200":{"description":"ImportJob collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ImportJob-import_job.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ImportJob.jsonld-import_job.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ImportJob.jsonld-import_job.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ImportJob resources.","description":"Retrieves the collection of ImportJob resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"targetKey","in":"query","description":"Ziel-Datentyp des Imports (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Job-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Job-Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1import-jobs_post","tags":["ImportJob"],"responses":{"201":{"description":"ImportJob resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob.jsonld-import_job.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ImportJob resource.","description":"Creates a ImportJob resource.","parameters":[],"requestBody":{"description":"The new ImportJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write"}}},"required":true}}},"/api/v1/import-jobs/{ulid}":{"get":{"operationId":"api_v1import-jobs_ulid_get","tags":["ImportJob"],"responses":{"200":{"description":"ImportJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob.jsonld-import_job.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ImportJob resource.","description":"Retrieves a ImportJob resource.","parameters":[{"name":"ulid","in":"path","description":"ImportJob identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1import-jobs_ulid_patch","tags":["ImportJob"],"responses":{"200":{"description":"ImportJob resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob.jsonld-import_job.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ImportJob resource.","description":"Updates the ImportJob resource.","parameters":[{"name":"ulid","in":"path","description":"ImportJob identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ImportJob resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write.jsonMergePatch"}}},"required":true}}},"/api/v1/import-jobs/{ulid}/dry-run":{"post":{"operationId":"import_job_dry_run","tags":["ImportJob"],"responses":{"200":{"description":"ImportJob resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob.jsonld-import_job.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Import durchrechnen ohne zu schreiben","description":"Rechnet den Import durch und liefert den Report, ohne Daten zu schreiben.","parameters":[{"name":"ulid","in":"path","description":"ImportJob identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ImportJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write"}}},"required":true}}},"/api/v1/import-jobs/{ulid}/revert":{"post":{"operationId":"import_job_revert","tags":["ImportJob"],"responses":{"200":{"description":"ImportJob resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob.jsonld-import_job.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Gelaufenen Import rückgängig machen","description":"Macht einen gelaufenen Import rückgängig: die daraus entstandenen Datensätze werden über die Batch-Kennung des Laufs storniert (soft-gelöscht).","parameters":[{"name":"ulid","in":"path","description":"ImportJob identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ImportJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write"}}},"required":true}}},"/api/v1/import-jobs/{ulid}/run":{"post":{"operationId":"import_job_run","tags":["ImportJob"],"responses":{"200":{"description":"ImportJob resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob.jsonld-import_job.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Import starten","description":"Startet den Import asynchron. Ab hier entstehen echte Datensätze.","parameters":[{"name":"ulid","in":"path","description":"ImportJob identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ImportJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ImportJob-import_job.write"}}},"required":true}}},"/api/v1/import-targets":{"get":{"operationId":"api_v1import-targets_get_collection","tags":["ImportTarget"],"responses":{"200":{"description":"ImportTarget collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ImportTarget-import_target.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ImportTarget.jsonld-import_target.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ImportTarget.jsonld-import_target.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ImportTarget resources.","description":"Retrieves the collection of ImportTarget resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]}},"/api/v1/tickets/public/inbound-form":{"post":{"operationId":"inbound_form_submit","tags":["InboundForm"],"responses":{"201":{"description":"InboundForm resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundForm-inbound_form.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InboundForm.jsonld-inbound_form.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a InboundForm resource.","description":"Creates a InboundForm resource.","parameters":[],"requestBody":{"description":"The new InboundForm resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundForm-inbound_form.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InboundForm-inbound_form.write"}}},"required":true}}},"/api/v1/integrations":{"get":{"operationId":"api_v1integrations_get_collection","tags":["Integration"],"responses":{"200":{"description":"Integration collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Integration-integration.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Integration.jsonld-integration.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Integration.jsonld-integration.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Integration resources.","description":"Retrieves the collection of Integration resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"provider","in":"query","description":"Provider-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Name und Provider (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1integrations_post","tags":["Integration"],"responses":{"201":{"description":"Integration resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Integration-integration.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Integration.jsonld-integration.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Integration resource.","description":"Creates a Integration resource.","parameters":[],"requestBody":{"description":"The new Integration resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Integration-integration.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Integration-integration.write"}}},"required":true}}},"/api/v1/integrations/{ulid}":{"get":{"operationId":"api_v1integrations_ulid_get","tags":["Integration"],"responses":{"200":{"description":"Integration resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Integration-integration.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Integration.jsonld-integration.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Integration resource.","description":"Retrieves a Integration resource.","parameters":[{"name":"ulid","in":"path","description":"Integration identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1integrations_ulid_delete","tags":["Integration"],"responses":{"204":{"description":"Integration resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Integration resource.","description":"Removes the Integration resource.","parameters":[{"name":"ulid","in":"path","description":"Integration identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1integrations_ulid_patch","tags":["Integration"],"responses":{"200":{"description":"Integration resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Integration-integration.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Integration.jsonld-integration.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Integration resource.","description":"Updates the Integration resource.","parameters":[{"name":"ulid","in":"path","description":"Integration identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Integration resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Integration-integration.write.jsonMergePatch"}}},"required":true}}},"/api/v1/invoices":{"get":{"operationId":"api_v1invoices_get_collection","tags":["Invoice"],"responses":{"200":{"description":"Invoice collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Invoice-invoice.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Invoice.jsonld-invoice.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Invoice resources.","description":"Retrieves the collection of Invoice resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Rechnungs-Status","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"type","in":"query","description":"Belegtyp (z.B. invoice, credit_note)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"creditKind","in":"query","description":"Gutschrift-Ausprägung (storno|correction)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"recurringInvoiceId","in":"query","description":"Herkunfts-Serienrechnung (ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Rechnungsnummer und Kundenname","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[number]","in":"query","description":"Sortierung nach Rechnungsnummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[issueDate]","in":"query","description":"Sortierung nach Rechnungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[dueDate]","in":"query","description":"Sortierung nach Fälligkeit (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[totalAmount]","in":"query","description":"Sortierung nach Gesamtsumme (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1invoices_post","tags":["Invoice"],"responses":{"201":{"description":"Invoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Invoice resource.","description":"Creates a Invoice resource.","parameters":[],"requestBody":{"description":"The new Invoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}}},"required":true}}},"/api/v1/invoices/from-order":{"post":{"operationId":"invoice_from_order","tags":["Invoice"],"responses":{"201":{"description":"Invoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Create invoice from an order","description":"Create invoice from an order. Dedicated action endpoint — not a standard CRUD create.","parameters":[],"requestBody":{"description":"The new Invoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}}},"required":true}}},"/api/v1/invoices/{ulid}":{"get":{"operationId":"api_v1invoices_ulid_get","tags":["Invoice"],"responses":{"200":{"description":"Invoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Invoice resource.","description":"Retrieves a Invoice resource.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1invoices_ulid_delete","tags":["Invoice"],"responses":{"204":{"description":"Invoice resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Invoice resource.","description":"Removes the Invoice resource.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1invoices_ulid_patch","tags":["Invoice"],"responses":{"200":{"description":"Invoice resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Invoice resource.","description":"Updates the Invoice resource.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Invoice resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write.jsonMergePatch"}}},"required":true}}},"/api/v1/invoices/{ulid}/cancel":{"post":{"operationId":"invoice_cancel","tags":["Invoice"],"responses":{"201":{"description":"Invoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel invoice","description":"Cancel invoice. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Invoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}}},"required":true}}},"/api/v1/invoices/{ulid}/correct":{"post":{"operationId":"invoice_correct","tags":["Invoice"],"responses":{"201":{"description":"Invoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Correct invoice","description":"Correct invoice. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Invoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}}},"required":true}}},"/api/v1/invoices/{ulid}/e-invoice":{"get":{"operationId":"invoice_e_invoice_download","tags":["Invoice"],"responses":{"204":{"description":"Invoice resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Invoice resource.","description":"Retrieves a Invoice resource.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"invoice_e_invoice","tags":["Invoice"],"responses":{"201":{"description":"Invoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"E-Rechnung erzeugen","description":"Erzeugt idempotent die E-Rechnung zur FESTGESCHRIEBENEN Rechnung. Format aus `eInvoiceFormat`, sonst vom Beleg, dann vom Kunden, sonst XRechnung.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Invoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}}},"required":true}}},"/api/v1/invoices/{ulid}/issue":{"post":{"operationId":"invoice_issue","tags":["Invoice"],"responses":{"201":{"description":"Invoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Issue invoice","description":"Issue invoice. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Invoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}}},"required":true}}},"/api/v1/invoices/{ulid}/pdf":{"get":{"operationId":"invoice_pdf","tags":["Invoice"],"responses":{"204":{"description":"Invoice resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Invoice resource.","description":"Retrieves a Invoice resource.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/invoices/{ulid}/send":{"post":{"operationId":"invoice_send","tags":["Invoice"],"responses":{"201":{"description":"Invoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice.jsonld-invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Send invoice","description":"Send invoice. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Invoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Invoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Invoice-invoice.write"}}},"required":true}}},"/api/v1/invoice-correction-summary":{"get":{"operationId":"api_v1invoice-correction-summary_get_collection","tags":["InvoiceCorrectionSummary"],"responses":{"200":{"description":"InvoiceCorrectionSummary collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceCorrectionSummary-invoice_correction_summary.read"}}},"application/ld+json":{"schema":{"type":"object","description":"InvoiceCorrectionSummary.jsonld-invoice_correction_summary.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceCorrectionSummary.jsonld-invoice_correction_summary.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of InvoiceCorrectionSummary resources.","description":"Retrieves the collection of InvoiceCorrectionSummary resources.","parameters":[]}},"/api/v1/invoices/dunning-run":{"post":{"operationId":"invoice_dunning_run","tags":["InvoiceDunning"],"responses":{"201":{"description":"InvoiceDunning resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning.jsonld-invoice_dunning.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a InvoiceDunning resource.","description":"Creates a InvoiceDunning resource.","parameters":[],"requestBody":{"description":"The new InvoiceDunning resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.write"}}},"required":true}}},"/api/v1/invoices/{ulid}/dunnings":{"get":{"operationId":"api_v1invoices_uliddunnings_get_collection","tags":["InvoiceDunning"],"responses":{"200":{"description":"InvoiceDunning collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.read"}}},"application/ld+json":{"schema":{"type":"object","description":"InvoiceDunning.jsonld-invoice_dunning.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceDunning.jsonld-invoice_dunning.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of InvoiceDunning resources.","description":"Retrieves the collection of InvoiceDunning resources.","parameters":[{"name":"ulid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/invoices/{ulid}/dunnings/{dunningUlid}/mark-sent":{"post":{"operationId":"invoice_dunning_mark_sent","tags":["InvoiceDunning"],"responses":{"201":{"description":"InvoiceDunning resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning.jsonld-invoice_dunning.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Mahnung als postalisch versendet vermerken","description":"Vermerkt die Mahnung als auf dem Postweg versendet (setzt `sentAt`). Es wird keine Mail verschickt.","parameters":[{"name":"ulid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"dunningUlid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new InvoiceDunning resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.write"}}},"required":true}}},"/api/v1/invoices/{ulid}/dunnings/{dunningUlid}/pdf":{"get":{"operationId":"invoice_dunning_pdf","tags":["InvoiceDunning"],"responses":{"204":{"description":"InvoiceDunning resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a InvoiceDunning resource.","description":"Retrieves a InvoiceDunning resource.","parameters":[{"name":"ulid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"dunningUlid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/invoices/{ulid}/dunnings/{dunningUlid}/resolve":{"post":{"operationId":"invoice_dunning_resolve","tags":["InvoiceDunning"],"responses":{"201":{"description":"InvoiceDunning resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning.jsonld-invoice_dunning.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Mahnvorgang abschließen","description":"Schließt den Mahnvorgang als erledigt ab; die Mahnstufe läuft nicht weiter.","parameters":[{"name":"ulid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"dunningUlid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new InvoiceDunning resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.write"}}},"required":true}}},"/api/v1/invoices/{ulid}/dunnings/{dunningUlid}/send":{"post":{"operationId":"invoice_dunning_send","tags":["InvoiceDunning"],"responses":{"201":{"description":"InvoiceDunning resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning.jsonld-invoice_dunning.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Send dunning","description":"Send dunning. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"dunningUlid","in":"path","description":"InvoiceDunning identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new InvoiceDunning resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoiceDunning-invoice_dunning.write"}}},"required":true}}},"/api/v1/invoice-payments":{"get":{"operationId":"api_v1invoice-payments_get_collection","tags":["InvoicePayment"],"responses":{"200":{"description":"InvoicePayment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvoicePayment-invoice_payment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"InvoicePayment.jsonld-invoice_payment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/InvoicePayment.jsonld-invoice_payment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of InvoicePayment resources.","description":"Retrieves the collection of InvoicePayment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"source","in":"query","description":"Zahlungsquelle (exakter Match, z. B. bank | lexoffice | manual)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"invoiceUlid","in":"query","description":"Rechnungs-ULID — nur Zahlungen mit Zuordnung (match) auf diese Rechnung; unbekannte/unzugängliche ULIDs liefern eine leere Collection","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1invoice-payments_post","tags":["InvoicePayment"],"responses":{"201":{"description":"InvoicePayment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePayment-invoice_payment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoicePayment.jsonld-invoice_payment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a InvoicePayment resource.","description":"Creates a InvoicePayment resource.","parameters":[],"requestBody":{"description":"The new InvoicePayment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePayment-invoice_payment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/InvoicePayment-invoice_payment.write"}}},"required":true}}},"/api/v1/knowledge/articles":{"get":{"operationId":"api_v1knowledgearticles_get_collection","tags":["KnowledgeArticle"],"responses":{"200":{"description":"KnowledgeArticle collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeArticle.jsonld-know_article.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeArticle.jsonld-know_article.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeArticle resources.","description":"Retrieves the collection of KnowledgeArticle resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"space","in":"query","description":"Space-ULID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parent","in":"query","description":"ULID des Eltern-Artikels (direkte Unterartikel)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Titel und Volltext (bodyText)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"favorite","in":"query","description":"Nur Favoriten des aktuellen Nutzers","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"recent","in":"query","description":"Sortierung nach zuletzt geändert (updatedAt DESC)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status (exakter Match, z. B. draft|in_review|published|archived)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach Änderungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgearticles_post","tags":["KnowledgeArticle"],"responses":{"201":{"description":"KnowledgeArticle resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle.jsonld-know_article.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeArticle resource.","description":"Creates a KnowledgeArticle resource.","parameters":[],"requestBody":{"description":"The new KnowledgeArticle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.write"}}},"required":true}}},"/api/v1/knowledge/articles/{ulid}":{"get":{"operationId":"api_v1knowledgearticles_ulid_get","tags":["KnowledgeArticle"],"responses":{"200":{"description":"KnowledgeArticle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle.jsonld-know_article.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a KnowledgeArticle resource.","description":"Retrieves a KnowledgeArticle resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1knowledgearticles_ulid_delete","tags":["KnowledgeArticle"],"responses":{"204":{"description":"KnowledgeArticle resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the KnowledgeArticle resource.","description":"Removes the KnowledgeArticle resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1knowledgearticles_ulid_patch","tags":["KnowledgeArticle"],"responses":{"200":{"description":"KnowledgeArticle resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle.jsonld-know_article.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the KnowledgeArticle resource.","description":"Updates the KnowledgeArticle resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated KnowledgeArticle resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.write.jsonMergePatch"}}},"required":true}}},"/api/v1/knowledge/articles/{ulid}/publish":{"post":{"operationId":"api_v1knowledgearticles_ulidpublish_post","tags":["KnowledgeArticle"],"responses":{"201":{"description":"KnowledgeArticle resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle.jsonld-know_article.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Artikel veröffentlichen","description":"Veröffentlicht den Artikel. Verlangt das Veröffentlichungsrecht UND Bearbeitungszugriff auf den Space.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new KnowledgeArticle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.write"}}},"required":true}}},"/api/v1/knowledge/articles/{ulid}/restore":{"post":{"operationId":"api_v1knowledgearticles_ulidrestore_post","tags":["KnowledgeArticle"],"responses":{"201":{"description":"KnowledgeArticle resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle.jsonld-know_article.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Restore article","description":"Restore article. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new KnowledgeArticle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.write"}}},"required":true}}},"/api/v1/knowledge/articles/{ulid}/versions":{"get":{"operationId":"api_v1knowledgearticles_ulidversions_get","tags":["KnowledgeArticle"],"responses":{"200":{"description":"KnowledgeArticle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle-know_article.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticle.jsonld-know_article.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a KnowledgeArticle resource.","description":"Retrieves a KnowledgeArticle resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"from","in":"query","description":"Versionsnummer der linken Diff-Seite; nur zusammen mit `to` wirksam.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"to","in":"query","description":"Versionsnummer der rechten Diff-Seite; nur zusammen mit `from` wirksam.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/knowledge/article-attachments":{"get":{"operationId":"api_v1knowledgearticle-attachments_get_collection","tags":["KnowledgeArticleAttachment"],"responses":{"200":{"description":"KnowledgeArticleAttachment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeArticleAttachment-know_attachment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeArticleAttachment.jsonld-know_attachment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeArticleAttachment.jsonld-know_attachment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeArticleAttachment resources.","description":"Retrieves the collection of KnowledgeArticleAttachment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"articleUlid","in":"query","description":"Artikel-ULID. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgearticle-attachments_post","tags":["KnowledgeArticleAttachment"],"responses":{"201":{"description":"KnowledgeArticleAttachment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticleAttachment-know_attachment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticleAttachment.jsonld-know_attachment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeArticleAttachment resource.","description":"Creates a KnowledgeArticleAttachment resource.","parameters":[],"requestBody":{"description":"The new KnowledgeArticleAttachment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticleAttachment-know_attachment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeArticleAttachment-know_attachment.write"}}},"required":true}}},"/api/v1/knowledge/article-attachments/{ulid}":{"delete":{"operationId":"api_v1knowledgearticle-attachments_ulid_delete","tags":["KnowledgeArticleAttachment"],"responses":{"204":{"description":"KnowledgeArticleAttachment resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the KnowledgeArticleAttachment resource.","description":"Removes the KnowledgeArticleAttachment resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeArticleAttachment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/knowledge/ask":{"post":{"operationId":"api_v1knowledgeask_post","tags":["KnowledgeAsk"],"responses":{"201":{"description":"KnowledgeAsk resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeAsk-know_ask.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeAsk.jsonld-know_ask.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeAsk resource.","description":"Creates a KnowledgeAsk resource.","parameters":[],"requestBody":{"description":"The new KnowledgeAsk resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeAsk-know_ask.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeAsk-know_ask.write"}}},"required":true}}},"/api/v1/knowledge/favorites":{"get":{"operationId":"api_v1knowledgefavorites_get_collection","tags":["KnowledgeFavorite"],"responses":{"200":{"description":"KnowledgeFavorite collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeFavorite-know_favorite.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeFavorite.jsonld-know_favorite.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeFavorite.jsonld-know_favorite.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeFavorite resources.","description":"Retrieves the collection of KnowledgeFavorite resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"targetType","in":"query","description":"Typ des gemerkten Objekts (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"targetId","in":"query","description":"ULID des gemerkten Objekts (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgefavorites_post","tags":["KnowledgeFavorite"],"responses":{"201":{"description":"KnowledgeFavorite resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeFavorite-know_favorite.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeFavorite.jsonld-know_favorite.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeFavorite resource.","description":"Creates a KnowledgeFavorite resource.","parameters":[],"requestBody":{"description":"The new KnowledgeFavorite resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeFavorite-know_favorite.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeFavorite-know_favorite.write"}}},"required":true}}},"/api/v1/knowledge/favorites/{ulid}":{"delete":{"operationId":"api_v1knowledgefavorites_ulid_delete","tags":["KnowledgeFavorite"],"responses":{"204":{"description":"KnowledgeFavorite resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the KnowledgeFavorite resource.","description":"Removes the KnowledgeFavorite resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeFavorite identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/knowledge/imports":{"get":{"operationId":"api_v1knowledgeimports_get_collection","tags":["KnowledgeImport"],"responses":{"200":{"description":"KnowledgeImport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeImport-knowledge_import.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeImport.jsonld-knowledge_import.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeImport.jsonld-knowledge_import.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeImport resources.","description":"Retrieves the collection of KnowledgeImport resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgeimports_post","tags":["KnowledgeImport"],"responses":{"202":{"description":"KnowledgeImport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeImport-knowledge_import.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeImport.jsonld-knowledge_import.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Notiz-Bestand als Wissensartikel importieren","description":"Startet den Import eines hochgeladenen ZIP-Archivs (Obsidian-Vault, Markdown-Ordner, Wiki-Export) in einen Wissensbereich. Läuft im Hintergrund; der Fortschritt steht in derselben Ressource. Ein erneuter Import desselben Bestands aktualisiert die Artikel, statt sie zu duplizieren.","parameters":[],"requestBody":{"description":"The new KnowledgeImport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeImport-knowledge_import.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeImport-knowledge_import.write"}}},"required":true}}},"/api/v1/knowledge/imports/{ulid}":{"get":{"operationId":"api_v1knowledgeimports_ulid_get","tags":["KnowledgeImport"],"responses":{"200":{"description":"KnowledgeImport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeImport-knowledge_import.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeImport.jsonld-knowledge_import.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a KnowledgeImport resource.","description":"Retrieves a KnowledgeImport resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeImport identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/knowledge/links":{"get":{"operationId":"api_v1knowledgelinks_get_collection","tags":["KnowledgeLink"],"responses":{"200":{"description":"KnowledgeLink collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeLink-know_link.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeLink.jsonld-know_link.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeLink.jsonld-know_link.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeLink resources.","description":"Retrieves the collection of KnowledgeLink resources.","parameters":[{"name":"targetType","in":"query","description":"Typ des Zielobjekts (z. B. ticket, project) — zusammen mit targetId: an das Ziel gehängtes Wissen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"targetId","in":"query","description":"ID/ULID des Zielobjekts (nur zusammen mit targetType wirksam)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"sourceType","in":"query","description":"Typ der Wissens-Quelle — zusammen mit sourceId: deren ausgehende Verknüpfungen","required":false,"deprecated":false,"schema":{"type":"string","enum":["article","sop","template","solution"]},"style":"form","explode":true},{"name":"sourceId","in":"query","description":"ULID der Wissens-Quelle (nur zusammen mit sourceType wirksam)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgelinks_post","tags":["KnowledgeLink"],"responses":{"201":{"description":"KnowledgeLink resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeLink-know_link.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeLink.jsonld-know_link.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeLink resource.","description":"Creates a KnowledgeLink resource.","parameters":[],"requestBody":{"description":"The new KnowledgeLink resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeLink-know_link.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeLink-know_link.write"}}},"required":true}}},"/api/v1/knowledge/links/{ulid}":{"delete":{"operationId":"api_v1knowledgelinks_ulid_delete","tags":["KnowledgeLink"],"responses":{"204":{"description":"KnowledgeLink resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the KnowledgeLink resource.","description":"Removes the KnowledgeLink resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/knowledge/search":{"get":{"operationId":"api_v1knowledgesearch_get_collection","tags":["KnowledgeSearch"],"responses":{"200":{"description":"KnowledgeSearch collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSearch-know_search.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeSearch.jsonld-know_search.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSearch.jsonld-know_search.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeSearch resources.","description":"Retrieves the collection of KnowledgeSearch resources.","parameters":[{"name":"q","in":"query","description":"Suchbegriff (Volltextsuche über Titel/Inhalt der Wissensobjekte)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"type","in":"query","description":"Auf einen Objekttyp einschränken","required":false,"deprecated":false,"schema":{"type":"string","enum":["article","sop","template","solution"]},"style":"form","explode":true},{"name":"space","in":"query","description":"Space-ULID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/knowledge/solution-blocks":{"get":{"operationId":"api_v1knowledgesolution-blocks_get_collection","tags":["KnowledgeSolutionBlock"],"responses":{"200":{"description":"KnowledgeSolutionBlock collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeSolutionBlock.jsonld-know_solution.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSolutionBlock.jsonld-know_solution.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeSolutionBlock resources.","description":"Retrieves the collection of KnowledgeSolutionBlock resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"space","in":"query","description":"Space-ULID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Titel und Problem-Kurzbeschreibung (problemSummary)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc); Default meistgenutzt zuerst","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgesolution-blocks_post","tags":["KnowledgeSolutionBlock"],"responses":{"201":{"description":"KnowledgeSolutionBlock resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock.jsonld-know_solution.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeSolutionBlock resource.","description":"Creates a KnowledgeSolutionBlock resource.","parameters":[],"requestBody":{"description":"The new KnowledgeSolutionBlock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.write"}}},"required":true}}},"/api/v1/knowledge/solution-blocks/{ulid}":{"get":{"operationId":"api_v1knowledgesolution-blocks_ulid_get","tags":["KnowledgeSolutionBlock"],"responses":{"200":{"description":"KnowledgeSolutionBlock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock.jsonld-know_solution.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a KnowledgeSolutionBlock resource.","description":"Retrieves a KnowledgeSolutionBlock resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSolutionBlock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1knowledgesolution-blocks_ulid_delete","tags":["KnowledgeSolutionBlock"],"responses":{"204":{"description":"KnowledgeSolutionBlock resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the KnowledgeSolutionBlock resource.","description":"Removes the KnowledgeSolutionBlock resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSolutionBlock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1knowledgesolution-blocks_ulid_patch","tags":["KnowledgeSolutionBlock"],"responses":{"200":{"description":"KnowledgeSolutionBlock resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock.jsonld-know_solution.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the KnowledgeSolutionBlock resource.","description":"Updates the KnowledgeSolutionBlock resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSolutionBlock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated KnowledgeSolutionBlock resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.write.jsonMergePatch"}}},"required":true}}},"/api/v1/knowledge/solution-blocks/{ulid}/use":{"post":{"operationId":"api_v1knowledgesolution-blocks_uliduse_post","tags":["KnowledgeSolutionBlock"],"responses":{"201":{"description":"KnowledgeSolutionBlock resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock.jsonld-know_solution.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lösungsbaustein als Antwort ausgeben","description":"Liefert den Lösungsbaustein als fertige Antwort für ein Ticket und zählt `usageCount` hoch.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSolutionBlock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new KnowledgeSolutionBlock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSolutionBlock-know_solution.write"}}},"required":true}}},"/api/v1/knowledge/sops":{"get":{"operationId":"api_v1knowledgesops_get_collection","tags":["KnowledgeSop"],"responses":{"200":{"description":"KnowledgeSop collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeSop.jsonld-know_sop.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSop.jsonld-know_sop.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeSop resources.","description":"Retrieves the collection of KnowledgeSop resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"space","in":"query","description":"Space-ULID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"scope","in":"query","description":"Einsatzbereich (exakter Match, z. B. project|onboarding|support|internal)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status (exakter Match, z. B. draft|published)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Titel und Zweck (purpose)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc); Default asc","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"mandatory","in":"query","description":"Nur veröffentlichte Pflicht-SOPs","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"unconfirmed","in":"query","description":"Nur vom aktuellen Nutzer noch nicht bestätigte SOPs (sinnvoll zusammen mit mandatory)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgesops_post","tags":["KnowledgeSop"],"responses":{"201":{"description":"KnowledgeSop resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop.jsonld-know_sop.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeSop resource.","description":"Creates a KnowledgeSop resource.","parameters":[],"requestBody":{"description":"The new KnowledgeSop resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.write"}}},"required":true}}},"/api/v1/knowledge/sops/{ulid}":{"get":{"operationId":"api_v1knowledgesops_ulid_get","tags":["KnowledgeSop"],"responses":{"200":{"description":"KnowledgeSop resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop.jsonld-know_sop.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a KnowledgeSop resource.","description":"Retrieves a KnowledgeSop resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSop identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1knowledgesops_ulid_delete","tags":["KnowledgeSop"],"responses":{"204":{"description":"KnowledgeSop resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the KnowledgeSop resource.","description":"Removes the KnowledgeSop resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSop identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1knowledgesops_ulid_patch","tags":["KnowledgeSop"],"responses":{"200":{"description":"KnowledgeSop resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop.jsonld-know_sop.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the KnowledgeSop resource.","description":"Updates the KnowledgeSop resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSop identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated KnowledgeSop resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.write.jsonMergePatch"}}},"required":true}}},"/api/v1/knowledge/sops/{ulid}/apply":{"post":{"operationId":"api_v1knowledgesops_ulidapply_post","tags":["KnowledgeSop"],"responses":{"201":{"description":"KnowledgeSop resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop.jsonld-know_sop.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"SOP auf ein Ziel anwenden","description":"Erzeugt aus der SOP Aufgaben bzw. Checklisteneinträge im Ziel — als Snapshot; spätere Änderungen an der SOP wirken nicht zurück.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSop identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new KnowledgeSop resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.write"}}},"required":true}}},"/api/v1/knowledge/sops/{ulid}/confirm-read":{"post":{"operationId":"api_v1knowledgesops_ulidconfirm-read_post","tags":["KnowledgeSop"],"responses":{"201":{"description":"KnowledgeSop resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop.jsonld-know_sop.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Pflichtlektüre bestätigen","description":"Bestätigt die Lektüre der SOP für den aufrufenden Nutzer. Idempotent; das Leserecht auf den Space genügt.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSop identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new KnowledgeSop resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSop-know_sop.write"}}},"required":true}}},"/api/v1/knowledge/spaces":{"get":{"operationId":"api_v1knowledgespaces_get_collection","tags":["KnowledgeSpace"],"responses":{"200":{"description":"KnowledgeSpace collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSpace-know_space.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeSpace.jsonld-know_space.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSpace.jsonld-know_space.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeSpace resources.","description":"Retrieves the collection of KnowledgeSpace resources.","parameters":[{"name":"type","in":"query","description":"Bereichs-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"visibility","in":"query","description":"Sichtbarkeit (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Name und Beschreibung","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc); Default asc","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgespaces_post","tags":["KnowledgeSpace"],"responses":{"201":{"description":"KnowledgeSpace resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace-know_space.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace.jsonld-know_space.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeSpace resource.","description":"Creates a KnowledgeSpace resource.","parameters":[],"requestBody":{"description":"The new KnowledgeSpace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace-know_space.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace-know_space.write"}}},"required":true}}},"/api/v1/knowledge/spaces/{ulid}":{"get":{"operationId":"api_v1knowledgespaces_ulid_get","tags":["KnowledgeSpace"],"responses":{"200":{"description":"KnowledgeSpace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace-know_space.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace.jsonld-know_space.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a KnowledgeSpace resource.","description":"Retrieves a KnowledgeSpace resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSpace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1knowledgespaces_ulid_delete","tags":["KnowledgeSpace"],"responses":{"204":{"description":"KnowledgeSpace resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the KnowledgeSpace resource.","description":"Removes the KnowledgeSpace resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSpace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1knowledgespaces_ulid_patch","tags":["KnowledgeSpace"],"responses":{"200":{"description":"KnowledgeSpace resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace-know_space.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace.jsonld-know_space.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the KnowledgeSpace resource.","description":"Updates the KnowledgeSpace resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeSpace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated KnowledgeSpace resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/KnowledgeSpace-know_space.write.jsonMergePatch"}}},"required":true}}},"/api/v1/knowledge/templates":{"get":{"operationId":"api_v1knowledgetemplates_get_collection","tags":["KnowledgeTemplate"],"responses":{"200":{"description":"KnowledgeTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"KnowledgeTemplate.jsonld-know_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeTemplate.jsonld-know_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of KnowledgeTemplate resources.","description":"Retrieves the collection of KnowledgeTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"space","in":"query","description":"Space-ULID (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"kind","in":"query","description":"Template-Art (exakter Match, z. B. document|email|quote_block|snippet)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"category","in":"query","description":"Kategorie (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Name und Kategorie","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc); Default asc","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1knowledgetemplates_post","tags":["KnowledgeTemplate"],"responses":{"201":{"description":"KnowledgeTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate.jsonld-know_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeTemplate resource.","description":"Creates a KnowledgeTemplate resource.","parameters":[],"requestBody":{"description":"The new KnowledgeTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.write"}}},"required":true}}},"/api/v1/knowledge/templates/{ulid}":{"get":{"operationId":"api_v1knowledgetemplates_ulid_get","tags":["KnowledgeTemplate"],"responses":{"200":{"description":"KnowledgeTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate.jsonld-know_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a KnowledgeTemplate resource.","description":"Retrieves a KnowledgeTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1knowledgetemplates_ulid_delete","tags":["KnowledgeTemplate"],"responses":{"204":{"description":"KnowledgeTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the KnowledgeTemplate resource.","description":"Removes the KnowledgeTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1knowledgetemplates_ulid_patch","tags":["KnowledgeTemplate"],"responses":{"200":{"description":"KnowledgeTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate.jsonld-know_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the KnowledgeTemplate resource.","description":"Updates the KnowledgeTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated KnowledgeTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.write.jsonMergePatch"}}},"required":true}}},"/api/v1/knowledge/templates/{ulid}/render":{"post":{"operationId":"api_v1knowledgetemplates_ulidrender_post","tags":["KnowledgeTemplate"],"responses":{"201":{"description":"KnowledgeTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate.jsonld-know_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vorlage aus dem Zielkontext füllen","description":"Füllt die Vorlage aus dem übergebenen Kontext und liefert `rendered`, `placeholders` und `unresolved`. Unbekannte Platzhalter bleiben markiert stehen statt zu verschwinden; gespeichert wird nichts.","parameters":[{"name":"ulid","in":"path","description":"KnowledgeTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new KnowledgeTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTemplate-know_template.write"}}},"required":true}}},"/api/v1/knowledge/articles/from-ticket":{"post":{"operationId":"api_v1knowledgearticlesfrom-ticket_post","tags":["KnowledgeTicketDraft"],"responses":{"201":{"description":"KnowledgeTicketDraft resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTicketDraft-know_ticket_draft.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTicketDraft.jsonld-know_ticket_draft.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a KnowledgeTicketDraft resource.","description":"Creates a KnowledgeTicketDraft resource.","parameters":[],"requestBody":{"description":"The new KnowledgeTicketDraft resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTicketDraft-know_ticket_draft.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/KnowledgeTicketDraft-know_ticket_draft.write"}}},"required":true}}},"/api/v1/print/labels/print":{"post":{"operationId":"print_label_print","tags":["LabelRender"],"responses":{"201":{"description":"LabelRender resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelRender-label_render.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LabelRender.jsonld-label_render.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Etikett an einen Arbeitsplatz drucken","description":"Payload `{workplaceKey, subjectType, subjectUlid, templateKey?, copies?}`. Rendert und stellt in die Warteschlange. Passt kein Gerät des Arbeitsplatzes, bleibt `jobUlid` leer — die Nutzlast steht trotzdem in der Antwort und kann heruntergeladen werden (der Hardware-Hub nimmt nichts weg).","parameters":[],"requestBody":{"description":"The new LabelRender resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelRender-label_render.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LabelRender-label_render.write"}}},"required":true}}},"/api/v1/print/labels/render":{"post":{"operationId":"print_label_render","tags":["LabelRender"],"responses":{"201":{"description":"LabelRender resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelRender-label_render.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LabelRender.jsonld-label_render.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Etikett rendern (Vorschau, kein Druck)","description":"Payload `{subjectType, subjectUlid, templateKey?}`. Antwort enthält die fertige ZPL-Nutzlast — genau das, was der Drucker bekäme. Ohne `templateKey` gilt die Standard-Vorlage des Subjekt-Typs; ist keine hinterlegt, greift die mitgelieferte.","parameters":[],"requestBody":{"description":"The new LabelRender resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelRender-label_render.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LabelRender-label_render.write"}}},"required":true}}},"/api/v1/print/label-subjects":{"get":{"operationId":"api_v1printlabel-subjects_get_collection","tags":["LabelSubject"],"responses":{"200":{"description":"LabelSubject collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LabelSubject-label_subject.read"}}},"application/ld+json":{"schema":{"type":"object","description":"LabelSubject.jsonld-label_subject.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/LabelSubject.jsonld-label_subject.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Etikettierbare Subjekt-Typen samt Variablen-Katalog","description":"Je Typ: Schlüssel, Anzeigename und die erlaubten `{{ variablen }}` mit Label und Beispielwert. Grundlage des Vorlagen-Editors und der Platzhalter-Prüfung beim Anlegen.","parameters":[]}},"/api/v1/print/label-templates":{"get":{"operationId":"api_v1printlabel-templates_get_collection","tags":["LabelTemplate"],"responses":{"200":{"description":"LabelTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LabelTemplate-label_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"LabelTemplate.jsonld-label_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/LabelTemplate.jsonld-label_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of LabelTemplate resources.","description":"Retrieves the collection of LabelTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"subjectType","in":"query","description":"Nur Vorlagen dieses Subjekt-Typs (product|bin|batch)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Bezeichnung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1printlabel-templates_post","tags":["LabelTemplate"],"responses":{"201":{"description":"LabelTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelTemplate-label_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LabelTemplate.jsonld-label_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Etiketten-Vorlage anlegen","description":"Payload `{templateKey, name, subjectType, body, widthMm?, heightMm?, isDefault?}`. `body` ist ZPL mit `{{ variable }}`-Platzhaltern; erlaubt sind die Variablen des Subjekt-Typs (siehe `GET /v1/print/label-subjects`). Ein unbekannter Platzhalter wird beim Anlegen abgewiesen — nicht erst auf dem Etikett.","parameters":[],"requestBody":{"description":"The new LabelTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelTemplate-label_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LabelTemplate-label_template.write"}}},"required":true}}},"/api/v1/print/label-templates/{ulid}":{"get":{"operationId":"api_v1printlabel-templates_ulid_get","tags":["LabelTemplate"],"responses":{"200":{"description":"LabelTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelTemplate-label_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LabelTemplate.jsonld-label_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a LabelTemplate resource.","description":"Retrieves a LabelTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"LabelTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1printlabel-templates_ulid_delete","tags":["LabelTemplate"],"responses":{"204":{"description":"LabelTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the LabelTemplate resource.","description":"Removes the LabelTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"LabelTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1printlabel-templates_ulid_patch","tags":["LabelTemplate"],"responses":{"200":{"description":"LabelTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelTemplate-label_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LabelTemplate.jsonld-label_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the LabelTemplate resource.","description":"Updates the LabelTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"LabelTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated LabelTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/LabelTemplate-label_template.write.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/leads":{"get":{"operationId":"api_v1crmleads_get_collection","tags":["Lead"],"responses":{"200":{"description":"Lead collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Lead-lead.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Lead.jsonld-lead.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Lead.jsonld-lead.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Lead resources.","description":"Retrieves the collection of Lead resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"leadStageId","in":"query","description":"Lead-Stufe (SSoT des Lebenszyklus)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"leadStageCategory","in":"query","description":"Lebenszyklus-Kategorie der Lead-Stufe (open|active|done|cancelled)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"leadStageStatusKey","in":"query","description":"Lebenszyklus-Schlüssel der Lead-Stufe (new|working|qualified|nurture|archived)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"ownerId","in":"query","description":"Verantwortliche/r (User-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marke (numerische PK) — zeigt nur Interessenten dieser Marke plus den markenlosen Bestand","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"search","in":"query","description":"Volltextsuche über Name und Firmenname","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Alias zu search (nur wirksam, wenn search fehlt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[companyName]","in":"query","description":"Sortierung nach Firmenname (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[score]","in":"query","description":"Sortierung nach Score (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[cf.<feldschlüssel>]","in":"query","description":"Sortierung nach einem materialisierten Formelfeld (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"cfMin[<feldschlüssel>]","in":"query","description":"Formelfeld-Untergrenze (numerisch, inklusiv)","required":false,"deprecated":false,"schema":{"type":"number"},"style":"form","explode":true},{"name":"cfMax[<feldschlüssel>]","in":"query","description":"Formelfeld-Obergrenze (numerisch, inklusiv)","required":false,"deprecated":false,"schema":{"type":"number"},"style":"form","explode":true},{"name":"cfEq[<feldschlüssel>]","in":"query","description":"Formelfeld exakter Wert (Zahl oder Text)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1crmleads_post","tags":["Lead"],"responses":{"201":{"description":"Lead resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead-lead.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Lead.jsonld-lead.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Lead resource.","description":"Creates a Lead resource.","parameters":[],"requestBody":{"description":"The new Lead resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead-lead.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Lead-lead.write"}}},"required":true}}},"/api/v1/crm/leads/{ulid}":{"get":{"operationId":"api_v1crmleads_ulid_get","tags":["Lead"],"responses":{"200":{"description":"Lead resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead-lead.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Lead.jsonld-lead.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Lead resource.","description":"Retrieves a Lead resource.","parameters":[{"name":"ulid","in":"path","description":"Lead identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1crmleads_ulid_delete","tags":["Lead"],"responses":{"204":{"description":"Lead resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Lead resource.","description":"Removes the Lead resource.","parameters":[{"name":"ulid","in":"path","description":"Lead identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1crmleads_ulid_patch","tags":["Lead"],"responses":{"200":{"description":"Lead resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead-lead.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Lead.jsonld-lead.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Lead resource.","description":"Updates the Lead resource.","parameters":[{"name":"ulid","in":"path","description":"Lead identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Lead resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Lead-lead.write.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/leads/{ulid}/convert":{"post":{"operationId":"lead_convert","tags":["Lead"],"responses":{"201":{"description":"Lead resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead-lead.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Lead.jsonld-lead.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Convert lead","description":"Convert lead. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Lead identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Lead resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lead-lead.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Lead-lead.write"}}},"required":true}}},"/api/v1/crm/lead-duplicates":{"get":{"operationId":"api_v1crmlead-duplicates_get_collection","tags":["LeadDuplicateGroup"],"responses":{"200":{"description":"LeadDuplicateGroup collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeadDuplicateGroup-lead_duplicate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"LeadDuplicateGroup.jsonld-lead_duplicate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/LeadDuplicateGroup.jsonld-lead_duplicate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of LeadDuplicateGroup resources.","description":"Retrieves the collection of LeadDuplicateGroup resources.","parameters":[]}},"/api/v1/billing-previews/lexoffice-sync-run":{"post":{"operationId":"lexoffice_sync_run","tags":["LexofficeSyncRun"],"responses":{"201":{"description":"LexofficeSyncRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LexofficeSyncRun-lexoffice_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LexofficeSyncRun.jsonld-lexoffice_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a LexofficeSyncRun resource.","description":"Creates a LexofficeSyncRun resource.","parameters":[],"requestBody":{"description":"The new LexofficeSyncRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LexofficeSyncRun-lexoffice_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LexofficeSyncRun-lexoffice_run.write"}}},"required":true}}},"/api/v1/licenses":{"get":{"operationId":"api_v1licenses_get_collection","tags":["License"],"responses":{"200":{"description":"License collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/License-license.read"}}},"application/ld+json":{"schema":{"type":"object","description":"License.jsonld-license.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/License.jsonld-license.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of License resources.","description":"Retrieves the collection of License resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"productId","in":"query","description":"Produkt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"term","in":"query","description":"Laufzeit-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"renewsBefore","in":"query","description":"Nur Lizenzen mit Verlängerungsdatum bis einschließlich diesem Datum (ungültiges Datum → 400)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Kunden- und Produktname","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[term]","in":"query","description":"Sortierung nach Laufzeit (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[mrrAmount]","in":"query","description":"Sortierung nach MRR (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[renewsAt]","in":"query","description":"Sortierung nach Verlängerungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[endsAt]","in":"query","description":"Sortierung nach Laufzeitende (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1licenses_post","tags":["License"],"responses":{"201":{"description":"License resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a License resource.","description":"Creates a License resource.","parameters":[],"requestBody":{"description":"The new License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License-license.write"}}},"required":true}}},"/api/v1/licenses/{ulid}":{"get":{"operationId":"api_v1licenses_ulid_get","tags":["License"],"responses":{"200":{"description":"License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a License resource.","description":"Retrieves a License resource.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1licenses_ulid_delete","tags":["License"],"responses":{"204":{"description":"License resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the License resource.","description":"Removes the License resource.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1licenses_ulid_patch","tags":["License"],"responses":{"200":{"description":"License resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the License resource.","description":"Updates the License resource.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated License resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/License-license.write.jsonMergePatch"}}},"required":true}}},"/api/v1/licenses/{ulid}/activate":{"post":{"operationId":"license_activate","tags":["License"],"responses":{"201":{"description":"License resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Activate license","description":"Activate license. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License-license.write"}}},"required":true}}},"/api/v1/licenses/{ulid}/cancel":{"post":{"operationId":"license_cancel","tags":["License"],"responses":{"201":{"description":"License resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel license","description":"Cancel license. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License-license.write"}}},"required":true}}},"/api/v1/licenses/{ulid}/change-plan":{"post":{"operationId":"license_change_plan","tags":["License"],"responses":{"201":{"description":"License resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lizenz auf einen anderen Plan wechseln","description":"Wechselt die Lizenz auf einen anderen Plan und schreibt das Lizenz-Ereignis samt MRR-Differenz fort.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License-license.write"}}},"required":true}}},"/api/v1/licenses/{ulid}/expire":{"post":{"operationId":"license_expire","tags":["License"],"responses":{"201":{"description":"License resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lizenz auslaufen lassen (Endzustand)","description":"Beendet die Lizenz zum Laufzeitende: Entitlements gesperrt, MRR und ARR fallen auf 0 und damit aus jeder Umsatzauswertung heraus. Endzustand — es gibt keine Reaktivierung, nur eine neue Lizenz. Nur aus aktiv/überfällig/ausgesetzt möglich (sonst 409).","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License-license.write"}}},"required":true}}},"/api/v1/licenses/{ulid}/reactivate":{"post":{"operationId":"license_reactivate","tags":["License"],"responses":{"201":{"description":"License resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Reactivate license","description":"Reactivate license. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License-license.write"}}},"required":true}}},"/api/v1/licenses/{ulid}/renew":{"post":{"operationId":"license_renew","tags":["License"],"responses":{"201":{"description":"License resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lizenz verlängern","description":"Verlängert die Lizenz um eine Periode und schreibt das Lizenz-Ereignis samt MRR-Differenz fort.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License-license.write"}}},"required":true}}},"/api/v1/licenses/{ulid}/suspend":{"post":{"operationId":"license_suspend","tags":["License"],"responses":{"201":{"description":"License resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License.jsonld-license.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lizenz aussetzen — Zugang sofort sperren","description":"Sperrt alle Entitlements dieser Lizenz: der Kunde verliert den Zugang ab sofort. Die MRR bleibt bestehen, die Forderung besteht fort. Gedacht für offene Zahlung nach Karenzende; Aufheben über `/reactivate`. Bereits gekündigt/abgelaufen/ausgesetzt: 409. Body optional `{reason}`.","parameters":[{"name":"ulid","in":"path","description":"License identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new License resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/License-license.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/License-license.write"}}},"required":true}}},"/api/v1/license-events":{"get":{"operationId":"api_v1license-events_get_collection","tags":["LicenseEvent"],"responses":{"200":{"description":"LicenseEvent collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LicenseEvent-license_event.read"}}},"application/ld+json":{"schema":{"type":"object","description":"LicenseEvent.jsonld-license_event.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/LicenseEvent.jsonld-license_event.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of LicenseEvent resources.","description":"Retrieves the collection of LicenseEvent resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"licenseId","in":"query","description":"Lizenz-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"type","in":"query","description":"Ereignis-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/licenses/lifecycle-run":{"post":{"operationId":"license_lifecycle_run","tags":["LicenseLifecycleRun"],"responses":{"201":{"description":"LicenseLifecycleRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseLifecycleRun-license_lifecycle_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LicenseLifecycleRun.jsonld-license_lifecycle_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a LicenseLifecycleRun resource.","description":"Creates a LicenseLifecycleRun resource.","parameters":[],"requestBody":{"description":"The new LicenseLifecycleRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseLifecycleRun-license_lifecycle_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LicenseLifecycleRun-license_lifecycle_run.write"}}},"required":true}}},"/api/v1/licensing/license-statuses":{"get":{"operationId":"api_v1licensinglicense-statuses_get_collection","tags":["LicenseStatus"],"responses":{"200":{"description":"LicenseStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LicenseStatus-license_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"LicenseStatus.jsonld-license_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/LicenseStatus.jsonld-license_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of LicenseStatus resources.","description":"Retrieves the collection of LicenseStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1licensinglicense-statuses_post","tags":["LicenseStatus"],"responses":{"201":{"description":"LicenseStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseStatus-license_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LicenseStatus.jsonld-license_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a LicenseStatus resource.","description":"Creates a LicenseStatus resource.","parameters":[],"requestBody":{"description":"The new LicenseStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseStatus-license_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LicenseStatus-license_status.write"}}},"required":true}}},"/api/v1/licensing/license-statuses/{key}":{"get":{"operationId":"api_v1licensinglicense-statuses_key_get","tags":["LicenseStatus"],"responses":{"200":{"description":"LicenseStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseStatus-license_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LicenseStatus.jsonld-license_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a LicenseStatus resource.","description":"Retrieves a LicenseStatus resource.","parameters":[{"name":"key","in":"path","description":"LicenseStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1licensinglicense-statuses_key_delete","tags":["LicenseStatus"],"responses":{"204":{"description":"LicenseStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the LicenseStatus resource.","description":"Removes the LicenseStatus resource.","parameters":[{"name":"key","in":"path","description":"LicenseStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1licensinglicense-statuses_key_patch","tags":["LicenseStatus"],"responses":{"200":{"description":"LicenseStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseStatus-license_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LicenseStatus.jsonld-license_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the LicenseStatus resource.","description":"Updates the LicenseStatus resource.","parameters":[{"name":"key","in":"path","description":"LicenseStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated LicenseStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/LicenseStatus-license_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/license-summary":{"get":{"operationId":"api_v1license-summary_get_collection","tags":["LicenseSummary"],"responses":{"200":{"description":"LicenseSummary collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LicenseSummary-license_summary.read"}}},"application/ld+json":{"schema":{"type":"object","description":"LicenseSummary.jsonld-license_summary.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/LicenseSummary.jsonld-license_summary.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of LicenseSummary resources.","description":"Retrieves the collection of LicenseSummary resources.","parameters":[]}},"/api/v1/licensing/shopware-import-run":{"post":{"operationId":"licensing_shopware_import_run","tags":["LicensingShopwareImportRun"],"responses":{"201":{"description":"LicensingShopwareImportRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicensingShopwareImportRun-shopware_import_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LicensingShopwareImportRun.jsonld-shopware_import_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a LicensingShopwareImportRun resource.","description":"Creates a LicensingShopwareImportRun resource.","parameters":[],"requestBody":{"description":"The new LicensingShopwareImportRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicensingShopwareImportRun-shopware_import_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LicensingShopwareImportRun-shopware_import_run.write"}}},"required":true}}},"/api/v1/linkable-employees":{"get":{"operationId":"api_v1linkable-employees_get_collection","tags":["LinkableEmployee"],"responses":{"200":{"description":"LinkableEmployee collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LinkableEmployee-linkable_employee.read"}}},"application/ld+json":{"schema":{"type":"object","description":"LinkableEmployee.jsonld-linkable_employee.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/LinkableEmployee.jsonld-linkable_employee.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of LinkableEmployee resources.","description":"Retrieves the collection of LinkableEmployee resources.","parameters":[{"name":"q","in":"query","description":"Suche über Vorname, Nachname, Anzeigename und Personalnummer (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/plugin-candidates":{"get":{"operationId":"api_v1plugin-candidates_get_collection","tags":["LocalPluginCandidate"],"responses":{"200":{"description":"LocalPluginCandidate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LocalPluginCandidate-plugin_candidate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"LocalPluginCandidate.jsonld-plugin_candidate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/LocalPluginCandidate.jsonld-plugin_candidate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of LocalPluginCandidate resources.","description":"Retrieves the collection of LocalPluginCandidate resources.","parameters":[]}},"/api/v1/plugin-candidates/{dir}":{"get":{"operationId":"api_v1plugin-candidates_dir_get","tags":["LocalPluginCandidate"],"responses":{"200":{"description":"LocalPluginCandidate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalPluginCandidate-plugin_candidate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LocalPluginCandidate.jsonld-plugin_candidate.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a LocalPluginCandidate resource.","description":"Retrieves a LocalPluginCandidate resource.","parameters":[{"name":"dir","in":"path","description":"LocalPluginCandidate identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"local_plugin_candidate_delete","tags":["LocalPluginCandidate"],"responses":{"204":{"description":"LocalPluginCandidate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the LocalPluginCandidate resource.","description":"Removes the LocalPluginCandidate resource.","parameters":[{"name":"dir","in":"path","description":"LocalPluginCandidate identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/plugin-candidates/{dir}/install":{"post":{"operationId":"local_plugin_candidate_install","tags":["LocalPluginCandidate"],"responses":{"202":{"description":"LocalPluginCandidate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalPluginCandidate-plugin_candidate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LocalPluginCandidate.jsonld-plugin_candidate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Install plugin candidate","description":"Install plugin candidate. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"dir","in":"path","description":"LocalPluginCandidate identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new LocalPluginCandidate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalPluginCandidate"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/LocalPluginCandidate"}}},"required":true}}},"/api/v1/locales":{"get":{"operationId":"api_v1locales_get_collection","tags":["Locale"],"responses":{"200":{"description":"Locale collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Locale-locale.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Locale.jsonld-locale.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Locale.jsonld-locale.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Locale resources.","description":"Alle installierten UI-/Kommunikations-Sprachen (Core + Sprachpakete), Default zuerst.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]}},"/api/v1/ticket-mail-blocks":{"get":{"operationId":"api_v1ticket-mail-blocks_get_collection","tags":["MailBlock"],"responses":{"200":{"description":"MailBlock collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MailBlock-mail_block.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MailBlock.jsonld-mail_block.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MailBlock.jsonld-mail_block.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MailBlock resources.","description":"Retrieves the collection of MailBlock resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-mail-blocks_post","tags":["MailBlock"],"responses":{"201":{"description":"MailBlock resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailBlock-mail_block.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailBlock.jsonld-mail_block.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MailBlock resource.","description":"Creates a MailBlock resource.","parameters":[],"requestBody":{"description":"The new MailBlock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailBlock-mail_block.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailBlock-mail_block.write"}}},"required":true}}},"/api/v1/ticket-mail-blocks/{ulid}":{"get":{"operationId":"api_v1ticket-mail-blocks_ulid_get","tags":["MailBlock"],"responses":{"200":{"description":"MailBlock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailBlock-mail_block.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailBlock.jsonld-mail_block.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MailBlock resource.","description":"Retrieves a MailBlock resource.","parameters":[{"name":"ulid","in":"path","description":"MailBlock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-mail-blocks_ulid_delete","tags":["MailBlock"],"responses":{"204":{"description":"MailBlock resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MailBlock resource.","description":"Removes the MailBlock resource.","parameters":[{"name":"ulid","in":"path","description":"MailBlock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-mail-blocks_ulid_patch","tags":["MailBlock"],"responses":{"200":{"description":"MailBlock resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailBlock-mail_block.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailBlock.jsonld-mail_block.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MailBlock resource.","description":"Updates the MailBlock resource.","parameters":[{"name":"ulid","in":"path","description":"MailBlock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MailBlock resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MailBlock-mail_block.write.jsonMergePatch"}}},"required":true}}},"/api/v1/mail/block-types":{"get":{"operationId":"api_v1mailblock-types_get_collection","tags":["MailBlockType"],"responses":{"200":{"description":"MailBlockType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MailBlockType-mail_block.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MailBlockType.jsonld-mail_block.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MailBlockType.jsonld-mail_block.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Baustein-Palette des Mail-Editors","description":"Alle registrierten Mail-Baustein-Typen mit settingsSchema, sortiert nach Kategorie/Label.","parameters":[]}},"/api/v1/mail-templates/canvas":{"post":{"operationId":"api_v1mail-templatescanvas_post","tags":["MailCanvas"],"responses":{"201":{"description":"MailCanvas resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailCanvas.MailCanvasResult-mail_canvas.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailCanvas.MailCanvasResult.jsonld-mail_canvas.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Mail-Baum in den Editor-Canvas rendern","description":"Rendert einen Mail-Baustein-Baum zu vollstaendigem Mail-HTML fuer den Editor-Canvas. Persistiert nichts.","parameters":[],"requestBody":{"description":"The new MailCanvas resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailCanvas-mail_canvas.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailCanvas-mail_canvas.write"}}},"required":true}}},"/api/v1/mail-layouts":{"get":{"operationId":"api_v1mail-layouts_get_collection","tags":["MailLayout"],"responses":{"200":{"description":"MailLayout collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MailLayout-mail_layout.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MailLayout.jsonld-mail_layout.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MailLayout.jsonld-mail_layout.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MailLayout resources.","description":"Retrieves the collection of MailLayout resources.","parameters":[]},"post":{"operationId":"api_v1mail-layouts_post","tags":["MailLayout"],"responses":{"201":{"description":"MailLayout resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailLayout-mail_layout.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailLayout.jsonld-mail_layout.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MailLayout resource.","description":"Creates a MailLayout resource.","parameters":[],"requestBody":{"description":"The new MailLayout resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailLayout-mail_layout.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailLayout-mail_layout.write"}}},"required":true}}},"/api/v1/mail-layouts/{ulid}":{"get":{"operationId":"api_v1mail-layouts_ulid_get","tags":["MailLayout"],"responses":{"200":{"description":"MailLayout resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailLayout-mail_layout.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailLayout.jsonld-mail_layout.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MailLayout resource.","description":"Retrieves a MailLayout resource.","parameters":[{"name":"ulid","in":"path","description":"MailLayout identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1mail-layouts_ulid_delete","tags":["MailLayout"],"responses":{"204":{"description":"MailLayout resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MailLayout resource.","description":"Removes the MailLayout resource.","parameters":[{"name":"ulid","in":"path","description":"MailLayout identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1mail-layouts_ulid_patch","tags":["MailLayout"],"responses":{"200":{"description":"MailLayout resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailLayout-mail_layout.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailLayout.jsonld-mail_layout.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MailLayout resource.","description":"Updates the MailLayout resource.","parameters":[{"name":"ulid","in":"path","description":"MailLayout identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MailLayout resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MailLayout-mail_layout.write.jsonMergePatch"}}},"required":true}}},"/api/v1/mail-layouts/preview":{"post":{"operationId":"api_v1mail-layoutspreview_post","tags":["MailLayoutPreview"],"responses":{"201":{"description":"MailLayoutPreview resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailLayoutPreview.MailLayoutPreviewResult-mail_layout_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailLayoutPreview.MailLayoutPreviewResult.jsonld-mail_layout_preview.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MailLayoutPreview resource.","description":"Creates a MailLayoutPreview resource.","parameters":[],"requestBody":{"description":"The new MailLayoutPreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailLayoutPreview-mail_layout_preview.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailLayoutPreview-mail_layout_preview.write"}}},"required":true}}},"/api/v1/ticket-mail-rules":{"get":{"operationId":"api_v1ticket-mail-rules_get_collection","tags":["MailRule"],"responses":{"200":{"description":"MailRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MailRule-mail_rule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MailRule.jsonld-mail_rule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MailRule.jsonld-mail_rule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MailRule resources.","description":"Retrieves the collection of MailRule resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-mail-rules_post","tags":["MailRule"],"responses":{"201":{"description":"MailRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailRule-mail_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailRule.jsonld-mail_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MailRule resource.","description":"Creates a MailRule resource.","parameters":[],"requestBody":{"description":"The new MailRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailRule-mail_rule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailRule-mail_rule.write"}}},"required":true}}},"/api/v1/ticket-mail-rules/{ulid}":{"get":{"operationId":"api_v1ticket-mail-rules_ulid_get","tags":["MailRule"],"responses":{"200":{"description":"MailRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailRule-mail_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailRule.jsonld-mail_rule.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MailRule resource.","description":"Retrieves a MailRule resource.","parameters":[{"name":"ulid","in":"path","description":"MailRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-mail-rules_ulid_delete","tags":["MailRule"],"responses":{"204":{"description":"MailRule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MailRule resource.","description":"Removes the MailRule resource.","parameters":[{"name":"ulid","in":"path","description":"MailRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-mail-rules_ulid_patch","tags":["MailRule"],"responses":{"200":{"description":"MailRule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailRule-mail_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailRule.jsonld-mail_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MailRule resource.","description":"Updates the MailRule resource.","parameters":[{"name":"ulid","in":"path","description":"MailRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MailRule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MailRule-mail_rule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/mail-templates":{"get":{"operationId":"api_v1mail-templates_get_collection","tags":["MailTemplate"],"responses":{"200":{"description":"MailTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MailTemplate-mail_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MailTemplate.jsonld-mail_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MailTemplate.jsonld-mail_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MailTemplate resources.","description":"Retrieves the collection of MailTemplate resources.","parameters":[]},"post":{"operationId":"api_v1mail-templates_post","tags":["MailTemplate"],"responses":{"201":{"description":"MailTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailTemplate-mail_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailTemplate.jsonld-mail_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MailTemplate resource.","description":"Creates a MailTemplate resource.","parameters":[],"requestBody":{"description":"The new MailTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailTemplate-mail_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailTemplate-mail_template.write"}}},"required":true}}},"/api/v1/mail-templates/{ulid}":{"get":{"operationId":"api_v1mail-templates_ulid_get","tags":["MailTemplate"],"responses":{"200":{"description":"MailTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailTemplate-mail_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailTemplate.jsonld-mail_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MailTemplate resource.","description":"Retrieves a MailTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"MailTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1mail-templates_ulid_delete","tags":["MailTemplate"],"responses":{"204":{"description":"MailTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MailTemplate resource.","description":"Removes the MailTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"MailTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1mail-templates_ulid_patch","tags":["MailTemplate"],"responses":{"200":{"description":"MailTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailTemplate-mail_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailTemplate.jsonld-mail_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MailTemplate resource.","description":"Updates the MailTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"MailTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MailTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MailTemplate-mail_template.write.jsonMergePatch"}}},"required":true}}},"/api/v1/mail-templates/{ulid}/test-send":{"post":{"operationId":"api_v1mail-templates_ulidtest-send_post","tags":["MailTemplate"],"responses":{"201":{"description":"MailTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailTemplate.MailTemplateTestSendResource-mail_template_testsend.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailTemplate.MailTemplateTestSendResource.jsonld-mail_template_testsend.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Testmail der Vorlage verschicken","description":"Verschickt eine Testmail dieser Vorlage an die angegebene Adresse. Die Vorlage selbst bleibt unverändert.","parameters":[{"name":"ulid","in":"path","description":"MailTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MailTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailTemplate.MailTemplateTestSendResource-mail_template_testsend.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailTemplate.MailTemplateTestSendResource-mail_template_testsend.write"}}},"required":true}}},"/api/v1/mail-templates/preview":{"post":{"operationId":"api_v1mail-templatespreview_post","tags":["MailTemplatePreview"],"responses":{"201":{"description":"MailTemplatePreview resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailTemplatePreview.MailTemplatePreviewResult-mail_template_preview.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailTemplatePreview.MailTemplatePreviewResult.jsonld-mail_template_preview.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MailTemplatePreview resource.","description":"Creates a MailTemplatePreview resource.","parameters":[],"requestBody":{"description":"The new MailTemplatePreview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailTemplatePreview-mail_template_preview.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailTemplatePreview-mail_template_preview.write"}}},"required":true}}},"/api/v1/marketing/mail-variables":{"get":{"operationId":"api_v1marketingmail-variables_get_collection","tags":["MailVariable"],"responses":{"200":{"description":"MailVariable collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MailVariable-mkt_mail_variable.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MailVariable.jsonld-mkt_mail_variable.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MailVariable.jsonld-mkt_mail_variable.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verfügbare Platzhalter","description":"Alle Platzhalter einer Marketing-Mail mit Bedeutung, Beispielwert und Herkunft. `pattern: true` heißt: kein fester Name, sondern eine Form (eigene Felder).","parameters":[]}},"/api/v1/mailbox-connections":{"get":{"operationId":"api_v1mailbox-connections_get_collection","tags":["MailboxConnection"],"responses":{"200":{"description":"MailboxConnection collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MailboxConnection-mailbox_connection.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MailboxConnection.jsonld-mailbox_connection.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MailboxConnection.jsonld-mailbox_connection.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MailboxConnection resources.","description":"Retrieves the collection of MailboxConnection resources.","parameters":[]},"post":{"operationId":"api_v1mailbox-connections_post","tags":["MailboxConnection"],"responses":{"201":{"description":"MailboxConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxConnection-mailbox_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailboxConnection.jsonld-mailbox_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MailboxConnection resource.","description":"Creates a MailboxConnection resource.","parameters":[],"requestBody":{"description":"The new MailboxConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxConnection-mailbox_connection.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailboxConnection-mailbox_connection.write"}}},"required":true}}},"/api/v1/mailbox-connections/{ulid}":{"get":{"operationId":"api_v1mailbox-connections_ulid_get","tags":["MailboxConnection"],"responses":{"200":{"description":"MailboxConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxConnection-mailbox_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailboxConnection.jsonld-mailbox_connection.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MailboxConnection resource.","description":"Retrieves a MailboxConnection resource.","parameters":[{"name":"ulid","in":"path","description":"MailboxConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1mailbox-connections_ulid_delete","tags":["MailboxConnection"],"responses":{"204":{"description":"MailboxConnection resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MailboxConnection resource.","description":"Removes the MailboxConnection resource.","parameters":[{"name":"ulid","in":"path","description":"MailboxConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1mailbox-connections_ulid_patch","tags":["MailboxConnection"],"responses":{"200":{"description":"MailboxConnection resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxConnection-mailbox_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MailboxConnection.jsonld-mailbox_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MailboxConnection resource.","description":"Updates the MailboxConnection resource.","parameters":[{"name":"ulid","in":"path","description":"MailboxConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MailboxConnection resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MailboxConnection-mailbox_connection.write.jsonMergePatch"}}},"required":true}}},"/api/v1/marketing/ad-campaigns":{"get":{"operationId":"api_v1marketingad-campaigns_get_collection","tags":["MarketingAdCampaign"],"responses":{"200":{"description":"MarketingAdCampaign collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingAdCampaign.jsonld-mkt_ads.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingAdCampaign.jsonld-mkt_ads.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingAdCampaign resources.","description":"Retrieves the collection of MarketingAdCampaign resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Zustand (exakter Match): draft|scheduled|active|paused|completed|rejected","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"platform","in":"query","description":"Netzwerk (exakter Match), derzeit `meta`","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"campaignId","in":"query","description":"Filtert auf die Dach-Kampagne (numerische ID).","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über den Kampagnen-Namen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Zustand (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[startsAt]","in":"query","description":"Sortierung nach Startzeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingad-campaigns_post","tags":["MarketingAdCampaign"],"responses":{"201":{"description":"MarketingAdCampaign resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign.jsonld-mkt_ads.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Werbekampagne als Entwurf anlegen","description":"Legt eine Werbekampagne an. Sie entsteht IMMER als Entwurf und gibt kein Geld aus, bis sie über `/activate` scharf geschaltet wird. `budgetCapCent` ist Pflicht — der Deckel ist die einzige Stelle, an der das System Ausgaben begrenzt.","parameters":[],"requestBody":{"description":"The new MarketingAdCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write"}}},"required":true}}},"/api/v1/marketing/ad-campaigns/{ulid}":{"get":{"operationId":"api_v1marketingad-campaigns_ulid_get","tags":["MarketingAdCampaign"],"responses":{"200":{"description":"MarketingAdCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign.jsonld-mkt_ads.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingAdCampaign resource.","description":"Retrieves a MarketingAdCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingAdCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1marketingad-campaigns_ulid_delete","tags":["MarketingAdCampaign"],"responses":{"204":{"description":"MarketingAdCampaign resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MarketingAdCampaign resource.","description":"Removes the MarketingAdCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingAdCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1marketingad-campaigns_ulid_patch","tags":["MarketingAdCampaign"],"responses":{"200":{"description":"MarketingAdCampaign resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign.jsonld-mkt_ads.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MarketingAdCampaign resource.","description":"Updates the MarketingAdCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingAdCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MarketingAdCampaign resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write.jsonMergePatch"}}},"required":true}}},"/api/v1/marketing/ad-campaigns/{ulid}/activate":{"post":{"operationId":"api_v1marketingad-campaigns_ulidactivate_post","tags":["MarketingAdCampaign"],"responses":{"201":{"description":"MarketingAdCampaign resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign.jsonld-mkt_ads.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Werbekampagne scharf schalten","description":"Legt die Kampagne beim Netzwerk an (falls noch nicht geschehen) und startet die Auslieferung. Ab hier kostet sie Geld. Verlangt das Freigabe-Recht `marketing.ads.publish` IN DER MARKE der Kampagne — nicht dasselbe wie Bearbeiten, und nicht dasselbe wie dieses Recht irgendwo zu halten.","parameters":[{"name":"ulid","in":"path","description":"MarketingAdCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingAdCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write"}}},"required":true}}},"/api/v1/marketing/ad-campaigns/{ulid}/budget":{"post":{"operationId":"api_v1marketingad-campaigns_ulidbudget_post","tags":["MarketingAdCampaign"],"responses":{"201":{"description":"MarketingAdCampaign resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign.jsonld-mkt_ads.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Budget ändern","description":"Setzt Tages- oder Laufzeitbudget. Verlangt `marketing.ads.manage` IN DER MARKE der Kampagne. Über dem Deckel wird abgelehnt; der Deckel selbst lässt sich nur mit dem Freigabe-Recht `marketing.ads.publish` in derselben Marke heben.","parameters":[{"name":"ulid","in":"path","description":"MarketingAdCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingAdCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write"}}},"required":true}}},"/api/v1/marketing/ad-campaigns/{ulid}/pause":{"post":{"operationId":"api_v1marketingad-campaigns_ulidpause_post","tags":["MarketingAdCampaign"],"responses":{"201":{"description":"MarketingAdCampaign resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign.jsonld-mkt_ads.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Werbekampagne anhalten","description":"Stoppt die Auslieferung sofort. Anhalten darf, wer die Kampagne IN IHRER MARKE bearbeiten darf — Geld sparen ist nie der gefährlichere Weg.","parameters":[{"name":"ulid","in":"path","description":"MarketingAdCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingAdCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdCampaign-mkt_ads.write"}}},"required":true}}},"/api/v1/marketing/ads/report":{"get":{"operationId":"api_v1marketingadsreport_get","tags":["MarketingAdReport"],"responses":{"200":{"description":"MarketingAdReport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAdReport-mkt_ads_report.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAdReport.jsonld-mkt_ads_report.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Werbe-Auswertung","description":"Ausgaben, Klicks, Ergebnisse und die daraus gerechneten Kennzahlen (Klickrate, Kosten je Klick, Kosten je Ergebnis, Werbeausgabenrendite) für einen Zeitraum — je Kampagne und als Summe. Geld je Zeile in der Konto-Währung der Kampagne (`currency`, `spendCent`, `revenueCent`, `cpcCent`, `cpaCent`) UND in EUR (`spendEurCent`, `revenueEurCent`) über den beim Anlegen eingefrorenen Kurs `eurRate` (Fremdwährung je 1 EUR). Fremdwährungs-Zeilen ohne Kurs tragen `unconverted: true` und bleiben ganz aus der Summe (`totals.unconvertedRows`). Die Summe und ihre Kennzahlen stehen ausschließlich in EUR (`totals.currency`).","parameters":[{"name":"from","in":"query","description":"Beginn des Zeitraums (YYYY-MM-DD); Vorgabe: vor 30 Tagen.","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Ende des Zeitraums (YYYY-MM-DD, einschließlich); Vorgabe: heute.","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"campaignUlid","in":"query","description":"Auf eine Werbekampagne einschränken; ohne Angabe alle sichtbaren.","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"level","in":"query","description":"Auflösungsebene der Zeilen; Vorgabe `campaign`.","required":false,"deprecated":false,"schema":{"type":"string","enum":["campaign","group","ad"]},"style":"form","explode":true}]}},"/api/v1/marketing/ai":{"post":{"operationId":"api_v1marketingai_post","tags":["MarketingAi"],"responses":{"201":{"description":"MarketingAi resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAi-mkt_ai.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAi.jsonld-mkt_ai.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingAi resource.","description":"Creates a MarketingAi resource.","parameters":[],"requestBody":{"description":"The new MarketingAi resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAi-mkt_ai.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAi-mkt_ai.write"}}},"required":true}}},"/api/v1/marketing/audiences":{"get":{"operationId":"api_v1marketingaudiences_get_collection","tags":["MarketingAudience"],"responses":{"200":{"description":"MarketingAudience collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingAudience.jsonld-mkt_audience.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingAudience.jsonld-mkt_audience.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingAudience resources.","description":"Retrieves the collection of MarketingAudience resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"kind","in":"query","description":"Segment-Art (exakter Match, z.B. dynamic|static)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über den Namen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc); Default asc","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingaudiences_post","tags":["MarketingAudience"],"responses":{"201":{"description":"MarketingAudience resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience.jsonld-mkt_audience.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingAudience resource.","description":"Creates a MarketingAudience resource.","parameters":[],"requestBody":{"description":"The new MarketingAudience resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.write"}}},"required":true}}},"/api/v1/marketing/audiences/preview":{"post":{"operationId":"api_v1marketingaudiencespreview_post","tags":["MarketingAudience"],"responses":{"201":{"description":"MarketingAudience resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience.jsonld-mkt_audience.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingAudience resource.","description":"Creates a MarketingAudience resource.","parameters":[],"requestBody":{"description":"The new MarketingAudience resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.write"}}},"required":true}}},"/api/v1/marketing/audiences/{ulid}":{"get":{"operationId":"api_v1marketingaudiences_ulid_get","tags":["MarketingAudience"],"responses":{"200":{"description":"MarketingAudience resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience.jsonld-mkt_audience.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingAudience resource.","description":"Retrieves a MarketingAudience resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingAudience identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1marketingaudiences_ulid_delete","tags":["MarketingAudience"],"responses":{"204":{"description":"MarketingAudience resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MarketingAudience resource.","description":"Removes the MarketingAudience resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingAudience identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1marketingaudiences_ulid_patch","tags":["MarketingAudience"],"responses":{"200":{"description":"MarketingAudience resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience.jsonld-mkt_audience.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MarketingAudience resource.","description":"Updates the MarketingAudience resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingAudience identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MarketingAudience resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.write.jsonMergePatch"}}},"required":true}}},"/api/v1/marketing/audiences/{ulid}/preview":{"post":{"operationId":"api_v1marketingaudiences_ulidpreview_post","tags":["MarketingAudience"],"responses":{"201":{"description":"MarketingAudience resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience.jsonld-mkt_audience.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Segmentgröße live berechnen","description":"Rechnet die Größe des Segments live aus und schreibt sie an der Zielgruppe fort (`estimatedSize`) — die Regel selbst bleibt unberührt. Verlangt `marketing.campaign.manage` IN DER MARKE der Zielgruppe.","parameters":[{"name":"ulid","in":"path","description":"MarketingAudience identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingAudience resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingAudience-mkt_audience.write"}}},"required":true}}},"/api/v1/marketing/campaigns":{"get":{"operationId":"api_v1marketingcampaigns_get_collection","tags":["MarketingCampaign"],"responses":{"200":{"description":"MarketingCampaign collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingCampaign.jsonld-mkt_campaign.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingCampaign.jsonld-mkt_campaign.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingCampaign resources.","description":"Retrieves the collection of MarketingCampaign resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Name (LIKE).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive bzw. nur inaktive Kampagnen (Zustand der Automation).","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"entryMode","in":"query","description":"Betriebsart: per_recipient (Strecke) | bulk (Newsletter).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"ownerId","in":"query","description":"Nur Kampagnen dieses Verantwortlichen.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingcampaigns_post","tags":["MarketingCampaign"],"responses":{"201":{"description":"MarketingCampaign resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign.jsonld-mkt_campaign.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Strecke anlegen","description":"Legt die Huelle UND ihre Automation in einem Zug an (die Automation ist die Laufzeit; die Huelle traegt nur den Marketing-Bezug). Die Strecke startet INAKTIV.","parameters":[],"requestBody":{"description":"The new MarketingCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.write"}}},"required":true}}},"/api/v1/marketing/campaigns/{ulid}":{"get":{"operationId":"api_v1marketingcampaigns_ulid_get","tags":["MarketingCampaign"],"responses":{"200":{"description":"MarketingCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign.jsonld-mkt_campaign.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingCampaign resource.","description":"Retrieves a MarketingCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1marketingcampaigns_ulid_delete","tags":["MarketingCampaign"],"responses":{"204":{"description":"MarketingCampaign resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MarketingCampaign resource.","description":"Removes the MarketingCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1marketingcampaigns_ulid_patch","tags":["MarketingCampaign"],"responses":{"200":{"description":"MarketingCampaign resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign.jsonld-mkt_campaign.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MarketingCampaign resource.","description":"Updates the MarketingCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MarketingCampaign resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.write.jsonMergePatch"}}},"required":true}}},"/api/v1/marketing/campaigns/{ulid}/scan":{"post":{"operationId":"api_v1marketingcampaigns_ulidscan_post","tags":["MarketingCampaign"],"responses":{"201":{"description":"MarketingCampaign resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign.jsonld-mkt_campaign.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zielgruppe jetzt abklappern","description":"Nimmt sofort alle Empfänger der hinterlegten Zielgruppe auf, statt auf den täglichen Lauf zu warten. Idempotent: wer schon in der Strecke ist, kommt nicht erneut hinein. Antwortet mit der Zahl der tatsächlich neu Aufgenommenen (`enrolled`).","parameters":[{"name":"ulid","in":"path","description":"MarketingCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.write"}}},"required":true}}},"/api/v1/marketing/campaigns/{ulid}/stats":{"get":{"operationId":"api_v1marketingcampaigns_ulidstats_get","tags":["MarketingCampaign"],"responses":{"200":{"description":"MarketingCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign-mkt_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaign.jsonld-mkt_campaign.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Statistik je Strecken-Schritt","description":"Zahlen je Schritt-Position (erreicht, versendet, geoeffnet, geklickt) plus die Lauf-Zustaende der Strecke. `reached` ist KUMULATIV (R43-10): ein Lauf zaehlt an jedem Schritt, den er ausgefuehrt hat oder vor dem er in Bedingungs-Wartung steht — nicht am Schritt, auf dem sein Cursor gerade steht.","parameters":[{"name":"ulid","in":"path","description":"MarketingCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/marketing/campaigns/{ulid}/enroll":{"post":{"operationId":"api_v1marketingcampaigns_ulidenroll_post","tags":["MarketingCampaignEnroll"],"responses":{"201":{"description":"MarketingCampaignEnroll resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaignEnroll-mkt_campaign_enroll.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaignEnroll.jsonld-mkt_campaign_enroll.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Empfänger in die Strecke aufnehmen","description":"Löst das Aufnahme-Ereignis aus (derselbe Weg wie die automatische Aufnahme). Gesperrte Adressen und inaktive Strecken nehmen niemanden auf; ein bereits aufgenommener Empfänger erzeugt keinen zweiten Lauf.","parameters":[{"name":"ulid","in":"path","description":"MarketingCampaignEnroll identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingCampaignEnroll resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaignEnroll-mkt_campaign_enroll.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaignEnroll-mkt_campaign_enroll.write"}}},"required":true}}},"/api/v1/marketing/campaigns/{ulid}/test-message":{"post":{"operationId":"api_v1marketingcampaigns_ulidtest-message_post","tags":["MarketingCampaignMessageTest"],"responses":{"201":{"description":"MarketingCampaignMessageTest resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaignMessageTest-mkt_campaign_msgtest.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaignMessageTest.jsonld-mkt_campaign_msgtest.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Testmail EINER Nachricht der Strecke","description":"Verschickt die Nachricht an der angegebenen Schritt-Position an eine Adresse — mit ihrem eigenen Betreff und ihren eigenen Inhalten, gerendert wie im Versand. Ohne Einwilligungs-Prüfung, ohne Drossel und OHNE Tracking-Zeile: eine Testmail ist eine Ansicht, kein Versand, und dürfte die Zustellquote der Nachricht nicht verschieben. Der Betreff trägt sichtbar `[TEST]`.","parameters":[{"name":"ulid","in":"path","description":"MarketingCampaignMessageTest identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingCampaignMessageTest resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCampaignMessageTest-mkt_campaign_msgtest.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingCampaignMessageTest-mkt_campaign_msgtest.write"}}},"required":true}}},"/api/v1/marketing/consents":{"get":{"operationId":"api_v1marketingconsents_get_collection","tags":["MarketingConsent"],"responses":{"200":{"description":"MarketingConsent collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingConsent.jsonld-mkt_consent.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingConsent.jsonld-mkt_consent.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingConsent resources.","description":"Retrieves the collection of MarketingConsent resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Filtert auf den Consent-Status (exakter Match).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"email","in":"query","description":"Suche über die E-Mail-Adresse (LIKE, case-insensitiv).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über die E-Mail-Adresse (LIKE, case-insensitiv; UI-Suchbox)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[email]","in":"query","description":"Sortierung nach E-Mail-Adresse (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[channel]","in":"query","description":"Sortierung nach Kanal (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingconsents_post","tags":["MarketingConsent"],"responses":{"201":{"description":"MarketingConsent resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingConsent.jsonld-mkt_consent.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingConsent resource.","description":"Creates a MarketingConsent resource.","parameters":[],"requestBody":{"description":"The new MarketingConsent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.write"}}},"required":true}}},"/api/v1/marketing/consents/{ulid}":{"get":{"operationId":"api_v1marketingconsents_ulid_get","tags":["MarketingConsent"],"responses":{"200":{"description":"MarketingConsent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingConsent.jsonld-mkt_consent.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingConsent resource.","description":"Retrieves a MarketingConsent resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingConsent identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/marketing/consents/{ulid}/resend-doi":{"post":{"operationId":"api_v1marketingconsents_ulidresend-doi_post","tags":["MarketingConsent"],"responses":{"201":{"description":"MarketingConsent resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingConsent.jsonld-mkt_consent.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bestaetigungsmail erneut senden","description":"Schickt die Double-Opt-in-Mail noch einmal an die Adresse der Einwilligung. Verlangt `marketing.consent.manage` IN DER MARKE der Einwilligung.","parameters":[{"name":"ulid","in":"path","description":"MarketingConsent identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingConsent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.write"}}},"required":true}}},"/api/v1/marketing/consents/{ulid}/withdraw":{"post":{"operationId":"api_v1marketingconsents_ulidwithdraw_post","tags":["MarketingConsent"],"responses":{"201":{"description":"MarketingConsent resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingConsent.jsonld-mkt_consent.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einwilligung widerrufen","description":"Setzt die Einwilligung auf widerrufen — ab sofort geht an diese Adresse keine Werbung mehr. Verlangt `marketing.consent.manage` IN DER MARKE der Einwilligung.","parameters":[{"name":"ulid","in":"path","description":"MarketingConsent identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingConsent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingConsent-mkt_consent.write"}}},"required":true}}},"/api/v1/marketing/dashboard":{"get":{"operationId":"api_v1marketingdashboard_get_collection","tags":["MarketingDashboard"],"responses":{"200":{"description":"MarketingDashboard collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingDashboard-mkt_dashboard.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingDashboard.jsonld-mkt_dashboard.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingDashboard.jsonld-mkt_dashboard.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingDashboard resources.","description":"Retrieves the collection of MarketingDashboard resources.","parameters":[]}},"/api/v1/marketing/dispatches":{"get":{"operationId":"api_v1marketingdispatches_get_collection","tags":["MarketingDispatch"],"responses":{"200":{"description":"MarketingDispatch collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingDispatch.jsonld-mkt_ec.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingDispatch.jsonld-mkt_ec.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingDispatch resources.","description":"Retrieves the collection of MarketingDispatch resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"campaignId","in":"query","description":"Filtert auf die zugehörige Kampagne (numerische ID).","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Name und Betreff","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[subject]","in":"query","description":"Sortierung nach Betreff (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[scheduledAt]","in":"query","description":"Sortierung nach Planungszeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[sentAt]","in":"query","description":"Sortierung nach Versandzeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingdispatches_post","tags":["MarketingDispatch"],"responses":{"201":{"description":"MarketingDispatch resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch.jsonld-mkt_ec.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingDispatch resource.","description":"Creates a MarketingDispatch resource.","parameters":[],"requestBody":{"description":"The new MarketingDispatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write"}}},"required":true}}},"/api/v1/marketing/dispatches/{ulid}":{"get":{"operationId":"api_v1marketingdispatches_ulid_get","tags":["MarketingDispatch"],"responses":{"200":{"description":"MarketingDispatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch.jsonld-mkt_ec.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingDispatch resource.","description":"Retrieves a MarketingDispatch resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingDispatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1marketingdispatches_ulid_delete","tags":["MarketingDispatch"],"responses":{"204":{"description":"MarketingDispatch resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MarketingDispatch resource.","description":"Removes the MarketingDispatch resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingDispatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1marketingdispatches_ulid_patch","tags":["MarketingDispatch"],"responses":{"200":{"description":"MarketingDispatch resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch.jsonld-mkt_ec.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MarketingDispatch resource.","description":"Updates the MarketingDispatch resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingDispatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MarketingDispatch resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write.jsonMergePatch"}}},"required":true}}},"/api/v1/marketing/dispatches/{ulid}/schedule":{"post":{"operationId":"api_v1marketingdispatches_ulidschedule_post","tags":["MarketingDispatch"],"responses":{"201":{"description":"MarketingDispatch resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch.jsonld-mkt_ec.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kampagnenversand einplanen","description":"Plant den Versand der Kampagne auf einen Zeitpunkt. Verlangt das Versandrecht `marketing.campaign.send` IN DER ABSENDER-MARKE des Versands — und in den Marken von Segment und Vorlage.","parameters":[{"name":"ulid","in":"path","description":"MarketingDispatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingDispatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write"}}},"required":true}}},"/api/v1/marketing/dispatches/{ulid}/send-now":{"post":{"operationId":"api_v1marketingdispatches_ulidsend-now_post","tags":["MarketingDispatch"],"responses":{"201":{"description":"MarketingDispatch resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch.jsonld-mkt_ec.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kampagne sofort versenden","description":"Stößt den Versand SOFORT an: die Kampagne geht auf `scheduled` und der Lauf läuft asynchron über die Queue — die Mails gehen an echte Empfänger. Verlangt das Versandrecht `marketing.campaign.send` IN DER ABSENDER-MARKE. Eine bereits versendete Kampagne wird abgewiesen.","parameters":[{"name":"ulid","in":"path","description":"MarketingDispatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingDispatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write"}}},"required":true}}},"/api/v1/marketing/dispatches/{ulid}/test":{"post":{"operationId":"api_v1marketingdispatches_ulidtest_post","tags":["MarketingDispatch"],"responses":{"201":{"description":"MarketingDispatch resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch.jsonld-mkt_ec.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Testmail der Kampagne verschicken","description":"Verschickt eine Testmail der Kampagne an die angegebene Adresse, ohne die Zielgruppe anzufassen.","parameters":[{"name":"ulid","in":"path","description":"MarketingDispatch identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingDispatch resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingDispatch-mkt_ec.write"}}},"required":true}}},"/api/v1/marketing/email-events":{"get":{"operationId":"api_v1marketingemail-events_get_collection","tags":["MarketingEmailEvent"],"responses":{"200":{"description":"MarketingEmailEvent collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingEmailEvent-mkt_event.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingEmailEvent.jsonld-mkt_event.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingEmailEvent.jsonld-mkt_event.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingEmailEvent resources.","description":"Retrieves the collection of MarketingEmailEvent resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"dispatchId","in":"query","description":"ULID des Versands (Dispatch) — PFLICHT; ohne diesen Parameter antwortet die Operation mit 422.","required":true,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/marketing/email-templates":{"get":{"operationId":"api_v1marketingemail-templates_get_collection","tags":["MarketingEmailTemplate"],"responses":{"200":{"description":"MarketingEmailTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingEmailTemplate.jsonld-mkt_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingEmailTemplate.jsonld-mkt_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingEmailTemplate resources.","description":"Retrieves the collection of MarketingEmailTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Name + Betreff (LIKE).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"id","in":"query","description":"Genau diese Vorlage (interne ID, wie sie in Schritt-Konfigurationen und Kampagnen als `templateId` steht); bleibt im Marken-Scope.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[subject]","in":"query","description":"Sortierung nach Betreff (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingemail-templates_post","tags":["MarketingEmailTemplate"],"responses":{"201":{"description":"MarketingEmailTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate.jsonld-mkt_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingEmailTemplate resource.","description":"Creates a MarketingEmailTemplate resource.","parameters":[],"requestBody":{"description":"The new MarketingEmailTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.write"}}},"required":true}}},"/api/v1/marketing/email-templates/preview":{"post":{"operationId":"api_v1marketingemail-templatespreview_post","tags":["MarketingEmailTemplate"],"responses":{"201":{"description":"MarketingEmailTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate.jsonld-mkt_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingEmailTemplate resource.","description":"Creates a MarketingEmailTemplate resource.","parameters":[],"requestBody":{"description":"The new MarketingEmailTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.write"}}},"required":true}}},"/api/v1/marketing/email-templates/{ulid}":{"get":{"operationId":"api_v1marketingemail-templates_ulid_get","tags":["MarketingEmailTemplate"],"responses":{"200":{"description":"MarketingEmailTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate.jsonld-mkt_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingEmailTemplate resource.","description":"Retrieves a MarketingEmailTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingEmailTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1marketingemail-templates_ulid_delete","tags":["MarketingEmailTemplate"],"responses":{"204":{"description":"MarketingEmailTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MarketingEmailTemplate resource.","description":"Removes the MarketingEmailTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingEmailTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1marketingemail-templates_ulid_patch","tags":["MarketingEmailTemplate"],"responses":{"200":{"description":"MarketingEmailTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate.jsonld-mkt_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MarketingEmailTemplate resource.","description":"Updates the MarketingEmailTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingEmailTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MarketingEmailTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.write.jsonMergePatch"}}},"required":true}}},"/api/v1/marketing/email-templates/{ulid}/preview":{"post":{"operationId":"api_v1marketingemail-templates_ulidpreview_post","tags":["MarketingEmailTemplate"],"responses":{"201":{"description":"MarketingEmailTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate.jsonld-mkt_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vorlage zur Ansicht rendern","description":"Rendert die Vorlage zur Ansicht — es wird weder versendet noch gespeichert.","parameters":[{"name":"ulid","in":"path","description":"MarketingEmailTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingEmailTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplate-mkt_template.write"}}},"required":true}}},"/api/v1/marketing/email-templates/{ulid}/test-send":{"post":{"operationId":"api_v1marketingemail-templates_ulidtest-send_post","tags":["MarketingEmailTemplateTestSend"],"responses":{"201":{"description":"MarketingEmailTemplateTestSend resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplateTestSend-mkt_template_test.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplateTestSend.jsonld-mkt_template_test.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vorlage als Testmail senden","description":"Sendet die Vorlage mit Demo-Empfaengerdaten an EINE Adresse; Betreff mit [Test]-Vorsatz. Transportfehler werden als sent=false gemeldet, nicht als 500.","parameters":[{"name":"ulid","in":"path","description":"MarketingEmailTemplateTestSend identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingEmailTemplateTestSend resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplateTestSend-mkt_template_test.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingEmailTemplateTestSend-mkt_template_test.write"}}},"required":true}}},"/api/v1/marketing/form-submissions":{"get":{"operationId":"api_v1marketingform-submissions_get_collection","tags":["MarketingFormSubmission"],"responses":{"200":{"description":"MarketingFormSubmission collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingFormSubmission.jsonld-mkt_sub.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingFormSubmission.jsonld-mkt_sub.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingFormSubmission resources.","description":"Retrieves the collection of MarketingFormSubmission resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Filtert auf den Submission-Status (exakter Match).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"webFormId","in":"query","description":"Filtert auf das Formular (numerische ID oder WebForm-ULID, markenscope-aufgelöst).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[email]","in":"query","description":"Sortierung nach E-Mail-Adresse (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Eingangsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/marketing/form-submissions/{ulid}":{"get":{"operationId":"api_v1marketingform-submissions_ulid_get","tags":["MarketingFormSubmission"],"responses":{"200":{"description":"MarketingFormSubmission resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission.jsonld-mkt_sub.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingFormSubmission resource.","description":"Retrieves a MarketingFormSubmission resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingFormSubmission identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/marketing/form-submissions/{ulid}/convert":{"post":{"operationId":"api_v1marketingform-submissions_ulidconvert_post","tags":["MarketingFormSubmission"],"responses":{"201":{"description":"MarketingFormSubmission resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission.jsonld-mkt_sub.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Formular-Absendung als Lead uebernehmen","description":"Legt aus der Absendung einen Lead an und verknuepft beide. Verlangt `marketing.submission.convert` IN DER MARKE der Absendung.","parameters":[{"name":"ulid","in":"path","description":"MarketingFormSubmission identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingFormSubmission resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.write"}}},"required":true}}},"/api/v1/marketing/form-submissions/{ulid}/spam":{"post":{"operationId":"api_v1marketingform-submissions_ulidspam_post","tags":["MarketingFormSubmission"],"responses":{"201":{"description":"MarketingFormSubmission resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission.jsonld-mkt_sub.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Formular-Absendung als Spam markieren","description":"Markiert die Formular-Absendung als Spam.","parameters":[{"name":"ulid","in":"path","description":"MarketingFormSubmission identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingFormSubmission resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.write"}}},"required":true}}},"/api/v1/marketing/form-submissions/{ulid}/unspam":{"post":{"operationId":"api_v1marketingform-submissions_ulidunspam_post","tags":["MarketingFormSubmission"],"responses":{"201":{"description":"MarketingFormSubmission resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission.jsonld-mkt_sub.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Spam-Markierung zurücknehmen","description":"Nimmt die Spam-Markierung der Formular-Absendung zurück.","parameters":[{"name":"ulid","in":"path","description":"MarketingFormSubmission identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new MarketingFormSubmission resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingFormSubmission-mkt_sub.write"}}},"required":true}}},"/api/v1/marketing/email-templates/canvas":{"post":{"operationId":"api_v1marketingemail-templatescanvas_post","tags":["MarketingMailCanvas"],"responses":{"201":{"description":"MarketingMailCanvas resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingMailCanvas.MailCanvasResult-mail_canvas.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingMailCanvas.MailCanvasResult.jsonld-mail_canvas.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kampagnen-Mail-Baum in den Editor-Canvas rendern","description":"Rendert einen Mail-Baustein-Baum zu vollstaendigem Mail-HTML fuer den Editor-Canvas; der Abmelde-Block wird garantiert (angehaengt, wenn er im Baum fehlt). Persistiert nichts.","parameters":[],"requestBody":{"description":"The new MarketingMailCanvas resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingMailCanvas-mkt_mail_canvas.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingMailCanvas-mkt_mail_canvas.write"}}},"required":true}}},"/api/v1/marketing/report":{"get":{"operationId":"api_v1marketingreport_get_collection","tags":["MarketingReport"],"responses":{"200":{"description":"MarketingReport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingReport-mkt_report.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingReport.jsonld-mkt_report.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingReport.jsonld-mkt_report.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingReport resources.","description":"Retrieves the collection of MarketingReport resources.","parameters":[{"name":"from","in":"query","description":"Beginn des Auswertungszeitraums (ISO-8601); ohne Angabe seit Systemstart.","required":false,"deprecated":false,"schema":{"type":"string","format":"date-time"},"style":"form","explode":true},{"name":"to","in":"query","description":"Ende des Auswertungszeitraums (ISO-8601); ohne Angabe bis jetzt.","required":false,"deprecated":false,"schema":{"type":"string","format":"date-time"},"style":"form","explode":true},{"name":"campaignId","in":"query","description":"Nur diese Kampagne (interne ID aus /v1/marketing/campaigns); bleibt im Marken-Scope.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/marketing/suppressions":{"get":{"operationId":"api_v1marketingsuppressions_get_collection","tags":["MarketingSuppression"],"responses":{"200":{"description":"MarketingSuppression collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingSuppression-mkt_supp.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingSuppression.jsonld-mkt_supp.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingSuppression.jsonld-mkt_supp.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingSuppression resources.","description":"Retrieves the collection of MarketingSuppression resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"email","in":"query","description":"Suche über die gesperrte E-Mail-Adresse (LIKE).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[reason]","in":"query","description":"Sortierung nach Sperrgrund (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingsuppressions_post","tags":["MarketingSuppression"],"responses":{"201":{"description":"MarketingSuppression resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingSuppression-mkt_supp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingSuppression.jsonld-mkt_supp.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingSuppression resource.","description":"Creates a MarketingSuppression resource.","parameters":[],"requestBody":{"description":"The new MarketingSuppression resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingSuppression-mkt_supp.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingSuppression-mkt_supp.write"}}},"required":true}}},"/api/v1/marketing/suppressions/{ulid}":{"get":{"operationId":"api_v1marketingsuppressions_ulid_get","tags":["MarketingSuppression"],"responses":{"200":{"description":"MarketingSuppression resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingSuppression-mkt_supp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingSuppression.jsonld-mkt_supp.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingSuppression resource.","description":"Retrieves a MarketingSuppression resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingSuppression identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1marketingsuppressions_ulid_delete","tags":["MarketingSuppression"],"responses":{"204":{"description":"MarketingSuppression resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sperreintrag aufheben","description":"Nimmt die Adresse von der Sperrliste — sie kann danach wieder beworben werden. Verlangt `marketing.consent.manage` IN DER MARKE des Eintrags; eine globale Sperre (ohne Marke) verlangt das Recht ueberhaupt.","parameters":[{"name":"ulid","in":"path","description":"MarketingSuppression identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/marketing/web-forms":{"get":{"operationId":"api_v1marketingweb-forms_get_collection","tags":["MarketingWebForm"],"responses":{"200":{"description":"MarketingWebForm collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketingWebForm-mkt_form.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MarketingWebForm.jsonld-mkt_form.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MarketingWebForm.jsonld-mkt_form.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MarketingWebForm resources.","description":"Retrieves the collection of MarketingWebForm resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Aktiv-Status (true = nur aktive, false = nur inaktive Formulare)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Name und Slug","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc); Default asc","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1marketingweb-forms_post","tags":["MarketingWebForm"],"responses":{"201":{"description":"MarketingWebForm resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm-mkt_form.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm.jsonld-mkt_form.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MarketingWebForm resource.","description":"Creates a MarketingWebForm resource.","parameters":[],"requestBody":{"description":"The new MarketingWebForm resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm-mkt_form.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm-mkt_form.write"}}},"required":true}}},"/api/v1/marketing/web-forms/{ulid}":{"get":{"operationId":"api_v1marketingweb-forms_ulid_get","tags":["MarketingWebForm"],"responses":{"200":{"description":"MarketingWebForm resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm-mkt_form.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm.jsonld-mkt_form.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MarketingWebForm resource.","description":"Retrieves a MarketingWebForm resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingWebForm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1marketingweb-forms_ulid_delete","tags":["MarketingWebForm"],"responses":{"204":{"description":"MarketingWebForm resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MarketingWebForm resource.","description":"Removes the MarketingWebForm resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingWebForm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1marketingweb-forms_ulid_patch","tags":["MarketingWebForm"],"responses":{"200":{"description":"MarketingWebForm resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm-mkt_form.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm.jsonld-mkt_form.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MarketingWebForm resource.","description":"Updates the MarketingWebForm resource.","parameters":[{"name":"ulid","in":"path","description":"MarketingWebForm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MarketingWebForm resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MarketingWebForm-mkt_form.write.jsonMergePatch"}}},"required":true}}},"/api/v1/mcp/confirm":{"post":{"operationId":"mcp_confirm","tags":["McpCommand"],"responses":{"201":{"description":"McpCommand resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCommand-mcp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/McpCommand.jsonld-mcp.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a McpCommand resource.","description":"Creates a McpCommand resource.","parameters":[],"requestBody":{"description":"The new McpCommand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCommand-mcp.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/McpCommand-mcp.write"}}},"required":true}}},"/api/v1/mcp/query":{"post":{"operationId":"mcp_query","tags":["McpCommand"],"responses":{"201":{"description":"McpCommand resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCommand-mcp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/McpCommand.jsonld-mcp.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a McpCommand resource.","description":"Creates a McpCommand resource.","parameters":[],"requestBody":{"description":"The new McpCommand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCommand-mcp.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/McpCommand-mcp.write"}}},"required":true}}},"/api/v1/members":{"get":{"operationId":"api_v1members_get_collection","tags":["Member"],"responses":{"200":{"description":"Member collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Member-member.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Member.jsonld-member.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Member.jsonld-member.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Member resources.","description":"Retrieves the collection of Member resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Anzeigename und E-Mail (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/members/{ulid}":{"get":{"operationId":"api_v1members_ulid_get","tags":["Member"],"responses":{"200":{"description":"Member resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Member-member.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Member.jsonld-member.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Member resource.","description":"Retrieves a Member resource.","parameters":[{"name":"ulid","in":"path","description":"Member identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/project-milestones":{"get":{"operationId":"api_v1project-milestones_get_collection","tags":["Milestone"],"responses":{"200":{"description":"Milestone collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Milestone-milestone.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Milestone.jsonld-milestone.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Milestone.jsonld-milestone.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Milestone resources.","description":"Retrieves the collection of Milestone resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"order[dueAt]","in":"query","description":"Sortierung nach Fälligkeit (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Bezeichnung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[sortOrder]","in":"query","description":"Sortierung nach fachlicher Reihenfolge (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1project-milestones_post","tags":["Milestone"],"responses":{"201":{"description":"Milestone resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Milestone.jsonld-milestone.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Milestone resource.","description":"Creates a Milestone resource.","parameters":[],"requestBody":{"description":"The new Milestone resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.write"}}},"required":true}}},"/api/v1/project-milestones/{ulid}":{"get":{"operationId":"api_v1project-milestones_ulid_get","tags":["Milestone"],"responses":{"200":{"description":"Milestone resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Milestone.jsonld-milestone.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Milestone resource.","description":"Retrieves a Milestone resource.","parameters":[{"name":"ulid","in":"path","description":"Milestone identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1project-milestones_ulid_delete","tags":["Milestone"],"responses":{"204":{"description":"Milestone resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Milestone resource.","description":"Removes the Milestone resource.","parameters":[{"name":"ulid","in":"path","description":"Milestone identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1project-milestones_ulid_patch","tags":["Milestone"],"responses":{"200":{"description":"Milestone resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Milestone.jsonld-milestone.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Milestone resource.","description":"Updates the Milestone resource.","parameters":[{"name":"ulid","in":"path","description":"Milestone identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Milestone resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.write.jsonMergePatch"}}},"required":true}}},"/api/v1/project-milestones/{ulid}/accept":{"post":{"operationId":"api_v1project-milestones_ulidaccept_post","tags":["Milestone"],"responses":{"201":{"description":"Milestone resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Milestone.jsonld-milestone.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Meilenstein intern abnehmen","description":"Nimmt den Meilenstein INTERN ab. Die Kundenentscheidung läuft ausschließlich über das Portal.","parameters":[{"name":"ulid","in":"path","description":"Milestone identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Milestone resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.write"}}},"required":true}}},"/api/v1/project-milestones/{ulid}/bill":{"post":{"operationId":"api_v1project-milestones_ulidbill_post","tags":["Milestone"],"responses":{"201":{"description":"Milestone resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Milestone.jsonld-milestone.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Meilenstein abrechnen","description":"Stößt die Festpreis-Abrechnung des Meilensteins an (meldet `BillingRequested`). Verlangt das eigene Auslöserecht für Abrechnungen; `billedAt` ist nicht direkt schreibbar.","parameters":[{"name":"ulid","in":"path","description":"Milestone identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Milestone resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Milestone-milestone.write"}}},"required":true}}},"/api/v1/project/milestone-statuses":{"get":{"operationId":"api_v1projectmilestone-statuses_get_collection","tags":["MilestoneStatus"],"responses":{"200":{"description":"MilestoneStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MilestoneStatus-milestone_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"MilestoneStatus.jsonld-milestone_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/MilestoneStatus.jsonld-milestone_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of MilestoneStatus resources.","description":"Retrieves the collection of MilestoneStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1projectmilestone-statuses_post","tags":["MilestoneStatus"],"responses":{"201":{"description":"MilestoneStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus-milestone_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus.jsonld-milestone_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a MilestoneStatus resource.","description":"Creates a MilestoneStatus resource.","parameters":[],"requestBody":{"description":"The new MilestoneStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus-milestone_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus-milestone_status.write"}}},"required":true}}},"/api/v1/project/milestone-statuses/{key}":{"get":{"operationId":"api_v1projectmilestone-statuses_key_get","tags":["MilestoneStatus"],"responses":{"200":{"description":"MilestoneStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus-milestone_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus.jsonld-milestone_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a MilestoneStatus resource.","description":"Retrieves a MilestoneStatus resource.","parameters":[{"name":"key","in":"path","description":"MilestoneStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1projectmilestone-statuses_key_delete","tags":["MilestoneStatus"],"responses":{"204":{"description":"MilestoneStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the MilestoneStatus resource.","description":"Removes the MilestoneStatus resource.","parameters":[{"name":"key","in":"path","description":"MilestoneStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1projectmilestone-statuses_key_patch","tags":["MilestoneStatus"],"responses":{"200":{"description":"MilestoneStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus-milestone_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus.jsonld-milestone_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the MilestoneStatus resource.","description":"Updates the MilestoneStatus resource.","parameters":[{"name":"key","in":"path","description":"MilestoneStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated MilestoneStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/MilestoneStatus-milestone_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/notifications":{"get":{"operationId":"api_v1notifications_get_collection","tags":["Notification"],"responses":{"200":{"description":"Notification collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Notification-notification.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Notification.jsonld-notification.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Notification.jsonld-notification.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Notification resources.","description":"Retrieves the collection of Notification resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"type","in":"query","description":"Benachrichtigungstyp (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"unread","in":"query","description":"true = nur ungelesene; false = nur gelesene Benachrichtigungen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]}},"/api/v1/notifications/mark-all-read":{"post":{"operationId":"notifications_mark_all_read","tags":["Notification"],"responses":{"200":{"description":"Notification resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notification-notification.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Notification.jsonld-notification.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Notification resource.","description":"Creates a Notification resource.","parameters":[],"requestBody":{"description":"The new Notification resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notification-notification.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Notification-notification.write"}}},"required":true}}},"/api/v1/notifications/{ulid}":{"get":{"operationId":"api_v1notifications_ulid_get","tags":["Notification"],"responses":{"200":{"description":"Notification resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notification-notification.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Notification.jsonld-notification.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Notification resource.","description":"Retrieves a Notification resource.","parameters":[{"name":"ulid","in":"path","description":"Notification identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1notifications_ulid_patch","tags":["Notification"],"responses":{"200":{"description":"Notification resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notification-notification.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Notification.jsonld-notification.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Notification resource.","description":"Updates the Notification resource.","parameters":[{"name":"ulid","in":"path","description":"Notification identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Notification resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Notification-notification.write.jsonMergePatch"}}},"required":true}}},"/api/v1/notification-channels":{"get":{"operationId":"api_v1notification-channels_get_collection","tags":["NotificationChannel"],"responses":{"200":{"description":"NotificationChannel collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NotificationChannel-notification_channel.read"}}},"application/ld+json":{"schema":{"type":"object","description":"NotificationChannel.jsonld-notification_channel.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/NotificationChannel.jsonld-notification_channel.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of NotificationChannel resources.","description":"Retrieves the collection of NotificationChannel resources.","parameters":[]}},"/api/v1/notification-preferences":{"get":{"operationId":"api_v1notification-preferences_get_collection","tags":["NotificationPreference"],"responses":{"200":{"description":"NotificationPreference collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NotificationPreference-notification_pref.read"}}},"application/ld+json":{"schema":{"type":"object","description":"NotificationPreference.jsonld-notification_pref.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/NotificationPreference.jsonld-notification_pref.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of NotificationPreference resources.","description":"Retrieves the collection of NotificationPreference resources.","parameters":[]},"post":{"operationId":"api_v1notification-preferences_post","tags":["NotificationPreference"],"responses":{"201":{"description":"NotificationPreference resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference-notification_pref.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/NotificationPreference.jsonld-notification_pref.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a NotificationPreference resource.","description":"Creates a NotificationPreference resource.","parameters":[],"requestBody":{"description":"The new NotificationPreference resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference-notification_pref.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/NotificationPreference-notification_pref.write"}}},"required":true}}},"/api/v1/notification-preferences/{id}":{"get":{"operationId":"api_v1notification-preferences_id_get","tags":["NotificationPreference"],"responses":{"200":{"description":"NotificationPreference resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference-notification_pref.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/NotificationPreference.jsonld-notification_pref.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a NotificationPreference resource.","description":"Retrieves a NotificationPreference resource.","parameters":[{"name":"id","in":"path","description":"NotificationPreference identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1notification-preferences_id_delete","tags":["NotificationPreference"],"responses":{"204":{"description":"NotificationPreference resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the NotificationPreference resource.","description":"Removes the NotificationPreference resource.","parameters":[{"name":"id","in":"path","description":"NotificationPreference identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1notification-preferences_id_patch","tags":["NotificationPreference"],"responses":{"200":{"description":"NotificationPreference resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreference-notification_pref.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/NotificationPreference.jsonld-notification_pref.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the NotificationPreference resource.","description":"Updates the NotificationPreference resource.","parameters":[{"name":"id","in":"path","description":"NotificationPreference identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated NotificationPreference resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/NotificationPreference-notification_pref.write.jsonMergePatch"}}},"required":true}}},"/api/v1/number-schemes":{"get":{"operationId":"api_v1number-schemes_get_collection","tags":["NumberScheme"],"responses":{"200":{"description":"NumberScheme collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NumberScheme-number_scheme.read"}}},"application/ld+json":{"schema":{"type":"object","description":"NumberScheme.jsonld-number_scheme.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/NumberScheme.jsonld-number_scheme.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of NumberScheme resources.","description":"Retrieves the collection of NumberScheme resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1number-schemes_post","tags":["NumberScheme"],"responses":{"201":{"description":"NumberScheme resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberScheme-number_scheme.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/NumberScheme.jsonld-number_scheme.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a NumberScheme resource.","description":"Creates a NumberScheme resource.","parameters":[],"requestBody":{"description":"The new NumberScheme resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberScheme-number_scheme.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/NumberScheme-number_scheme.write"}}},"required":true}}},"/api/v1/number-schemes/{ulid}":{"get":{"operationId":"api_v1number-schemes_ulid_get","tags":["NumberScheme"],"responses":{"200":{"description":"NumberScheme resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberScheme-number_scheme.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/NumberScheme.jsonld-number_scheme.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a NumberScheme resource.","description":"Retrieves a NumberScheme resource.","parameters":[{"name":"ulid","in":"path","description":"NumberScheme identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1number-schemes_ulid_delete","tags":["NumberScheme"],"responses":{"204":{"description":"NumberScheme resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the NumberScheme resource.","description":"Removes the NumberScheme resource.","parameters":[{"name":"ulid","in":"path","description":"NumberScheme identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1number-schemes_ulid_patch","tags":["NumberScheme"],"responses":{"200":{"description":"NumberScheme resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberScheme-number_scheme.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/NumberScheme.jsonld-number_scheme.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the NumberScheme resource.","description":"Updates the NumberScheme resource.","parameters":[{"name":"ulid","in":"path","description":"NumberScheme identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated NumberScheme resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/NumberScheme-number_scheme.write.jsonMergePatch"}}},"required":true}}},"/api/v1/numbered-types":{"get":{"operationId":"api_v1numbered-types_get_collection","tags":["NumberedType"],"responses":{"200":{"description":"NumberedType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NumberedType-numbered_type.read"}}},"application/ld+json":{"schema":{"type":"object","description":"NumberedType.jsonld-numbered_type.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/NumberedType.jsonld-numbered_type.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of NumberedType resources.","description":"Retrieves the collection of NumberedType resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]}},"/api/v1/international/oss-reports":{"get":{"operationId":"api_v1internationaloss-reports_get_collection","tags":["OssReport"],"responses":{"200":{"description":"OssReport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OssReport-oss_report.read"}}},"application/ld+json":{"schema":{"type":"object","description":"OssReport.jsonld-oss_report.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/OssReport.jsonld-oss_report.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of OssReport resources.","description":"Retrieves the collection of OssReport resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"year","in":"query","description":"Nur Meldungen dieses Jahres","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"draft | confirmed","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[periodYear]","in":"query","description":"Sortierung nach Jahr (asc|desc, Default desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[periodQuarter]","in":"query","description":"Sortierung nach Quartal (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1internationaloss-reports_post","tags":["OssReport"],"responses":{"201":{"description":"OssReport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OssReport-oss_report.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/OssReport.jsonld-oss_report.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"OSS-Quartalsmeldung erzeugen","description":"Payload `{year, quarter}` (Quartal 1–4). Summiert das Meldebuch des Zeitraums je Bestimmungsland und Steuersatz und FRIERT das Ergebnis ein — der spätere Export liest nur noch diesen Schnappschuss, damit eine nachträglich festgeschriebene Rechnung eine bereits abgegebene Meldung nicht stillschweigend verändert. Ein bestehender Entwurf desselben Quartals wird neu berechnet; eine bereits freigegebene Meldung wird mit 422 abgelehnt (Korrekturen laufen über das BZSt).","parameters":[],"requestBody":{"description":"The new OssReport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OssReport-oss_report.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/OssReport-oss_report.write"}}},"required":true}}},"/api/v1/international/oss-reports/{ulid}":{"get":{"operationId":"api_v1internationaloss-reports_ulid_get","tags":["OssReport"],"responses":{"200":{"description":"OssReport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OssReport-oss_report.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/OssReport.jsonld-oss_report.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a OssReport resource.","description":"Retrieves a OssReport resource.","parameters":[{"name":"ulid","in":"path","description":"OssReport identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/international/oss-reports/{ulid}/confirm":{"post":{"operationId":"api_v1internationaloss-reports_ulidconfirm_post","tags":["OssReport"],"responses":{"201":{"description":"OssReport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OssReport-oss_report.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/OssReport.jsonld-oss_report.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"OSS-Meldung freigeben (Steuerberater-Gate)","description":"Payload `{confirmationNote?}`. Erklärt die Zahlen für richtig; ab hier ist die Meldung unveränderlich und herunterladbar. Name und Zeitpunkt der Freigabe stehen danach am Datensatz. Eine leere Meldung lässt sich nicht freigeben — entweder wurde sie nie erzeugt, oder das Quartal hat keine meldepflichtigen Umsätze, und dann ist gar keine Meldung abzugeben.","parameters":[{"name":"ulid","in":"path","description":"OssReport identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new OssReport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OssReport-oss_report.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/OssReport-oss_report.write"}}},"required":true}}},"/api/v1/international/oss-reports/{ulid}/file":{"get":{"operationId":"international_oss_report_file","tags":["OssReport"],"responses":{"204":{"description":"OssReport resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"OSS-Meldung als CSV herunterladen","description":"Semikolon-getrennt, deutsche Dezimalschreibweise, CRLF — der Aufbau der BZSt-Importmaske (Land, Satzart, Steuersatz, Bemessungsgrundlage, Steuer). **Nur für freigegebene Meldungen**; ein Entwurf antwortet mit 422. CHECKPOINT: die Datei ist nach Spezifikation gebaut, aber nicht gegen das amtliche Prüfprogramm des BZSt gelaufen.","parameters":[{"name":"ulid","in":"path","description":"OssReport identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/international/oss-threshold":{"get":{"operationId":"international_oss_threshold","tags":["OssThreshold"],"responses":{"200":{"description":"OssThreshold resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OssThreshold-oss_threshold.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/OssThreshold.jsonld-oss_threshold.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Stand der EU-Lieferschwelle","description":"Summiert die festgeschriebenen Rechnungen an PRIVATkunden in anderen Mitgliedstaaten des Kalenderjahres (netto, in EUR umgerechnet mit dem am Beleg eingefrorenen Kurs) und vergleicht sie mit der Schwelle. Ehrliche Grenze: gezählt wird die HEUTIGE Kundenadresse — für eine Warnschwelle richtig genug, für die Meldung selbst gilt das eingefrorene Meldebuch.","parameters":[{"name":"year","in":"query","description":"Kalenderjahr (Default: laufendes Jahr)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/wms/pack-sessions":{"get":{"operationId":"api_v1wmspack-sessions_get_collection","tags":["PackSession"],"responses":{"200":{"description":"PackSession collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PackSession-pack_session.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PackSession.jsonld-pack_session.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PackSession.jsonld-pack_session.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PackSession resources.","description":"Retrieves the collection of PackSession resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"open|completed|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"orderId","in":"query","description":"Auftrags-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/wms/pack-sessions/identify":{"post":{"operationId":"wms_pack_session_identify","tags":["PackSession"],"responses":{"201":{"description":"PackSession resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession.jsonld-pack_session.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Packvorgang über einen Scan finden oder öffnen","description":"Payload `{scan}` — Auftragsnummer oder Picklisten-Nummer, so wie sie auf dem Zettel steht. Idempotent: ein zweiter Scan derselben Sendung liefert denselben offenen Vorgang. Eine Sammel-Pickliste mit mehreren Aufträgen ist mehrdeutig und antwortet 409 statt zu raten.","parameters":[],"requestBody":{"description":"The new PackSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}}},"required":true}}},"/api/v1/wms/pack-sessions/{ulid}":{"get":{"operationId":"api_v1wmspack-sessions_ulid_get","tags":["PackSession"],"responses":{"200":{"description":"PackSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession.jsonld-pack_session.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PackSession resource.","description":"Retrieves a PackSession resource.","parameters":[{"name":"ulid","in":"path","description":"PackSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/wms/pack-sessions/{ulid}/cancel":{"post":{"operationId":"wms_pack_session_cancel","tags":["PackSession"],"responses":{"201":{"description":"PackSession resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession.jsonld-pack_session.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel pack session","description":"Cancel pack session. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"PackSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PackSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}}},"required":true}}},"/api/v1/wms/pack-sessions/{ulid}/complete":{"post":{"operationId":"wms_pack_session_complete","tags":["PackSession"],"responses":{"201":{"description":"PackSession resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession.jsonld-pack_session.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Packvorgang abschließen — Lieferschein und Etikett","description":"Payload `{carrierPluginKey?, service?, allowPartial?}`. Erzeugt den Lieferschein aus den GESCANNTEN Mengen, meldet ihn kommissioniert und versendet ihn (das kauft das Etikett). Unvollständig gescannt wird abgewiesen, sofern nicht `allowPartial` gesetzt ist — der halb gefüllte Karton ist genau der Fall, den der Packtisch verhindern soll.","parameters":[{"name":"ulid","in":"path","description":"PackSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PackSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}}},"required":true}}},"/api/v1/wms/pack-sessions/{ulid}/packages":{"post":{"operationId":"wms_pack_session_add_package","tags":["PackSession"],"responses":{"201":{"description":"PackSession resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession.jsonld-pack_session.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Packstück hinzufügen (Mehrpaket)","description":"Payload `{weightGrams?, packagingCode?, lengthMm?, widthMm?, heightMm?, workplaceKey?}`. Das Gewicht folgt der dreistufigen Wiegepflicht (`wms.weighing.mode`): bei `required` ist es Pflicht (sonst 422), bei `prefill` springt eine stabile Wägung des Arbeitsplatzes ein, sonst das Rechengewicht aus den Artikelgewichten plus Zuschlag; bei `none` wird nur gerechnet. Ein eingegebener Wert gewinnt immer. Ohne Gewicht nimmt kein Dienstleister eine Label-Anfrage an — deshalb steht am Ende immer eine positive Zahl.","parameters":[{"name":"ulid","in":"path","description":"PackSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PackSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}}},"required":true}}},"/api/v1/wms/pack-sessions/{ulid}/scale":{"get":{"operationId":"wms_pack_session_scale","tags":["PackSession"],"responses":{"200":{"description":"PackSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession.jsonld-pack_session.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Live-Gewicht des Arbeitsplatzes","description":"Query `workplaceKey`. Liefert `{weighingMode, scaleAvailable, scaleWeightGrams, scaleStable, computedWeightGrams}` — die Grundlage der Anzeige am Packtisch. Ohne angebundene Waage bleiben die Waagen-Felder leer und das Rechengewicht trägt die Vorbelegung; die dreistufige Wiegepflicht bleibt vollständig bedienbar.","parameters":[{"name":"ulid","in":"path","description":"PackSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"workplaceKey","in":"query","description":"Arbeitsplatz, dessen Waage gefragt wird (z. B. packtisch-1)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/wms/pack-sessions/{ulid}/scan":{"post":{"operationId":"wms_pack_session_scan","tags":["PackSession"],"responses":{"201":{"description":"PackSession resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession.jsonld-pack_session.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Artikel in den Karton scannen","description":"Payload `{code, qty?}`. Der Code darf Artikelnummer, EAN oder **Gebinde-EAN** sein — ein Gebinde-Scan bucht seinen Inhalt (n Stück mit einem Scan). Ware, die nicht zum Auftrag gehört oder dessen Position schon voll ist, antwortet 422: genau diesen Fehlgriff soll der Packtisch fangen.","parameters":[{"name":"ulid","in":"path","description":"PackSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PackSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PackSession-pack_session.write"}}},"required":true}}},"/api/v1/pages":{"get":{"operationId":"api_v1pages_get_collection","tags":["Page"],"responses":{"200":{"description":"Page collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Page-pages_page.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Page.jsonld-pages_page.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Page resources.","description":"Retrieves the collection of Page resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"workspace","in":"query","description":"Filtert auf einen Workspace (ULID).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parent","in":"query","description":"Filtert auf eine Elternseite (ULID; Sentinel `root` = oberste Ebene).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"trashed","in":"query","description":"true → Papierkorb-Seiten statt aktiver Seiten.","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"template","in":"query","description":"true → nur Seiten-Vorlagen (Template-Galerie, Stufe 5).","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Seitentitel (LIKE).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1pages_post","tags":["Page"],"responses":{"201":{"description":"Page resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.read_pages_page.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read_pages_page.detail"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Page resource.","description":"Creates a Page resource.","parameters":[],"requestBody":{"description":"The new Page resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}}},"required":true}}},"/api/v1/pages/{ulid}":{"get":{"operationId":"api_v1pages_ulid_get","tags":["Page"],"responses":{"200":{"description":"Page resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.read_pages_page.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read_pages_page.detail"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Page resource.","description":"Retrieves a Page resource.","parameters":[{"name":"ulid","in":"path","description":"Page identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1pages_ulid_delete","tags":["Page"],"responses":{"204":{"description":"Page resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Page resource.","description":"Removes the Page resource.","parameters":[{"name":"ulid","in":"path","description":"Page identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1pages_ulid_patch","tags":["Page"],"responses":{"200":{"description":"Page resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.read_pages_page.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read_pages_page.detail"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Page resource.","description":"Updates the Page resource.","parameters":[{"name":"ulid","in":"path","description":"Page identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Page resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write.jsonMergePatch"}}},"required":true}}},"/api/v1/pages/{ulid}/collab-token":{"post":{"operationId":"api_v1pages_ulidcollab-token_post","tags":["Page"],"responses":{"201":{"description":"Page resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.read_pages_page.collab"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read_pages_page.collab"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ticket für den Live-Editor ausgeben","description":"Gibt ein Co-Editing-Ticket für den Live-Editor aus. Ohne konfigurierten Collab-Dienst: 409 `feature_disabled`.","parameters":[{"name":"ulid","in":"path","description":"Page identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Page resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}}},"required":true}}},"/api/v1/pages/{ulid}/duplicate":{"post":{"operationId":"api_v1pages_ulidduplicate_post","tags":["Page"],"responses":{"201":{"description":"Page resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.read_pages_page.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read_pages_page.detail"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Seite kopieren","description":"Legt eine Kopie der Seite an. Verlangt Leserecht auf die Quellseite — sonst wäre eine verborgene Seite über ihre Kopie auslesbar.","parameters":[{"name":"ulid","in":"path","description":"Page identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Page resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}}},"required":true}}},"/api/v1/pages/{ulid}/move":{"post":{"operationId":"pages_page_move","tags":["Page"],"responses":{"201":{"description":"Page resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.read_pages_page.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read_pages_page.detail"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Move page","description":"Move page. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Page identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Page resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.move"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.move"}}},"required":true}}},"/api/v1/pages/{ulid}/restore":{"post":{"operationId":"api_v1pages_ulidrestore_post","tags":["Page"],"responses":{"201":{"description":"Page resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Restore page","description":"Restore page. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Page identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Page resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}}},"required":true}}},"/api/v1/pages/{ulid}/share":{"post":{"operationId":"api_v1pages_ulidshare_post","tags":["Page"],"responses":{"201":{"description":"Page resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.read_pages_page.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page.jsonld-pages_page.read_pages_page.detail"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Seite öffentlich oder ins Portal teilen","description":"Legt einen öffentlichen Link an, wechselt oder widerruft ihn bzw. setzt die Portal-Freigabe (`shareAction`). Verlangt das Teilen-Recht UND Bearbeitungslevel auf der Seite.","parameters":[{"name":"ulid","in":"path","description":"Page identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Page resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Page-pages_page.write"}}},"required":true}}},"/api/v1/pages/{ulid}/backlinks":{"get":{"operationId":"api_v1pages_ulidbacklinks_get_collection","tags":["PageBacklink"],"responses":{"200":{"description":"PageBacklink collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageBacklink-pages_backlink.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PageBacklink.jsonld-pages_backlink.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PageBacklink.jsonld-pages_backlink.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PageBacklink resources.","description":"Retrieves the collection of PageBacklink resources.","parameters":[{"name":"ulid","in":"path","description":"PageBacklink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/pages/comments/{ulid}":{"delete":{"operationId":"api_v1pagescomments_ulid_delete","tags":["PageComment"],"responses":{"204":{"description":"PageComment resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PageComment resource.","description":"Removes the PageComment resource.","parameters":[{"name":"ulid","in":"path","description":"PageComment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/pages/comments/{ulid}/resolve":{"post":{"operationId":"api_v1pagescomments_ulidresolve_post","tags":["PageComment"],"responses":{"201":{"description":"PageComment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageComment-pages_comment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageComment.jsonld-pages_comment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kommentar als erledigt markieren","description":"Markiert den Kommentar als erledigt; der Thread bleibt lesbar.","parameters":[{"name":"ulid","in":"path","description":"PageComment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PageComment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageComment-pages_comment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageComment-pages_comment.write"}}},"required":true}}},"/api/v1/pages/{ulid}/comments":{"get":{"operationId":"api_v1pages_ulidcomments_get_collection","tags":["PageComment"],"responses":{"200":{"description":"PageComment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageComment-pages_comment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PageComment.jsonld-pages_comment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PageComment.jsonld-pages_comment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PageComment resources.","description":"Retrieves the collection of PageComment resources.","parameters":[{"name":"ulid","in":"path","description":"PageComment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"resolved","in":"query","description":"true = nur erledigte, false = nur offene Kommentare (leer = alle)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1pages_ulidcomments_post","tags":["PageComment"],"responses":{"201":{"description":"PageComment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageComment-pages_comment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageComment.jsonld-pages_comment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kommentar an der Seite verfassen","description":"Verfasst einen Kommentar an der Seite (Thread über `parentUlid`, Block-Anker über `blockId`). Erwähnungen lösen Benachrichtigungen aus.","parameters":[{"name":"ulid","in":"path","description":"PageComment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PageComment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageComment-pages_comment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageComment-pages_comment.write"}}},"required":true}}},"/api/v1/pages/{ulid}/export":{"get":{"operationId":"api_v1pages_ulidexport_get","tags":["PageExport"],"responses":{"200":{"description":"PageExport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageExport-pages_export.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageExport.jsonld-pages_export.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PageExport resource.","description":"Retrieves a PageExport resource.","parameters":[{"name":"ulid","in":"path","description":"PageExport identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"format","in":"query","description":"Exportformat (Default md).","required":false,"deprecated":false,"schema":{"type":"string","enum":["md","html"]},"style":"form","explode":true}]}},"/api/v1/pages/favorites":{"get":{"operationId":"api_v1pagesfavorites_get_collection","tags":["PageFavorite"],"responses":{"200":{"description":"PageFavorite collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageFavorite-pages_favorite.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PageFavorite.jsonld-pages_favorite.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PageFavorite.jsonld-pages_favorite.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PageFavorite resources.","description":"Retrieves the collection of PageFavorite resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1pagesfavorites_post","tags":["PageFavorite"],"responses":{"201":{"description":"PageFavorite resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageFavorite-pages_favorite.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageFavorite.jsonld-pages_favorite.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PageFavorite resource.","description":"Creates a PageFavorite resource.","parameters":[],"requestBody":{"description":"The new PageFavorite resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageFavorite-pages_favorite.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageFavorite-pages_favorite.write"}}},"required":true}}},"/api/v1/pages/favorites/{ulid}":{"delete":{"operationId":"api_v1pagesfavorites_ulid_delete","tags":["PageFavorite"],"responses":{"204":{"description":"PageFavorite resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PageFavorite resource.","description":"Removes the PageFavorite resource.","parameters":[{"name":"ulid","in":"path","description":"PageFavorite identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1pagesfavorites_ulid_patch","tags":["PageFavorite"],"responses":{"200":{"description":"PageFavorite resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageFavorite-pages_favorite.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageFavorite.jsonld-pages_favorite.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PageFavorite resource.","description":"Updates the PageFavorite resource.","parameters":[{"name":"ulid","in":"path","description":"PageFavorite identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PageFavorite resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PageFavorite-pages_favorite.write.jsonMergePatch"}}},"required":true}}},"/api/v1/pages/public/{token}":{"get":{"operationId":"api_v1pagespublic_token_get","tags":["PagePublic"],"responses":{"200":{"description":"PagePublic resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagePublic-pages_public.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagePublic.jsonld-pages_public.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PagePublic resource.","description":"Retrieves a PagePublic resource.","parameters":[{"name":"token","in":"path","description":"PagePublic identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/pages/versions/{ulid}":{"get":{"operationId":"api_v1pagesversions_ulid_get","tags":["PageVersion"],"responses":{"200":{"description":"PageVersion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageVersion-pages_version.read_pages_version.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageVersion.jsonld-pages_version.read_pages_version.detail"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PageVersion resource.","description":"Retrieves a PageVersion resource.","parameters":[{"name":"ulid","in":"path","description":"PageVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/pages/versions/{ulid}/restore":{"post":{"operationId":"api_v1pagesversions_ulidrestore_post","tags":["PageVersion"],"responses":{"201":{"description":"PageVersion resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageVersion-pages_version.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageVersion.jsonld-pages_version.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Restore version","description":"Restore version. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"PageVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PageVersion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageVersion-pages_version.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageVersion-pages_version.write"}}},"required":true}}},"/api/v1/pages/{ulid}/versions":{"get":{"operationId":"api_v1pages_ulidversions_get_collection","tags":["PageVersion"],"responses":{"200":{"description":"PageVersion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageVersion-pages_version.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PageVersion.jsonld-pages_version.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PageVersion.jsonld-pages_version.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PageVersion resources.","description":"Retrieves the collection of PageVersion resources.","parameters":[{"name":"ulid","in":"path","description":"PageVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"api_v1pages_ulidversions_post","tags":["PageVersion"],"responses":{"201":{"description":"PageVersion resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageVersion-pages_version.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageVersion.jsonld-pages_version.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Version der Seite schneiden","description":"Schneidet eine benannte Version der Seite als Snapshot. Nie destruktiv — der aktuelle Inhalt bleibt unberührt.","parameters":[{"name":"ulid","in":"path","description":"PageVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PageVersion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageVersion-pages_version.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PageVersion-pages_version.write"}}},"required":true}}},"/api/v1/pages/ask":{"post":{"operationId":"api_v1pagesask_post","tags":["PagesAsk"],"responses":{"201":{"description":"PagesAsk resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesAsk-pages_ask.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesAsk.jsonld-pages_ask.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PagesAsk resource.","description":"Creates a PagesAsk resource.","parameters":[],"requestBody":{"description":"The new PagesAsk resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesAsk-pages_ask.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesAsk-pages_ask.write"}}},"required":true}}},"/api/v1/pages/databases":{"get":{"operationId":"api_v1pagesdatabases_get_collection","tags":["PagesDatabase"],"responses":{"200":{"description":"PagesDatabase collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PagesDatabase-pages_db.list"}}},"application/ld+json":{"schema":{"type":"object","description":"PagesDatabase.jsonld-pages_db.list collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PagesDatabase.jsonld-pages_db.list"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PagesDatabase resources.","description":"Retrieves the collection of PagesDatabase resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"workspace","in":"query","description":"Filtert auf einen Workspace (ULID).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Seitentitel (LIKE).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/pages/databases/{ulid}":{"get":{"operationId":"api_v1pagesdatabases_ulid_get","tags":["PagesDatabase"],"responses":{"200":{"description":"PagesDatabase resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesDatabase-pages_db.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesDatabase.jsonld-pages_db.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PagesDatabase resource.","description":"Retrieves a PagesDatabase resource.","parameters":[{"name":"ulid","in":"path","description":"PagesDatabase identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1pagesdatabases_ulid_patch","tags":["PagesDatabase"],"responses":{"200":{"description":"PagesDatabase resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesDatabase-pages_db.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesDatabase.jsonld-pages_db.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PagesDatabase resource.","description":"Updates the PagesDatabase resource.","parameters":[{"name":"ulid","in":"path","description":"PagesDatabase identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PagesDatabase resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PagesDatabase-pages_db.write.jsonMergePatch"}}},"required":true}}},"/api/v1/pages/databases/{ulid}/rows/import":{"post":{"operationId":"api_v1pagesdatabases_ulidrowsimport_post","tags":["PagesDatabase"],"responses":{"201":{"description":"PagesDatabase resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesDatabase-pages_db.read_pages_db.import"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesDatabase.jsonld-pages_db.read_pages_db.import"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"CSV-Zeilen importieren","description":"Importiert die Zeilen einer CSV in die Datenbank-Seite; mehr als 2000 Zeilen weist der Import ab (422).","parameters":[{"name":"ulid","in":"path","description":"PagesDatabase identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PagesDatabase resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesDatabase-pages_db.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesDatabase-pages_db.write"}}},"required":true}}},"/api/v1/pages/entity-ref-options":{"get":{"operationId":"api_v1pagesentity-ref-options_get_collection","tags":["PagesEntityRefOption"],"responses":{"200":{"description":"PagesEntityRefOption collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PagesEntityRefOption-pages_refopt.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PagesEntityRefOption.jsonld-pages_refopt.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PagesEntityRefOption.jsonld-pages_refopt.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PagesEntityRefOption resources.","description":"Retrieves the collection of PagesEntityRefOption resources.","parameters":[{"name":"type","in":"query","description":"Zieltyp-Schlüssel der Registry (Pflichtfilter — ohne ihn antwortet die API mit 422); verfügbare Typen liefert das Datenbank-Schema (`entityRefTypes`).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über die Namens-Felder des Zieltyps (LIKE).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/pages/entity-ref-targets":{"get":{"operationId":"api_v1pagesentity-ref-targets_get_collection","tags":["PagesEntityRefTarget"],"responses":{"200":{"description":"PagesEntityRefTarget collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PagesEntityRefTarget-pages_reftarget.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PagesEntityRefTarget.jsonld-pages_reftarget.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PagesEntityRefTarget.jsonld-pages_reftarget.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PagesEntityRefTarget resources.","description":"Retrieves the collection of PagesEntityRefTarget resources.","parameters":[]}},"/api/v1/pages/import":{"post":{"operationId":"api_v1pagesimport_post","tags":["PagesImport"],"responses":{"201":{"description":"PagesImport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesImport-pages_import.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesImport.jsonld-pages_import.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PagesImport resource.","description":"Creates a PagesImport resource.","parameters":[],"requestBody":{"description":"The new PagesImport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesImport-pages_import.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesImport-pages_import.write"}}},"required":true}}},"/api/v1/pages/databases/{ulid}/properties":{"post":{"operationId":"api_v1pagesdatabases_ulidproperties_post","tags":["PagesProperty"],"responses":{"201":{"description":"PagesProperty resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesProperty-pages_property.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesProperty.jsonld-pages_property.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Spalte der Datenbank-Seite anlegen","description":"Legt eine Spalte an. Der Schlüssel wird aus dem Namen abgeleitet und ist danach unveränderlich.","parameters":[{"name":"ulid","in":"path","description":"PagesProperty identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PagesProperty resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesProperty-pages_property.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesProperty-pages_property.write"}}},"required":true}}},"/api/v1/pages/properties/{ulid}":{"delete":{"operationId":"api_v1pagesproperties_ulid_delete","tags":["PagesProperty"],"responses":{"204":{"description":"PagesProperty resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PagesProperty resource.","description":"Removes the PagesProperty resource.","parameters":[{"name":"ulid","in":"path","description":"PagesProperty identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1pagesproperties_ulid_patch","tags":["PagesProperty"],"responses":{"200":{"description":"PagesProperty resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesProperty-pages_property.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesProperty.jsonld-pages_property.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PagesProperty resource.","description":"Updates the PagesProperty resource.","parameters":[{"name":"ulid","in":"path","description":"PagesProperty identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PagesProperty resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PagesProperty-pages_property.write.jsonMergePatch"}}},"required":true}}},"/api/v1/pages/databases/{ulid}/rows":{"post":{"operationId":"api_v1pagesdatabases_ulidrows_post","tags":["PagesRow"],"responses":{"201":{"description":"PagesRow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.read_pages_row.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRow.jsonld-pages_row.read_pages_row.detail"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zeile anlegen","description":"Legt eine Zeile in der Datenbank-Seite an, optional aus `fromTemplateRowUlid` vorbefüllt.","parameters":[{"name":"ulid","in":"path","description":"PagesRow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PagesRow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.write"}}},"required":true}}},"/api/v1/pages/rows/{ulid}":{"get":{"operationId":"api_v1pagesrows_ulid_get","tags":["PagesRow"],"responses":{"200":{"description":"PagesRow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.read_pages_row.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRow.jsonld-pages_row.read_pages_row.detail"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PagesRow resource.","description":"Retrieves a PagesRow resource.","parameters":[{"name":"ulid","in":"path","description":"PagesRow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1pagesrows_ulid_delete","tags":["PagesRow"],"responses":{"204":{"description":"PagesRow resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PagesRow resource.","description":"Removes the PagesRow resource.","parameters":[{"name":"ulid","in":"path","description":"PagesRow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1pagesrows_ulid_patch","tags":["PagesRow"],"responses":{"200":{"description":"PagesRow resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.read_pages_row.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRow.jsonld-pages_row.read_pages_row.detail"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PagesRow resource.","description":"Updates the PagesRow resource.","parameters":[{"name":"ulid","in":"path","description":"PagesRow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PagesRow resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.write.jsonMergePatch"}}},"required":true}}},"/api/v1/pages/rows/{ulid}/reorder":{"post":{"operationId":"api_v1pagesrows_ulidreorder_post","tags":["PagesRow"],"responses":{"201":{"description":"PagesRow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.read_pages_row.detail"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRow.jsonld-pages_row.read_pages_row.detail"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zeile neu einsortieren","description":"Ordnet die Zeile innerhalb ihrer Sortierung neu ein.","parameters":[{"name":"ulid","in":"path","description":"PagesRow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PagesRow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.write"}}},"required":true}}},"/api/v1/pages/rows/{ulid}/restore":{"post":{"operationId":"api_v1pagesrows_ulidrestore_post","tags":["PagesRow"],"responses":{"201":{"description":"PagesRow resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRow.jsonld-pages_row.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Restore row","description":"Restore row. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"PagesRow identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PagesRow resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRow-pages_row.write"}}},"required":true}}},"/api/v1/pages/databases/{ulid}/query":{"post":{"operationId":"api_v1pagesdatabases_ulidquery_post","tags":["PagesRowQuery"],"responses":{"201":{"description":"PagesRowQuery resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRowQuery-pages_query.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRowQuery.jsonld-pages_query.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zeilen nach Filter und Sortierung abfragen","description":"Liefert die Zeilen nach der Filter- und Sortier-DSL. `viewUlid` übernimmt die Einstellungen der View, Angaben im Rumpf übersteuern sie. Reine Abfrage — es wird nichts geändert.","parameters":[{"name":"ulid","in":"path","description":"PagesRowQuery identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PagesRowQuery resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesRowQuery-pages_query.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesRowQuery-pages_query.write"}}},"required":true}}},"/api/v1/pages/databases/{ulid}/views":{"post":{"operationId":"api_v1pagesdatabases_ulidviews_post","tags":["PagesView"],"responses":{"201":{"description":"PagesView resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesView-pages_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesView.jsonld-pages_view.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"View anlegen","description":"Legt eine View an. Eine geteilte View verlangt das Datenbank-Verwaltungsrecht, eine persönliche gehört dem Aufrufer.","parameters":[{"name":"ulid","in":"path","description":"PagesView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PagesView resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesView-pages_view.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesView-pages_view.write"}}},"required":true}}},"/api/v1/pages/views/{ulid}":{"delete":{"operationId":"api_v1pagesviews_ulid_delete","tags":["PagesView"],"responses":{"204":{"description":"PagesView resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PagesView resource.","description":"Removes the PagesView resource.","parameters":[{"name":"ulid","in":"path","description":"PagesView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1pagesviews_ulid_patch","tags":["PagesView"],"responses":{"200":{"description":"PagesView resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesView-pages_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesView.jsonld-pages_view.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PagesView resource.","description":"Updates the PagesView resource.","parameters":[{"name":"ulid","in":"path","description":"PagesView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PagesView resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PagesView-pages_view.write.jsonMergePatch"}}},"required":true}}},"/api/v1/pages/workspaces":{"get":{"operationId":"api_v1pagesworkspaces_get_collection","tags":["PagesWorkspace"],"responses":{"200":{"description":"PagesWorkspace collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PagesWorkspace-pages_workspace.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PagesWorkspace.jsonld-pages_workspace.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PagesWorkspace.jsonld-pages_workspace.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PagesWorkspace resources.","description":"Retrieves the collection of PagesWorkspace resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Name und Slug des Arbeitsbereichs (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1pagesworkspaces_post","tags":["PagesWorkspace"],"responses":{"201":{"description":"PagesWorkspace resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace-pages_workspace.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace.jsonld-pages_workspace.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PagesWorkspace resource.","description":"Creates a PagesWorkspace resource.","parameters":[],"requestBody":{"description":"The new PagesWorkspace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace-pages_workspace.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace-pages_workspace.write"}}},"required":true}}},"/api/v1/pages/workspaces/{ulid}":{"get":{"operationId":"api_v1pagesworkspaces_ulid_get","tags":["PagesWorkspace"],"responses":{"200":{"description":"PagesWorkspace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace-pages_workspace.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace.jsonld-pages_workspace.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PagesWorkspace resource.","description":"Retrieves a PagesWorkspace resource.","parameters":[{"name":"ulid","in":"path","description":"PagesWorkspace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1pagesworkspaces_ulid_delete","tags":["PagesWorkspace"],"responses":{"204":{"description":"PagesWorkspace resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PagesWorkspace resource.","description":"Removes the PagesWorkspace resource.","parameters":[{"name":"ulid","in":"path","description":"PagesWorkspace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1pagesworkspaces_ulid_patch","tags":["PagesWorkspace"],"responses":{"200":{"description":"PagesWorkspace resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace-pages_workspace.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace.jsonld-pages_workspace.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PagesWorkspace resource.","description":"Updates the PagesWorkspace resource.","parameters":[{"name":"ulid","in":"path","description":"PagesWorkspace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PagesWorkspace resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PagesWorkspace-pages_workspace.write.jsonMergePatch"}}},"required":true}}},"/api/v1/partner-roles":{"get":{"operationId":"api_v1partner-roles_get_collection","tags":["PartnerRole"],"responses":{"200":{"description":"PartnerRole collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PartnerRole-partner_role.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PartnerRole.jsonld-partner_role.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PartnerRole.jsonld-partner_role.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PartnerRole resources.","description":"Retrieves the collection of PartnerRole resources.","parameters":[{"name":"customerId","in":"query","description":"Kunden-ID. Pflichtfilter — ohne ihn antwortet die API mit 422","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/payment-terms":{"get":{"operationId":"api_v1payment-terms_get_collection","tags":["PaymentTerm"],"responses":{"200":{"description":"PaymentTerm collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PaymentTerm-payment_term.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PaymentTerm.jsonld-payment_term.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PaymentTerm.jsonld-payment_term.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PaymentTerm resources.","description":"Retrieves the collection of PaymentTerm resources.","parameters":[{"name":"active","in":"query","description":"Nur aktive (true, Default) bzw. inaktive (false) Bedingungen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"scope","in":"query","description":"Nur Bedingungen, die auf dieser Beleg-Seite gelten","required":false,"deprecated":false,"schema":{"type":"string","enum":["sales","purchase"]},"style":"form","explode":true}]},"post":{"operationId":"api_v1payment-terms_post","tags":["PaymentTerm"],"responses":{"201":{"description":"PaymentTerm resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentTerm-payment_term.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PaymentTerm.jsonld-payment_term.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PaymentTerm resource.","description":"Creates a PaymentTerm resource.","parameters":[],"requestBody":{"description":"The new PaymentTerm resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentTerm-payment_term.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PaymentTerm-payment_term.write"}}},"required":true}}},"/api/v1/payment-terms/{ulid}":{"get":{"operationId":"api_v1payment-terms_ulid_get","tags":["PaymentTerm"],"responses":{"200":{"description":"PaymentTerm resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentTerm-payment_term.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PaymentTerm.jsonld-payment_term.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PaymentTerm resource.","description":"Retrieves a PaymentTerm resource.","parameters":[{"name":"ulid","in":"path","description":"PaymentTerm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1payment-terms_ulid_delete","tags":["PaymentTerm"],"responses":{"204":{"description":"PaymentTerm resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PaymentTerm resource.","description":"Removes the PaymentTerm resource.","parameters":[{"name":"ulid","in":"path","description":"PaymentTerm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1payment-terms_ulid_patch","tags":["PaymentTerm"],"responses":{"200":{"description":"PaymentTerm resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentTerm-payment_term.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PaymentTerm.jsonld-payment_term.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PaymentTerm resource.","description":"Updates the PaymentTerm resource.","parameters":[{"name":"ulid","in":"path","description":"PaymentTerm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PaymentTerm resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PaymentTerm-payment_term.write.jsonMergePatch"}}},"required":true}}},"/api/v1/permissions":{"get":{"operationId":"api_v1permissions_get_collection","tags":["PermissionCatalog"],"responses":{"200":{"description":"PermissionCatalog collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PermissionCatalog-permission_catalog.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PermissionCatalog.jsonld-permission_catalog.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PermissionCatalog.jsonld-permission_catalog.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PermissionCatalog resources.","description":"Retrieves the collection of PermissionCatalog resources.","parameters":[{"name":"module","in":"query","description":"Modul-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"search","in":"query","description":"Suche über Permission-Name und Beschreibung (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/permissions/{name}":{"get":{"operationId":"api_v1permissions_name_get","tags":["PermissionCatalog"],"responses":{"200":{"description":"PermissionCatalog resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionCatalog-permission_catalog.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PermissionCatalog.jsonld-permission_catalog.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PermissionCatalog resource.","description":"Retrieves a PermissionCatalog resource.","parameters":[{"name":"name","in":"path","description":"PermissionCatalog identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/wms/pick-tasks/{ulid}/alternative-bins":{"get":{"operationId":"api_v1wmspick-tasks_ulidalternative-bins_get","tags":["PickAlternativeBin"],"responses":{"200":{"description":"PickAlternativeBin resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickAlternativeBin-pick_alt_bin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickAlternativeBin.jsonld-pick_alt_bin.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Wo liegt dieselbe Ware sonst noch?","description":"Plätze mit verortetem Bestand des Artikels, ohne den aktuellen Platz — Greifplätze vor Reserve, danach Wegfolge. Leer, wenn ohne Multilager gearbeitet wird oder nichts verortet ist.","parameters":[{"name":"ulid","in":"path","description":"PickAlternativeBin identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/wms/pick-lists":{"get":{"operationId":"api_v1wmspick-lists_get_collection","tags":["PickList"],"responses":{"200":{"description":"PickList collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PickList-pick_list.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PickList.jsonld-pick_list.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PickList.jsonld-pick_list.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PickList resources.","description":"Retrieves the collection of PickList resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"open","in":"query","description":"Nur offene Listen (true) — alles außer abgeschlossen/abgebrochen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"assignedUserId","in":"query","description":"Nur Listen dieser Benutzer-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über die Listennummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[number]","in":"query","description":"Sortierung nach Listennummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1wmspick-lists_post","tags":["PickList"],"responses":{"201":{"description":"PickList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList.jsonld-pick_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Pickliste anlegen — aus einer Vorlage oder aus benannten Aufträgen","description":"Entweder `templateUlid` (die Vorlage wählt die Aufträge) oder `orderUlids` (ausdrückliche Auswahl). Ein Auftrag, der bereits auf einer offenen Liste liegt, wird abgewiesen — sonst greifen zwei Läufer nach derselben Ware. Passen zu wenige Aufträge auf die Vorlage, entsteht KEINE Liste (204).","parameters":[],"requestBody":{"description":"The new PickList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}}},"required":true}}},"/api/v1/wms/pick-lists/{ulid}":{"get":{"operationId":"api_v1wmspick-lists_ulid_get","tags":["PickList"],"responses":{"200":{"description":"PickList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList.jsonld-pick_list.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PickList resource.","description":"Retrieves a PickList resource.","parameters":[{"name":"ulid","in":"path","description":"PickList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/wms/pick-lists/{ulid}/cancel":{"post":{"operationId":"wms_pick_list_cancel","tags":["PickList"],"responses":{"201":{"description":"PickList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList.jsonld-pick_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel pick list","description":"Cancel pick list. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"PickList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PickList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}}},"required":true}}},"/api/v1/wms/pick-lists/{ulid}/pick":{"post":{"operationId":"wms_pick_list_pick","tags":["PickList"],"responses":{"201":{"description":"PickList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList.jsonld-pick_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Position greifen","description":"Payload `{taskUlid, qty, boxCode?, batchRef?, serialRef?}`. Beim rollenden Pick ist `boxCode` Pflicht und muss zur Box des Auftrags passen — ein Fehlgriff ist kein Tippfehler. Bestand wird hier NICHT gebucht: die Ware liegt danach im Wagen, nicht beim Kunden.","parameters":[{"name":"ulid","in":"path","description":"PickList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PickList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}}},"required":true}}},"/api/v1/wms/pick-lists/{ulid}/relocate-task":{"post":{"operationId":"wms_pick_list_relocate_task","tags":["PickList"],"responses":{"201":{"description":"PickList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList.jsonld-pick_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Greifvorgang auf einen Ersatzplatz umhängen","description":"Payload `{taskUlid, binCode}`. Antwort auf „Platz leer\" vor der Fehlmenge. Bestand wird nicht bewegt — die Aufgabe sagt nur, wo gegriffen wird. Vorschläge liefert `GET /v1/wms/pick-tasks/{ulid}/alternative-bins`.","parameters":[{"name":"ulid","in":"path","description":"PickList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PickList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}}},"required":true}}},"/api/v1/wms/pick-lists/{ulid}/remove-order":{"post":{"operationId":"wms_pick_list_remove_order","tags":["PickList"],"responses":{"201":{"description":"PickList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList.jsonld-pick_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Auftrag von der Liste nehmen","description":"Payload `{orderUlid}`. Der Auftrag kehrt in den Pool zurück. Nicht möglich, sobald für ihn bereits etwas gegriffen wurde — die Ware liegt dann schon im Wagen.","parameters":[{"name":"ulid","in":"path","description":"PickList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PickList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}}},"required":true}}},"/api/v1/wms/pick-lists/{ulid}/shortage":{"post":{"operationId":"wms_pick_list_shortage","tags":["PickList"],"responses":{"201":{"description":"PickList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList.jsonld-pick_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Fehlmenge melden — erzeugt einen Klärfall","description":"Payload `{taskUlid, reason, note?}` mit reason ∈ shortage|not_found|damaged|expired|skipped. Die bereits gegriffene Menge bleibt stehen; der Rest wird zum Klärfall. Ein stilles Übergehen gibt es nicht — sonst merkt die Lücke erst der Kunde.","parameters":[{"name":"ulid","in":"path","description":"PickList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PickList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickList-pick_list.write"}}},"required":true}}},"/api/v1/wms/pick-list-templates":{"get":{"operationId":"api_v1wmspick-list-templates_get_collection","tags":["PickListTemplate"],"responses":{"200":{"description":"PickListTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PickListTemplate-pick_list_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PickListTemplate.jsonld-pick_list_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PickListTemplate.jsonld-pick_list_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PickListTemplate resources.","description":"Retrieves the collection of PickListTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Vorlagen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"type","in":"query","description":"Picklisten-Art (single|single_item_run|multi_order|two_stage_boxes|rolling_pick_to_box|identical_orders)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1wmspick-list-templates_post","tags":["PickListTemplate"],"responses":{"201":{"description":"PickListTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickListTemplate-pick_list_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickListTemplate.jsonld-pick_list_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PickListTemplate resource.","description":"Creates a PickListTemplate resource.","parameters":[],"requestBody":{"description":"The new PickListTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickListTemplate-pick_list_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickListTemplate-pick_list_template.write"}}},"required":true}}},"/api/v1/wms/pick-list-templates/{ulid}":{"get":{"operationId":"api_v1wmspick-list-templates_ulid_get","tags":["PickListTemplate"],"responses":{"200":{"description":"PickListTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickListTemplate-pick_list_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickListTemplate.jsonld-pick_list_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PickListTemplate resource.","description":"Retrieves a PickListTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"PickListTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1wmspick-list-templates_ulid_delete","tags":["PickListTemplate"],"responses":{"204":{"description":"PickListTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PickListTemplate resource.","description":"Removes the PickListTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"PickListTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1wmspick-list-templates_ulid_patch","tags":["PickListTemplate"],"responses":{"200":{"description":"PickListTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickListTemplate-pick_list_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickListTemplate.jsonld-pick_list_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PickListTemplate resource.","description":"Updates the PickListTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"PickListTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PickListTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PickListTemplate-pick_list_template.write.jsonMergePatch"}}},"required":true}}},"/api/v1/wms/pick-list-templates/{ulid}/preview":{"get":{"operationId":"wms_pick_list_template_preview","tags":["PickListTemplate"],"responses":{"200":{"description":"PickListTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickListTemplate-pick_list_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PickListTemplate.jsonld-pick_list_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Welche Aufträge greift diese Vorlage gerade?","description":"Liefert die Auftrags-Auswahl in genau der Reihenfolge, in der sie auf eine Liste käme — ohne etwas anzulegen und ohne Aufträge zu binden. Bereits verplante Aufträge sind gekennzeichnet. Die Vorschau ist auf 200 Zeilen gedeckelt; ist sie gekürzt, meldet das `matchingOrdersTruncated`.","parameters":[{"name":"ulid","in":"path","description":"PickListTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/crm/pipelines":{"get":{"operationId":"api_v1crmpipelines_get_collection","tags":["Pipeline"],"responses":{"200":{"description":"Pipeline collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pipeline-pipeline.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Pipeline.jsonld-pipeline.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Pipeline.jsonld-pipeline.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Pipeline resources.","description":"Retrieves the collection of Pipeline resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"type","in":"query","description":"Pipeline-Typ (lead|deal, exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1crmpipelines_post","tags":["Pipeline"],"responses":{"201":{"description":"Pipeline resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline-pipeline.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Pipeline.jsonld-pipeline.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Pipeline resource.","description":"Creates a Pipeline resource.","parameters":[],"requestBody":{"description":"The new Pipeline resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline-pipeline.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Pipeline-pipeline.write"}}},"required":true}}},"/api/v1/crm/pipelines/{id}":{"get":{"operationId":"api_v1crmpipelines_id_get","tags":["Pipeline"],"responses":{"200":{"description":"Pipeline resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline-pipeline.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Pipeline.jsonld-pipeline.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Pipeline resource.","description":"Retrieves a Pipeline resource.","parameters":[{"name":"id","in":"path","description":"Pipeline identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1crmpipelines_id_delete","tags":["Pipeline"],"responses":{"204":{"description":"Pipeline resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Pipeline resource.","description":"Removes the Pipeline resource.","parameters":[{"name":"id","in":"path","description":"Pipeline identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1crmpipelines_id_patch","tags":["Pipeline"],"responses":{"200":{"description":"Pipeline resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline-pipeline.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Pipeline.jsonld-pipeline.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Pipeline resource.","description":"Updates the Pipeline resource.","parameters":[{"name":"id","in":"path","description":"Pipeline identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Pipeline resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Pipeline-pipeline.write.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/pipeline-routing-rules":{"get":{"operationId":"api_v1crmpipeline-routing-rules_get_collection","tags":["PipelineRoutingRule"],"responses":{"200":{"description":"PipelineRoutingRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PipelineRoutingRule-routing_rule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PipelineRoutingRule.jsonld-routing_rule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PipelineRoutingRule.jsonld-routing_rule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PipelineRoutingRule resources.","description":"Retrieves the collection of PipelineRoutingRule resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"entityType","in":"query","description":"Objektgattung der Regel (lead|deal, exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1crmpipeline-routing-rules_post","tags":["PipelineRoutingRule"],"responses":{"201":{"description":"PipelineRoutingRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule-routing_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule.jsonld-routing_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PipelineRoutingRule resource.","description":"Creates a PipelineRoutingRule resource.","parameters":[],"requestBody":{"description":"The new PipelineRoutingRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule-routing_rule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule-routing_rule.write"}}},"required":true}}},"/api/v1/crm/pipeline-routing-rules/{ulid}":{"get":{"operationId":"api_v1crmpipeline-routing-rules_ulid_get","tags":["PipelineRoutingRule"],"responses":{"200":{"description":"PipelineRoutingRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule-routing_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule.jsonld-routing_rule.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PipelineRoutingRule resource.","description":"Retrieves a PipelineRoutingRule resource.","parameters":[{"name":"ulid","in":"path","description":"PipelineRoutingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1crmpipeline-routing-rules_ulid_delete","tags":["PipelineRoutingRule"],"responses":{"204":{"description":"PipelineRoutingRule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PipelineRoutingRule resource.","description":"Removes the PipelineRoutingRule resource.","parameters":[{"name":"ulid","in":"path","description":"PipelineRoutingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1crmpipeline-routing-rules_ulid_patch","tags":["PipelineRoutingRule"],"responses":{"200":{"description":"PipelineRoutingRule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule-routing_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule.jsonld-routing_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PipelineRoutingRule resource.","description":"Updates the PipelineRoutingRule resource.","parameters":[{"name":"ulid","in":"path","description":"PipelineRoutingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PipelineRoutingRule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PipelineRoutingRule-routing_rule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/planning/planner-timeline":{"get":{"operationId":"api_v1planningplanner-timeline_get_collection","tags":["PlannerTimeline"],"responses":{"200":{"description":"PlannerTimeline collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlannerTimeline-plannertimeline.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PlannerTimeline.jsonld-plannertimeline.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PlannerTimeline.jsonld-plannertimeline.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PlannerTimeline resources.","description":"Personen-Zeilen mit ihren terminierten Aufgaben, Abwesenheiten und den Meilensteinen im Zeitraum.","parameters":[{"name":"from","in":"query","description":"Beginn des Zeitraums (Y-m-d); Default: heute","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Ende des Zeitraums (Y-m-d); Default: heute + 60 Tage","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"employeeIds","in":"query","description":"Kommaliste von Mitarbeiter-IDs (Default: alle aktiven)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/planning/checklist":{"get":{"operationId":"api_v1planningchecklist_get_collection","tags":["PlanningChecklist"],"responses":{"200":{"description":"PlanningChecklist collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlanningChecklist-planningChecklist.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PlanningChecklist.jsonld-planningChecklist.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PlanningChecklist.jsonld-planningChecklist.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PlanningChecklist resources.","description":"Retrieves the collection of PlanningChecklist resources.","parameters":[{"name":"from","in":"query","description":"Zeitraum-Beginn (Default: heute)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende (Default: from + 4 Wochen)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (nur innerhalb des eigenen Marken-Scopes zulässig)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID (mehrfach angebbar: employeeId[]=…)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"includeFreelancers","in":"query","description":"Freelancer einbeziehen (Default: true)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"kind","in":"query","description":"Eintrags-Art (mehrfach angebbar: kind[]=…; leer = alle)","required":false,"deprecated":false,"schema":{"type":"string","enum":["deadline","milestone","absence","overbooked"]},"style":"form","explode":true}]}},"/api/v1/plugins":{"get":{"operationId":"api_v1plugins_get_collection","tags":["Plugin"],"responses":{"200":{"description":"Plugin collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Plugin-plugin.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Plugin.jsonld-plugin.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Plugin.jsonld-plugin.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Plugin resources.","description":"Retrieves the collection of Plugin resources.","parameters":[]}},"/api/v1/plugins/{name}":{"get":{"operationId":"api_v1plugins_name_get","tags":["Plugin"],"responses":{"200":{"description":"Plugin resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin-plugin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin.jsonld-plugin.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Plugin resource.","description":"Retrieves a Plugin resource.","parameters":[{"name":"name","in":"path","description":"Plugin identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/plugins/{name}/activate":{"post":{"operationId":"plugin_activate","tags":["Plugin"],"responses":{"200":{"description":"Plugin resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin-plugin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin.jsonld-plugin.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Activate plugin","description":"Activate plugin. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"name","in":"path","description":"Plugin identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new Plugin resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin"}}},"required":true}}},"/api/v1/plugins/{name}/deactivate":{"post":{"operationId":"plugin_deactivate","tags":["Plugin"],"responses":{"200":{"description":"Plugin resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin-plugin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin.jsonld-plugin.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Deactivate plugin","description":"Deactivate plugin. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"name","in":"path","description":"Plugin identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new Plugin resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin"}}},"required":true}}},"/api/v1/plugins/{name}/install":{"post":{"operationId":"plugin_install","tags":["Plugin"],"responses":{"200":{"description":"Plugin resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin-plugin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin.jsonld-plugin.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Install plugin","description":"Install plugin. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"name","in":"path","description":"Plugin identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new Plugin resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin"}}},"required":true}}},"/api/v1/plugins/{name}/uninstall":{"post":{"operationId":"plugin_uninstall","tags":["Plugin"],"responses":{"200":{"description":"Plugin resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin-plugin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin.jsonld-plugin.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Uninstall plugin","description":"Uninstall plugin. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"name","in":"path","description":"Plugin identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new Plugin resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plugin"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Plugin"}}},"required":true}}},"/api/v1/plugin-install-jobs/{jobId}":{"get":{"operationId":"api_v1plugin-install-jobs_jobId_get","tags":["PluginInstallJob"],"responses":{"200":{"description":"PluginInstallJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PluginInstallJob-plugin_install_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PluginInstallJob.jsonld-plugin_install_job.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PluginInstallJob resource.","description":"Status eines asynchronen Plugin-Installations-Laufs (Job-ID aus POST /v1/plugin-candidates/{dir}/install bzw. POST /api/v1/plugins/upload). Endzustaende: succeeded | failed.","parameters":[{"name":"jobId","in":"path","description":"PluginInstallJob identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/plugin-store":{"get":{"operationId":"api_v1plugin-store_get_collection","tags":["PluginStore"],"responses":{"200":{"description":"PluginStore collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PluginStore-plugin_store.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PluginStore.jsonld-plugin_store.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PluginStore.jsonld-plugin_store.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PluginStore resources.","description":"Retrieves the collection of PluginStore resources.","parameters":[]}},"/api/v1/plugin-store/{id}/install":{"post":{"operationId":"plugin_store_install","tags":["PluginStore"],"responses":{"200":{"description":"PluginStore resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PluginStore-plugin_store.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PluginStore.jsonld-plugin_store.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Install plugin store","description":"Install plugin store. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"id","in":"path","description":"PluginStore identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The new PluginStore resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PluginStore"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PluginStore"}}},"required":true}}},"/api/v1/portal-management/users/{ulid}/access":{"post":{"operationId":"api_v1portal-managementusers_ulidaccess_post","tags":["PortalAccessGrant"],"responses":{"201":{"description":"PortalAccessGrant resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalAccessGrant-portal_access_grant.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PortalAccessGrant.jsonld-portal_access_grant.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Portal-Zugriff vergeben","description":"Vergibt dem Ziel-Nutzer eine Portal-Zugriffszeile. Ein Nutzer einer fremden Marke führt zu 404.","parameters":[{"name":"ulid","in":"path","description":"PortalAccessGrant identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PortalAccessGrant resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalAccessGrant-portal_access_grant.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PortalAccessGrant-portal_access_grant.write"}}},"required":true}}},"/api/v1/portal-management/invitations":{"post":{"operationId":"api_v1portal-managementinvitations_post","tags":["PortalInvitation"],"responses":{"201":{"description":"PortalInvitation resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalInvitation-portal_invitation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PortalInvitation.jsonld-portal_invitation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PortalInvitation resource.","description":"Creates a PortalInvitation resource.","parameters":[],"requestBody":{"description":"The new PortalInvitation resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalInvitation-portal_invitation.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PortalInvitation-portal_invitation.write"}}},"required":true}}},"/api/v1/portal-management/portal-users":{"get":{"operationId":"api_v1portal-managementportal-users_get_collection","tags":["PortalUser"],"responses":{"200":{"description":"PortalUser collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PortalUser-portal_user.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PortalUser.jsonld-portal_user.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PortalUser.jsonld-portal_user.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PortalUser resources.","description":"Retrieves the collection of PortalUser resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunde (ID, exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/portal-management/users/{ulid}/status":{"post":{"operationId":"api_v1portal-managementusers_ulidstatus_post","tags":["PortalUserStatus"],"responses":{"201":{"description":"PortalUserStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalUserStatus-portal_user_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PortalUserStatus.jsonld-portal_user_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Portal-Nutzer sperren oder freischalten","description":"Setzt den Portal-Nutzer auf `suspended` oder `active`. Ein Nutzer einer fremden Marke führt zu 404.","parameters":[{"name":"ulid","in":"path","description":"PortalUserStatus identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PortalUserStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalUserStatus-portal_user_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PortalUserStatus-portal_user_status.write"}}},"required":true}}},"/api/v1/pos/exports":{"get":{"operationId":"api_v1posexports_get_collection","tags":["PosExport"],"responses":{"200":{"description":"PosExport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PosExport-pos_export.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PosExport.jsonld-pos_export.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PosExport.jsonld-pos_export.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PosExport resources.","description":"Retrieves the collection of PosExport resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Nur Datensätze dieser Marke (Marken-Umschalter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"registerId","in":"query","description":"Nur Läufe für diese Kasse","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erzeugung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1posexports_post","tags":["PosExport"],"responses":{"201":{"description":"PosExport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosExport-pos_export.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosExport.jsonld-pos_export.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"DSFinV-K-Datensatz erzeugen","description":"Payload `{periodFrom, periodTo, registerUlid?}` (Tagesdaten, einschließlich). Exportiert wird je **Kassenabschluss**, nicht je Kalendertag — noch offene Schichten werden übersprungen und in `skippedSessions` benannt. Ergebnis ist ein ZIP mit `index.xml`, der DTD und den CSV-Dateien der DSFinV-K 2.3; die Datei-ULID steht in `fileUlid` (Download über `/v1/platform/files/{ulid}/download`).","parameters":[],"requestBody":{"description":"The new PosExport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosExport-pos_export.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosExport-pos_export.write"}}},"required":true}}},"/api/v1/pos/exports/{ulid}":{"get":{"operationId":"api_v1posexports_ulid_get","tags":["PosExport"],"responses":{"200":{"description":"PosExport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosExport-pos_export.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosExport.jsonld-pos_export.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PosExport resource.","description":"Retrieves a PosExport resource.","parameters":[{"name":"ulid","in":"path","description":"PosExport identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/pos/registers/{ulid}/price":{"get":{"operationId":"api_v1posregisters_ulidprice_get","tags":["PosPriceQuote"],"responses":{"200":{"description":"PosPriceQuote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosPriceQuote-pos_price.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosPriceQuote.jsonld-pos_price.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verkaufspreis eines Artikels an dieser Kasse","description":"Der **Brutto**-Stückpreis inklusive Kundengruppen-, Staffel- und Aktionspreisen, dazu Steuersatz und die angewandte Preisregel. Gedacht für ein Kassengerät, das den Warenkorb lokal führt: der Offline-Schnappschuss liefert nur den Regalpreis (`priceBasis: shelf`), dieser Abruf den Preis, der wirklich gilt. Unbekannter Code → 422.","parameters":[{"name":"ulid","in":"path","description":"PosPriceQuote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"code","in":"query","description":"Artikelnummer ODER GTIN — der gescannte Code","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"productId","in":"query","description":"Alternativ die Artikel-Id, wenn der Artikel schon aufgelöst ist","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"qty","in":"query","description":"Menge — Staffelpreise hängen daran (Vorgabe 1)","required":false,"deprecated":false,"schema":{"type":"number"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunde, falls der Bon einem zugeordnet ist (Kundengruppen-/Kundenpreise)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/pos/registers":{"get":{"operationId":"api_v1posregisters_get_collection","tags":["PosRegister"],"responses":{"200":{"description":"PosRegister collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PosRegister-pos_register.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PosRegister.jsonld-pos_register.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PosRegister.jsonld-pos_register.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PosRegister resources.","description":"Retrieves the collection of PosRegister resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Nur Datensätze dieser Marke (Marken-Umschalter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. nur stillgelegte (false) Kassen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"warehouseId","in":"query","description":"Nur Kassen dieser Filiale (Lager)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext über Kassen-ID und Name","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[registerKey]","in":"query","description":"Sortierung nach Kassen-ID (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1posregisters_post","tags":["PosRegister"],"responses":{"201":{"description":"PosRegister resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosRegister-pos_register.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosRegister.jsonld-pos_register.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kasse einrichten","description":"Pflicht sind `registerKey` (DSFinV-K `Z_KASSE_ID`, systemweit eindeutig und danach unveränderlich) und `name`. `warehouseId` ist die Filiale, `brandId` die Firmierung auf dem Beleg. Ohne `tseMode: fiskaly` samt `tseTssId`/`tseClientId` wird JEDER Bon dieser Kasse als unsigniert geführt und trägt den Pflichthinweis.","parameters":[],"requestBody":{"description":"The new PosRegister resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosRegister-pos_register.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosRegister-pos_register.write"}}},"required":true}}},"/api/v1/pos/registers/{ulid}":{"get":{"operationId":"api_v1posregisters_ulid_get","tags":["PosRegister"],"responses":{"200":{"description":"PosRegister resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosRegister-pos_register.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosRegister.jsonld-pos_register.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PosRegister resource.","description":"Retrieves a PosRegister resource.","parameters":[{"name":"ulid","in":"path","description":"PosRegister identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1posregisters_ulid_patch","tags":["PosRegister"],"responses":{"200":{"description":"PosRegister resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosRegister-pos_register.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosRegister.jsonld-pos_register.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kasse ändern","description":"Alles außer `registerKey` — die Kassen-ID ist die Kennung, unter der die Finanzverwaltung diese Kasse über Jahre wiederfindet.","parameters":[{"name":"ulid","in":"path","description":"PosRegister identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PosRegister resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PosRegister-pos_register.write.jsonMergePatch"}}},"required":true}}},"/api/v1/pos/sales":{"get":{"operationId":"api_v1possales_get_collection","tags":["PosSale"],"responses":{"200":{"description":"PosSale collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PosSale.jsonld-pos_sale.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PosSale resources.","description":"Retrieves the collection of PosSale resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Nur Datensätze dieser Marke (Marken-Umschalter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"registerId","in":"query","description":"Nur Bons dieser Kasse","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"sessionUlid","in":"query","description":"Nur Bons dieser Schicht","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"open|finished|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"kind","in":"query","description":"sale|return","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Nur Bons dieses Kunden","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"unsigned","in":"query","description":"Nur Bons OHNE gültige TSE-Signatur (dokumentierter Ausfall) — die meldepflichtige Liste","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"from","in":"query","description":"Abgeschlossen ab diesem Tag (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Abgeschlossen bis zu diesem Tag (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"periodFrom","in":"query","description":"Alias für `from` (Zeitraum-Filter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"periodTo","in":"query","description":"Alias für `to` (Zeitraum-Filter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext über die Bonnummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[number]","in":"query","description":"Sortierung nach Bonnummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[finishedAt]","in":"query","description":"Sortierung nach Abschluss (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[grossAmount]","in":"query","description":"Sortierung nach Bruttobetrag (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1possales_post","tags":["PosSale"],"responses":{"201":{"description":"PosSale resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bon anlegen (und optional in einem Zug abschließen)","description":"Payload `{registerUlid, customerId?, clientRef?, salesOrderUlid?, items?: [...], payments?: [...]}`.\n\n- **`clientRef`** ist der Offline-Anker: derselbe Wert liefert **denselben** Bon zurück (200 statt 201) statt einen zweiten anzulegen.\n- **`salesOrderUlid`** übernimmt die offenen Positionen eines Auftrags mit DESSEN Preisen (Click&Collect).\n- **`items`**: `[{code?|productId?, name?, qty?, unitPriceAmount?, discountAmount?, taxRate?, taxCategory?, itemType?}]`. `code` löst über Artikelnummer ODER GTIN auf; `unitPriceAmount` ist immer BRUTTO.\n- **`payments`**: `[{type: cash|card|voucher|invoice|online, amount?, givenAmount?, reference?}]`. Sind sie da, wird der Bon sofort abgeschlossen; `amount` weggelassen heißt „der Rest\".\n- **`capturedAt`** (ISO-8601): die Zeit, zu der das GERÄT den Bon erfasst hat — nur beim Nachreichen aus dem Offline-Puffer. Der Beleg trägt dann diese Zeit statt der Sync-Zeit (sonst sähen zwanzig Bons einer Netzstörung aus, als wären sie in derselben Minute entstanden); der Server klemmt sie gegen Schichtbeginn und Jetzt. Ein so nachgereichter Bon wird als **dokumentierter TSE-Ausfall** geführt — nachträglich zu signieren wäre ein Signaturzähler, der nicht zum Verkauf gehört.","parameters":[],"requestBody":{"description":"The new PosSale resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}}},"required":true}}},"/api/v1/pos/sales/{ulid}":{"get":{"operationId":"api_v1possales_ulid_get","tags":["PosSale"],"responses":{"200":{"description":"PosSale resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PosSale resource.","description":"Retrieves a PosSale resource.","parameters":[{"name":"ulid","in":"path","description":"PosSale identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/pos/sales/{ulid}/cancel":{"post":{"operationId":"pos_sale_cancel","tags":["PosSale"],"responses":{"201":{"description":"PosSale resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Offenen Bon abbrechen","description":"Der Kunde geht ohne zu kaufen. Nichts gebucht, keine Nummer verbraucht — deshalb kein Storno und kein Gegenbon. Ein abgeschlossener Bon lässt sich so nicht abbrechen (409).","parameters":[{"name":"ulid","in":"path","description":"PosSale identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PosSale resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}}},"required":true}}},"/api/v1/pos/sales/{ulid}/finish":{"post":{"operationId":"pos_sale_finish","tags":["PosSale"],"responses":{"201":{"description":"PosSale resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Abschließen — Nummer, Bestand, Geld, Signatur","description":"Payload `{payments: [{type, amount?, givenAmount?, reference?}]}`. Die Zahlungen müssen den Bon EXAKT decken (ein zu viel hingelegter Schein ist Rückgeld, keine höhere Zahlung). Zieht die lückenlose Bonnummer, bucht den Warenausgang in EINEM Lauf und fragt zuletzt die TSE — **ein Signatur-Ausfall bricht den Abschluss NICHT ab**, er wird auf dem Bon dokumentiert und auf dem Beleg kenntlich gemacht (§ 146a AO / AEAO).","parameters":[{"name":"ulid","in":"path","description":"PosSale identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PosSale resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}}},"required":true}}},"/api/v1/pos/sales/{ulid}/items":{"post":{"operationId":"pos_sale_add_item","tags":["PosSale"],"responses":{"201":{"description":"PosSale resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Position hinzufügen (Scan)","description":"Payload `{code?|productId?, name?, qty?, unitPriceAmount?, discountAmount?, taxRate?, taxCategory?, itemType?}`. Ohne Artikelbezug ist `name` Pflicht (Freitext-Position). Auf einem Verkaufsbon sind negative Mengen unzulässig — die Rücknahme ist ein Gegenbon.","parameters":[{"name":"ulid","in":"path","description":"PosSale identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PosSale resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}}},"required":true}}},"/api/v1/pos/sales/{ulid}/print":{"post":{"operationId":"pos_sale_print","tags":["PosSale"],"responses":{"201":{"description":"PosSale resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Beleg drucken bzw. Beleg-HTML holen","description":"Payload `{copies?}`. Schickt den Beleg an den Arbeitsplatz-Agenten, sofern erreichbar; die Antwort enthält immer `receiptHtml` für die Druckvorschau — der Druck ist nie eine Bedingung, ein Papierstau darf einen abgeschlossenen Bon nicht in Frage stellen.","parameters":[{"name":"ulid","in":"path","description":"PosSale identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PosSale resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}}},"required":true}}},"/api/v1/pos/sales/{ulid}/remove-item":{"post":{"operationId":"pos_sale_remove_item","tags":["PosSale"],"responses":{"201":{"description":"PosSale resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Position entfernen","description":"Payload `{itemUlid}`. Nur solange der Bon offen ist — danach ist er ein Beleg.","parameters":[{"name":"ulid","in":"path","description":"PosSale identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PosSale resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}}},"required":true}}},"/api/v1/pos/sales/{ulid}/void":{"post":{"operationId":"pos_sale_void","tags":["PosSale"],"responses":{"201":{"description":"PosSale resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale.jsonld-pos_sale.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zurücknehmen — Gegenbon erzeugen","description":"Payload `{refundPayments?: [{type, amount?, reference?}]}`; ohne Angabe wird die ursprüngliche Zahlung gespiegelt. Erzeugt einen zweiten Bon mit negativen Mengen, eigener Nummer und **eigener** Signatur; das Original bleibt unverändert. Gutschein-Guthaben wird ZUERST zurückgegeben, dann der Rest ausgezahlt. Antwort ist der Gegenbon.\n\n- **Vorzeichen:** der Gegenbon ist NEGATIV, eine Rückzahlung deshalb ebenfalls — `amount` ist ein negativer Cent-Betrag (25,94 € zurück = `-2594`). Ein positiver Betrag wird mit 422 `errors.pos.refundPaymentSign` abgewiesen, bevor irgendetwas entsteht.\n- **Betrag:** die Summe der `refundPayments` muss den Gegenbon EXAKT decken (= negatives Brutto des Originals); sonst 422 `errors.pos.paymentMismatch`. `amount` weggelassen heißt „der Rest\".\n- **Alles oder nichts:** Gegenbon, Positionen, Gutschein-Freigabe, Nummer, Bestand und die Verknüpfung am Original stehen in EINER Transaktion. Scheitert der Vorgang, bleibt nichts zurück und der Aufruf lässt sich unverändert wiederholen.","parameters":[{"name":"ulid","in":"path","description":"PosSale identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PosSale resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSale-pos_sale.write"}}},"required":true}}},"/api/v1/pos/sessions":{"get":{"operationId":"api_v1possessions_get_collection","tags":["PosSession"],"responses":{"200":{"description":"PosSession collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PosSession-pos_session.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PosSession.jsonld-pos_session.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PosSession.jsonld-pos_session.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PosSession resources.","description":"Retrieves the collection of PosSession resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Nur Datensätze dieser Marke (Marken-Umschalter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"registerId","in":"query","description":"Nur Schichten dieser Kasse","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"open|closed","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Eröffnet ab diesem Tag (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Eröffnet bis zu diesem Tag (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"periodFrom","in":"query","description":"Alias für `from` (Zeitraum-Filter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"periodTo","in":"query","description":"Alias für `to` (Zeitraum-Filter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"order[zNumber]","in":"query","description":"Sortierung nach Z-Nummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[openedAt]","in":"query","description":"Sortierung nach Eröffnung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1possessions_post","tags":["PosSession"],"responses":{"201":{"description":"PosSession resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSession.jsonld-pos_session.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Schicht öffnen","description":"Payload `{registerUlid, openingCashAmount?}`. Eine Kasse hat höchstens EINE offene Schicht (409). Die Z-Nummer läuft je Kasse fortlaufend und wird unter einer Sperre auf der Kassenzeile gezogen.","parameters":[],"requestBody":{"description":"The new PosSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.write"}}},"required":true}}},"/api/v1/pos/sessions/{ulid}":{"get":{"operationId":"api_v1possessions_ulid_get","tags":["PosSession"],"responses":{"200":{"description":"PosSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSession.jsonld-pos_session.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Schicht mit Summen","description":"Eine GESCHLOSSENE Schicht liefert den eingefrorenen Abschluss-Schnappschuss (Z-Bericht), eine OFFENE den Zwischenstand aus derselben Rechnung (X-Bericht). Zwei Rechnungen für dieselbe Frage wären zwei Antworten.","parameters":[{"name":"ulid","in":"path","description":"PosSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/pos/sessions/{ulid}/cash-movement":{"post":{"operationId":"pos_session_cash_movement","tags":["PosSession"],"responses":{"201":{"description":"PosSession resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSession.jsonld-pos_session.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bargeld einlegen oder entnehmen","description":"Payload `{type: deposit|withdrawal|payout, amount, reason?}`. `amount` ist immer POSITIV — die Richtung steckt im Typ, damit eine Entnahme nicht versehentlich als Einlage gebucht wird.","parameters":[{"name":"ulid","in":"path","description":"PosSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PosSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.write"}}},"required":true}}},"/api/v1/pos/sessions/{ulid}/close":{"post":{"operationId":"pos_session_close","tags":["PosSession"],"responses":{"201":{"description":"PosSession resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSession.jsonld-pos_session.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kassensturz — zählen und abschließen","description":"Payload `{countedCashAmount, note?}`. Rechnet den Soll-Bestand (Anfangsbestand + Bareinnahmen + Einlagen − Entnahmen), speichert die Differenz **ohne sie auszugleichen** und friert die Abschluss-Summen ein. Ein offener Bon blockiert den Abschluss (409); ab der eingestellten Schwelle verlangt eine Differenz eine Begründung (422).","parameters":[{"name":"ulid","in":"path","description":"PosSession identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PosSession resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSession-pos_session.write"}}},"required":true}}},"/api/v1/pos/registers/{ulid}/snapshot":{"get":{"operationId":"api_v1posregisters_ulidsnapshot_get","tags":["PosSnapshot"],"responses":{"200":{"description":"PosSnapshot resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosSnapshot-pos_snapshot.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PosSnapshot.jsonld-pos_snapshot.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Offline-Schnappschuss der Kasse","description":"Alles, was ein Kassengerät braucht, um OHNE Verbindung weiterzuverkaufen: Kasse, offene Schicht und die verkaufsfähigen Artikel mit **Brutto-Regalpreis** und Steuersatz. `priceBasis: shelf` sagt ausdrücklich, dass es KEINE Kundenpreise sind — die hängen an Daten, die das Gerät offline nicht hat. `capabilities` nennt, was offline erlaubt ist; Gutschein, Click&Collect und Kundensuche stehen bewusst auf `false`, damit die Oberfläche sie gar nicht erst anbietet. Ein gedeckelter Lauf meldet `truncated` und `nextAfterId`, statt still die Hälfte des Sortiments zu unterschlagen.","parameters":[{"name":"ulid","in":"path","description":"PosSnapshot identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"since","in":"query","description":"Nur Artikel, die seit diesem Zeitpunkt geändert wurden — der Katalog wird einmal geladen und danach nur nachgezogen","required":false,"deprecated":false,"schema":{"type":"string","format":"date-time"},"style":"form","explode":true},{"name":"after","in":"query","description":"Weiterblättern ab dieser Artikel-Id (aus `nextAfterId` der vorigen Antwort), wenn ein Lauf gedeckelt wurde","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/price-resolution":{"post":{"operationId":"api_v1price-resolution_post","tags":["PriceResolution"],"responses":{"201":{"description":"PriceResolution resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceResolution-price_resolution.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PriceResolution.jsonld-price_resolution.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PriceResolution resource.","description":"Creates a PriceResolution resource.","parameters":[],"requestBody":{"description":"The new PriceResolution resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceResolution-price_resolution.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PriceResolution-price_resolution.write"}}},"required":true}}},"/api/v1/price-tiers":{"get":{"operationId":"api_v1price-tiers_get_collection","tags":["PriceTierSet"],"responses":{"200":{"description":"PriceTierSet collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PriceTierSet-price_tier_set.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PriceTierSet.jsonld-price_tier_set.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PriceTierSet.jsonld-price_tier_set.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PriceTierSet resources.","description":"Retrieves the collection of PriceTierSet resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Produkt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"scope","in":"query","description":"Geltungsbereich (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Staffel-Sets","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marke (numerische PK) — zeigt nur Staffel-Sets dieser Marke plus die markenlosen","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1price-tiers_post","tags":["PriceTierSet"],"responses":{"201":{"description":"PriceTierSet resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceTierSet-price_tier_set.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PriceTierSet.jsonld-price_tier_set.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PriceTierSet resource.","description":"Creates a PriceTierSet resource.","parameters":[],"requestBody":{"description":"The new PriceTierSet resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceTierSet-price_tier_set.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PriceTierSet-price_tier_set.write"}}},"required":true}}},"/api/v1/price-tiers/{ulid}":{"get":{"operationId":"api_v1price-tiers_ulid_get","tags":["PriceTierSet"],"responses":{"200":{"description":"PriceTierSet resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceTierSet-price_tier_set.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PriceTierSet.jsonld-price_tier_set.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PriceTierSet resource.","description":"Retrieves a PriceTierSet resource.","parameters":[{"name":"ulid","in":"path","description":"PriceTierSet identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1price-tiers_ulid_delete","tags":["PriceTierSet"],"responses":{"204":{"description":"PriceTierSet resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PriceTierSet resource.","description":"Removes the PriceTierSet resource.","parameters":[{"name":"ulid","in":"path","description":"PriceTierSet identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1price-tiers_ulid_patch","tags":["PriceTierSet"],"responses":{"200":{"description":"PriceTierSet resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceTierSet-price_tier_set.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PriceTierSet.jsonld-price_tier_set.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PriceTierSet resource.","description":"Updates the PriceTierSet resource.","parameters":[{"name":"ulid","in":"path","description":"PriceTierSet identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PriceTierSet resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PriceTierSet-price_tier_set.write.jsonMergePatch"}}},"required":true}}},"/api/v1/print/jobs":{"get":{"operationId":"api_v1printjobs_get_collection","tags":["PrintJob"],"responses":{"200":{"description":"PrintJob collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PrintJob-print_job.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PrintJob.jsonld-print_job.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PrintJob.jsonld-print_job.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PrintJob resources.","description":"Retrieves the collection of PrintJob resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"queued|claimed|printed|failed|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"workplaceUlid","in":"query","description":"Aufträge eines Arbeitsplatzes","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"documentType","in":"query","description":"Fachlicher Typ, z. B. shipping_label","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagezeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Zustand (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1printjobs_post","tags":["PrintJob"],"responses":{"201":{"description":"PrintJob resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintJob.jsonld-print_job.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Druckauftrag an einen Arbeitsplatz stellen","description":"Payload `{workplaceKey, documentType, format, payload, copies?, printerKey?}`. `format` ist `zpl` (Steuerbefehle direkt an den Etikettendrucker) oder `pdf` (base64-kodiert). Passt kein Gerät des Arbeitsplatzes zu Typ und Format, antwortet die Operation 422 — sie stellt den Auftrag NICHT ein, damit der Aufrufer auf den Download zurückfallen kann statt auf ein Etikett zu warten, das niemand druckt.","parameters":[],"requestBody":{"description":"The new PrintJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.write"}}},"required":true}}},"/api/v1/print/jobs/{ulid}":{"get":{"operationId":"api_v1printjobs_ulid_get","tags":["PrintJob"],"responses":{"200":{"description":"PrintJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintJob.jsonld-print_job.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PrintJob resource.","description":"Retrieves a PrintJob resource.","parameters":[{"name":"ulid","in":"path","description":"PrintJob identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/print/jobs/{ulid}/cancel":{"post":{"operationId":"print_job_cancel","tags":["PrintJob"],"responses":{"201":{"description":"PrintJob resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintJob.jsonld-print_job.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Noch nicht abgeholten Druckauftrag zurückziehen","description":"Nur im Zustand `queued` möglich (sonst 409): was der Agent bereits geholt hat, liegt womöglich schon im Drucker.","parameters":[{"name":"ulid","in":"path","description":"PrintJob identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PrintJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.write"}}},"required":true}}},"/api/v1/print/jobs/{ulid}/retry":{"post":{"operationId":"print_job_retry","tags":["PrintJob"],"responses":{"201":{"description":"PrintJob resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintJob.jsonld-print_job.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Gescheiterten Druckauftrag erneut einstellen","description":"Nur im Zustand `failed` möglich (sonst 422). Bewusst keine automatische Wiederholung: ein halb ausgeworfenes Etikett meldet sich ebenfalls als Fehler — ob nachgedruckt wird, entscheidet der Mensch am Karton.","parameters":[{"name":"ulid","in":"path","description":"PrintJob identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PrintJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintJob-print_job.write"}}},"required":true}}},"/api/v1/print/workplaces":{"get":{"operationId":"api_v1printworkplaces_get_collection","tags":["PrintWorkplace"],"responses":{"200":{"description":"PrintWorkplace collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PrintWorkplace.jsonld-print_workplace.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PrintWorkplace.jsonld-print_workplace.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PrintWorkplace resources.","description":"Retrieves the collection of PrintWorkplace resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"1 = nur aktive Arbeitsplätze","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"online","in":"query","description":"1 = nur Arbeitsplätze mit laufendem Agent","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche in Schlüssel und Bezeichnung","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[workplaceKey]","in":"query","description":"Sortierung nach Arbeitsplatz-Schlüssel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Bezeichnung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[lastSeenAt]","in":"query","description":"Sortierung nach letztem Lebenszeichen (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1printworkplaces_post","tags":["PrintWorkplace"],"responses":{"201":{"description":"PrintWorkplace resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace.jsonld-print_workplace.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PrintWorkplace resource.","description":"Creates a PrintWorkplace resource.","parameters":[],"requestBody":{"description":"The new PrintWorkplace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.write"}}},"required":true}}},"/api/v1/print/workplaces/{ulid}":{"get":{"operationId":"api_v1printworkplaces_ulid_get","tags":["PrintWorkplace"],"responses":{"200":{"description":"PrintWorkplace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace.jsonld-print_workplace.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PrintWorkplace resource.","description":"Retrieves a PrintWorkplace resource.","parameters":[{"name":"ulid","in":"path","description":"PrintWorkplace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1printworkplaces_ulid_delete","tags":["PrintWorkplace"],"responses":{"204":{"description":"PrintWorkplace resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PrintWorkplace resource.","description":"Removes the PrintWorkplace resource.","parameters":[{"name":"ulid","in":"path","description":"PrintWorkplace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1printworkplaces_ulid_patch","tags":["PrintWorkplace"],"responses":{"200":{"description":"PrintWorkplace resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace.jsonld-print_workplace.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Arbeitsplatz ändern (Marken-Wechsel entwertet das Agent-Token)","description":"Ein Wechsel der `brandId` macht das ausgegebene Agent-Token ungültig — sonst spräche es weiter als Gerät der neuen Marke und holte deren Druckaufträge ab. Die Antwort zeigt das als `tokenRevoked: true`; der Arbeitsplatz bleibt stumm, bis ein neues Token ausgegeben wurde.","parameters":[{"name":"ulid","in":"path","description":"PrintWorkplace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PrintWorkplace resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.write.jsonMergePatch"}}},"required":true}}},"/api/v1/print/workplaces/{ulid}/token":{"post":{"operationId":"print_workplace_issue_token","tags":["PrintWorkplace"],"responses":{"201":{"description":"PrintWorkplace resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace.jsonld-print_workplace.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Agent-Token ausgeben (entwertet das bisherige)","description":"Antwort enthält das Klartext-Token GENAU EINMAL (`token`) — gespeichert wird nur sein SHA-256-Hash. Der lokale Agent schickt es im Header `X-Octibiz-Print-Token`. Ein zweiter Aufruf erzeugt ein neues Token und macht das alte ungültig; ein „Token anzeigen\" gibt es bewusst nicht.","parameters":[{"name":"ulid","in":"path","description":"PrintWorkplace identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PrintWorkplace resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PrintWorkplace-print_workplace.write"}}},"required":true}}},"/api/v1/print/printers":{"get":{"operationId":"api_v1printprinters_get_collection","tags":["Printer"],"responses":{"200":{"description":"Printer collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Printer-printer.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Printer.jsonld-printer.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Printer.jsonld-printer.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Printer resources.","description":"Retrieves the collection of Printer resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"workplaceUlid","in":"query","description":"Drucker eines Arbeitsplatzes","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"format","in":"query","description":"zpl|pdf","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"1 = nur aktive Geräte","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Bezeichnung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[format]","in":"query","description":"Sortierung nach Format (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1printprinters_post","tags":["Printer"],"responses":{"201":{"description":"Printer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Printer-printer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Printer.jsonld-printer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Printer resource.","description":"Creates a Printer resource.","parameters":[],"requestBody":{"description":"The new Printer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Printer-printer.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Printer-printer.write"}}},"required":true}}},"/api/v1/print/printers/{ulid}":{"get":{"operationId":"api_v1printprinters_ulid_get","tags":["Printer"],"responses":{"200":{"description":"Printer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Printer-printer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Printer.jsonld-printer.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Printer resource.","description":"Retrieves a Printer resource.","parameters":[{"name":"ulid","in":"path","description":"Printer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1printprinters_ulid_delete","tags":["Printer"],"responses":{"204":{"description":"Printer resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Printer resource.","description":"Removes the Printer resource.","parameters":[{"name":"ulid","in":"path","description":"Printer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1printprinters_ulid_patch","tags":["Printer"],"responses":{"200":{"description":"Printer resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Printer-printer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Printer.jsonld-printer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Printer resource.","description":"Updates the Printer resource.","parameters":[{"name":"ulid","in":"path","description":"Printer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Printer resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Printer-printer.write.jsonMergePatch"}}},"required":true}}},"/api/v1/procurement/framework-agreements":{"get":{"operationId":"api_v1procurementframework-agreements_get_collection","tags":["ProcurementFrameworkAgreement"],"responses":{"200":{"description":"ProcurementFrameworkAgreement collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement-proc_fa.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProcurementFrameworkAgreement.jsonld-proc_fa.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement.jsonld-proc_fa.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProcurementFrameworkAgreement resources.","description":"Retrieves the collection of ProcurementFrameworkAgreement resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"supplierRoleId","in":"query","description":"Lieferanten-Rollen-ID (supplier_role.id)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1procurementframework-agreements_post","tags":["ProcurementFrameworkAgreement"],"responses":{"201":{"description":"ProcurementFrameworkAgreement resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement-proc_fa.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement.jsonld-proc_fa.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProcurementFrameworkAgreement resource.","description":"Creates a ProcurementFrameworkAgreement resource.","parameters":[],"requestBody":{"description":"The new ProcurementFrameworkAgreement resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement-proc_fa.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement-proc_fa.write"}}},"required":true}}},"/api/v1/procurement/framework-agreements/{ulid}":{"get":{"operationId":"api_v1procurementframework-agreements_ulid_get","tags":["ProcurementFrameworkAgreement"],"responses":{"200":{"description":"ProcurementFrameworkAgreement resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement-proc_fa.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement.jsonld-proc_fa.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProcurementFrameworkAgreement resource.","description":"Retrieves a ProcurementFrameworkAgreement resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementFrameworkAgreement identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1procurementframework-agreements_ulid_delete","tags":["ProcurementFrameworkAgreement"],"responses":{"204":{"description":"ProcurementFrameworkAgreement resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProcurementFrameworkAgreement resource.","description":"Removes the ProcurementFrameworkAgreement resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementFrameworkAgreement identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1procurementframework-agreements_ulid_patch","tags":["ProcurementFrameworkAgreement"],"responses":{"200":{"description":"ProcurementFrameworkAgreement resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement-proc_fa.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement.jsonld-proc_fa.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProcurementFrameworkAgreement resource.","description":"Updates the ProcurementFrameworkAgreement resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementFrameworkAgreement identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProcurementFrameworkAgreement resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProcurementFrameworkAgreement-proc_fa.write.jsonMergePatch"}}},"required":true}}},"/api/v1/procurement/purchase-orders":{"get":{"operationId":"api_v1procurementpurchase-orders_get_collection","tags":["ProcurementPurchaseOrder"],"responses":{"200":{"description":"ProcurementPurchaseOrder collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProcurementPurchaseOrder.jsonld-proc_po.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProcurementPurchaseOrder resources.","description":"Retrieves the collection of ProcurementPurchaseOrder resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Bestell-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"supplierRoleId","in":"query","description":"Lieferanten-Rollen-ID (supplier_role.id)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Bestellnummer und Titel","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[poNumber]","in":"query","description":"Sortierung nach Bestellnummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[totalAmount]","in":"query","description":"Sortierung nach Gesamtsumme (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[orderDate]","in":"query","description":"Sortierung nach Bestelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[deliveryDeadline]","in":"query","description":"Sortierung nach Liefertermin (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1procurementpurchase-orders_post","tags":["ProcurementPurchaseOrder"],"responses":{"201":{"description":"ProcurementPurchaseOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProcurementPurchaseOrder resource.","description":"Creates a ProcurementPurchaseOrder resource.","parameters":[],"requestBody":{"description":"The new ProcurementPurchaseOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}}},"required":true}}},"/api/v1/procurement/purchase-orders/{ulid}":{"get":{"operationId":"api_v1procurementpurchase-orders_ulid_get","tags":["ProcurementPurchaseOrder"],"responses":{"200":{"description":"ProcurementPurchaseOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProcurementPurchaseOrder resource.","description":"Retrieves a ProcurementPurchaseOrder resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1procurementpurchase-orders_ulid_delete","tags":["ProcurementPurchaseOrder"],"responses":{"204":{"description":"ProcurementPurchaseOrder resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProcurementPurchaseOrder resource.","description":"Removes the ProcurementPurchaseOrder resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1procurementpurchase-orders_ulid_patch","tags":["ProcurementPurchaseOrder"],"responses":{"200":{"description":"ProcurementPurchaseOrder resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProcurementPurchaseOrder resource.","description":"Updates the ProcurementPurchaseOrder resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProcurementPurchaseOrder resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write.jsonMergePatch"}}},"required":true}}},"/api/v1/procurement/purchase-orders/{ulid}/approve":{"post":{"operationId":"api_v1procurementpurchase-orders_ulidapprove_post","tags":["ProcurementPurchaseOrder"],"responses":{"201":{"description":"ProcurementPurchaseOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Approve purchase order","description":"Approve purchase order. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProcurementPurchaseOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}}},"required":true}}},"/api/v1/procurement/purchase-orders/{ulid}/cancel":{"post":{"operationId":"api_v1procurementpurchase-orders_ulidcancel_post","tags":["ProcurementPurchaseOrder"],"responses":{"201":{"description":"ProcurementPurchaseOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel purchase order","description":"Cancel purchase order. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProcurementPurchaseOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}}},"required":true}}},"/api/v1/procurement/purchase-orders/{ulid}/deliver":{"post":{"operationId":"api_v1procurementpurchase-orders_uliddeliver_post","tags":["ProcurementPurchaseOrder"],"responses":{"201":{"description":"ProcurementPurchaseOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferung zur Bestellung vermerken","description":"Vermerkt die Lieferung zur Bestellung. Ohne ausdrückliches `partial: false` gilt sie als TEILlieferung — der sichere Vorgabewert.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProcurementPurchaseOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}}},"required":true}}},"/api/v1/procurement/purchase-orders/{ulid}/pdf":{"get":{"operationId":"procurement_po_pdf","tags":["ProcurementPurchaseOrder"],"responses":{"204":{"description":"ProcurementPurchaseOrder resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProcurementPurchaseOrder resource.","description":"Retrieves a ProcurementPurchaseOrder resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/procurement/purchase-orders/{ulid}/record-actual":{"post":{"operationId":"api_v1procurementpurchase-orders_ulidrecord-actual_post","tags":["ProcurementPurchaseOrder"],"responses":{"201":{"description":"ProcurementPurchaseOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ist-Kosten auf das Projekt fortschreiben","description":"Schreibt die tatsächlichen Kosten der Bestellung auf das Projekt fort. Verlangt das eigene Kostenzuordnungsrecht.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProcurementPurchaseOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}}},"required":true}}},"/api/v1/procurement/purchase-orders/{ulid}/send":{"post":{"operationId":"api_v1procurementpurchase-orders_ulidsend_post","tags":["ProcurementPurchaseOrder"],"responses":{"201":{"description":"ProcurementPurchaseOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder.jsonld-proc_po.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Send purchase order","description":"Send purchase order. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ProcurementPurchaseOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProcurementPurchaseOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrder-proc_po.write"}}},"required":true}}},"/api/v1/procurement/purchase-order-statuses":{"get":{"operationId":"api_v1procurementpurchase-order-statuses_get_collection","tags":["ProcurementPurchaseOrderStatus"],"responses":{"200":{"description":"ProcurementPurchaseOrderStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus-proc_po_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProcurementPurchaseOrderStatus.jsonld-proc_po_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus.jsonld-proc_po_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProcurementPurchaseOrderStatus resources.","description":"Retrieves the collection of ProcurementPurchaseOrderStatus resources.","parameters":[]},"post":{"operationId":"api_v1procurementpurchase-order-statuses_post","tags":["ProcurementPurchaseOrderStatus"],"responses":{"201":{"description":"ProcurementPurchaseOrderStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus-proc_po_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus.jsonld-proc_po_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProcurementPurchaseOrderStatus resource.","description":"Creates a ProcurementPurchaseOrderStatus resource.","parameters":[],"requestBody":{"description":"The new ProcurementPurchaseOrderStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus-proc_po_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus-proc_po_status.write"}}},"required":true}}},"/api/v1/procurement/purchase-order-statuses/{key}":{"get":{"operationId":"api_v1procurementpurchase-order-statuses_key_get","tags":["ProcurementPurchaseOrderStatus"],"responses":{"200":{"description":"ProcurementPurchaseOrderStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus-proc_po_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus.jsonld-proc_po_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProcurementPurchaseOrderStatus resource.","description":"Retrieves a ProcurementPurchaseOrderStatus resource.","parameters":[{"name":"key","in":"path","description":"ProcurementPurchaseOrderStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1procurementpurchase-order-statuses_key_delete","tags":["ProcurementPurchaseOrderStatus"],"responses":{"204":{"description":"ProcurementPurchaseOrderStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProcurementPurchaseOrderStatus resource.","description":"Removes the ProcurementPurchaseOrderStatus resource.","parameters":[{"name":"key","in":"path","description":"ProcurementPurchaseOrderStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1procurementpurchase-order-statuses_key_patch","tags":["ProcurementPurchaseOrderStatus"],"responses":{"200":{"description":"ProcurementPurchaseOrderStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus-proc_po_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus.jsonld-proc_po_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProcurementPurchaseOrderStatus resource.","description":"Updates the ProcurementPurchaseOrderStatus resource.","parameters":[{"name":"key","in":"path","description":"ProcurementPurchaseOrderStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProcurementPurchaseOrderStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProcurementPurchaseOrderStatus-proc_po_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/procurement/purchase-order-summary":{"get":{"operationId":"api_v1procurementpurchase-order-summary_get_collection","tags":["ProcurementPurchaseOrderSummary"],"responses":{"200":{"description":"ProcurementPurchaseOrderSummary collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementPurchaseOrderSummary-proc_po_summary.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProcurementPurchaseOrderSummary.jsonld-proc_po_summary.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementPurchaseOrderSummary.jsonld-proc_po_summary.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProcurementPurchaseOrderSummary resources.","description":"Retrieves the collection of ProcurementPurchaseOrderSummary resources.","parameters":[{"name":"status","in":"query","description":"Bestell-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"supplierRoleId","in":"query","description":"Lieferanten-Rollen-ID (supplier_role.id)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Bestellnummer und Titel","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/procurement/report":{"get":{"operationId":"api_v1procurementreport_get_collection","tags":["ProcurementReport"],"responses":{"200":{"description":"ProcurementReport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementReport-proc_report.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProcurementReport.jsonld-proc_report.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementReport.jsonld-proc_report.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProcurementReport resources.","description":"Retrieves the collection of ProcurementReport resources.","parameters":[]}},"/api/v1/procurement/supplier-ratings":{"get":{"operationId":"api_v1procurementsupplier-ratings_get_collection","tags":["ProcurementSupplierRating"],"responses":{"200":{"description":"ProcurementSupplierRating collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementSupplierRating-proc_rating.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProcurementSupplierRating.jsonld-proc_rating.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProcurementSupplierRating.jsonld-proc_rating.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProcurementSupplierRating resources.","description":"Retrieves the collection of ProcurementSupplierRating resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"supplierRoleId","in":"query","description":"Lieferanten-Rollen-ID (supplier_role.id)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1procurementsupplier-ratings_post","tags":["ProcurementSupplierRating"],"responses":{"201":{"description":"ProcurementSupplierRating resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementSupplierRating-proc_rating.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementSupplierRating.jsonld-proc_rating.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProcurementSupplierRating resource.","description":"Creates a ProcurementSupplierRating resource.","parameters":[],"requestBody":{"description":"The new ProcurementSupplierRating resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementSupplierRating-proc_rating.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementSupplierRating-proc_rating.write"}}},"required":true}}},"/api/v1/procurement/supplier-ratings/{ulid}":{"get":{"operationId":"api_v1procurementsupplier-ratings_ulid_get","tags":["ProcurementSupplierRating"],"responses":{"200":{"description":"ProcurementSupplierRating resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcurementSupplierRating-proc_rating.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProcurementSupplierRating.jsonld-proc_rating.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProcurementSupplierRating resource.","description":"Retrieves a ProcurementSupplierRating resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementSupplierRating identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1procurementsupplier-ratings_ulid_delete","tags":["ProcurementSupplierRating"],"responses":{"204":{"description":"ProcurementSupplierRating resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProcurementSupplierRating resource.","description":"Removes the ProcurementSupplierRating resource.","parameters":[{"name":"ulid","in":"path","description":"ProcurementSupplierRating identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/products":{"get":{"operationId":"api_v1products_get_collection","tags":["Product"],"responses":{"200":{"description":"Product collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Product-product.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Product.jsonld-product.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Product.jsonld-product.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Product resources.","description":"Retrieves the collection of Product resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"type","in":"query","description":"Produkt-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marke (numerische PK) — zeigt nur Artikel dieser Marke plus den markenlosen Bestand","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"categoryId","in":"query","description":"Leitkategorie-ID (exakter Match, nur Leitkategorie)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"categoryUlid","in":"query","description":"Kategorie-ULID — Artikel, die diese als Leit- ODER Zusatzkategorie tragen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"isOwnProduct","in":"query","description":"Nur Eigenprodukte (true) bzw. Fremdprodukte (false)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Produkte","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"productKind","in":"query","description":"Produktart (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Name und SKU","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"barcode","in":"query","description":"EXAKTER Scanner-Nachschlag über EAN oder Artikelnummer (Doc 25 AP 4.5) — ein Code ist eine Kennung, keine Suche","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[defaultPriceAmount]","in":"query","description":"Sortierung nach Standardpreis (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kundengruppen-Sichtbarkeit: blendet Produkte/Kategorien aus, die für die Gruppen dieses Kunden per Regel verborgen sind (visible=false; Deny gewinnt).","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1products_post","tags":["Product"],"responses":{"201":{"description":"Product resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product-product.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Product.jsonld-product.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Product resource.","description":"Creates a Product resource.","parameters":[],"requestBody":{"description":"The new Product resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product-product.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Product-product.write"}}},"required":true}}},"/api/v1/products/{ulid}":{"get":{"operationId":"api_v1products_ulid_get","tags":["Product"],"responses":{"200":{"description":"Product resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product-product.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Product.jsonld-product.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Product resource.","description":"Retrieves a Product resource.","parameters":[{"name":"ulid","in":"path","description":"Product identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1products_ulid_delete","tags":["Product"],"responses":{"204":{"description":"Product resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Product resource.","description":"Removes the Product resource.","parameters":[{"name":"ulid","in":"path","description":"Product identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1products_ulid_patch","tags":["Product"],"responses":{"200":{"description":"Product resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product-product.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Product.jsonld-product.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Product resource.","description":"Updates the Product resource.","parameters":[{"name":"ulid","in":"path","description":"Product identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Product resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Product-product.write.jsonMergePatch"}}},"required":true}}},"/api/v1/products/bulk":{"post":{"operationId":"api_v1productsbulk_post","tags":["ProductBulkAction"],"responses":{"201":{"description":"ProductBulkAction resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductBulkAction-product_bulk.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductBulkAction.jsonld-product_bulk.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductBulkAction resource.","description":"Creates a ProductBulkAction resource.","parameters":[],"requestBody":{"description":"The new ProductBulkAction resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductBulkAction-product_bulk.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductBulkAction-product_bulk.write"}}},"required":true}}},"/api/v1/product-categories":{"get":{"operationId":"api_v1product-categories_get_collection","tags":["ProductCategory"],"responses":{"200":{"description":"ProductCategory collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductCategory-product_category.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductCategory.jsonld-product_category.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductCategory.jsonld-product_category.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductCategory resources.","description":"Retrieves the collection of ProductCategory resources.","parameters":[{"name":"kind","in":"query","description":"Kategorie-Art (exakter Match, z. B. service | product | license)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parentId","in":"query","description":"Eltern-Kategorie-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Namens-Teilsuche (z. B. für Auswahl-Picker)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1product-categories_post","tags":["ProductCategory"],"responses":{"201":{"description":"ProductCategory resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductCategory.jsonld-product_category.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductCategory resource.","description":"Creates a ProductCategory resource.","parameters":[],"requestBody":{"description":"The new ProductCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.write"}}},"required":true}}},"/api/v1/product-categories/{ulid}":{"get":{"operationId":"api_v1product-categories_ulid_get","tags":["ProductCategory"],"responses":{"200":{"description":"ProductCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductCategory.jsonld-product_category.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProductCategory resource.","description":"Retrieves a ProductCategory resource.","parameters":[{"name":"ulid","in":"path","description":"ProductCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1product-categories_ulid_delete","tags":["ProductCategory"],"responses":{"204":{"description":"ProductCategory resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProductCategory resource.","description":"Removes the ProductCategory resource.","parameters":[{"name":"ulid","in":"path","description":"ProductCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1product-categories_ulid_patch","tags":["ProductCategory"],"responses":{"200":{"description":"ProductCategory resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductCategory.jsonld-product_category.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProductCategory resource.","description":"Updates the ProductCategory resource.","parameters":[{"name":"ulid","in":"path","description":"ProductCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProductCategory resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.write.jsonMergePatch"}}},"required":true}}},"/api/v1/product-categories/{ulid}/move":{"post":{"operationId":"product_category_move","tags":["ProductCategory"],"responses":{"201":{"description":"ProductCategory resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductCategory.jsonld-product_category.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Move product category","description":"Move product category. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ProductCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProductCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.move"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductCategory-product_category.move"}}},"required":true}}},"/api/v1/product-customer-prices":{"get":{"operationId":"api_v1product-customer-prices_get_collection","tags":["ProductCustomerPrice"],"responses":{"200":{"description":"ProductCustomerPrice collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductCustomerPrice-product_customer_price.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductCustomerPrice.jsonld-product_customer_price.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductCustomerPrice.jsonld-product_customer_price.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductCustomerPrice resources.","description":"Retrieves the collection of ProductCustomerPrice resources.","parameters":[{"name":"productId","in":"query","description":"Artikel-Id (Pflicht) — Konditionen mit scope=product und refId=productId","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/warehouses/{warehouseUlid}/default-bins":{"get":{"operationId":"api_v1warehouses_warehouseUliddefault-bins_get_collection","tags":["ProductDefaultBin"],"responses":{"200":{"description":"ProductDefaultBin collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductDefaultBin-product_default_bin.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductDefaultBin.jsonld-product_default_bin.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductDefaultBin.jsonld-product_default_bin.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductDefaultBin resources.","description":"Retrieves the collection of ProductDefaultBin resources.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Nur die Vorgabeplätze dieses Artikels","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1warehouses_warehouseUliddefault-bins_post","tags":["ProductDefaultBin"],"responses":{"201":{"description":"ProductDefaultBin resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDefaultBin-product_default_bin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductDefaultBin.jsonld-product_default_bin.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vorgabeplatz für einen Artikel anlegen","description":"Legt einen festen Vorgabeplatz für einen Artikel in diesem Lager an; mehrere je Artikel sind zulässig.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProductDefaultBin resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDefaultBin-product_default_bin.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductDefaultBin-product_default_bin.write"}}},"required":true}}},"/api/v1/warehouses/{warehouseUlid}/default-bins/{ulid}":{"delete":{"operationId":"api_v1warehouses_warehouseUliddefault-bins_ulid_delete","tags":["ProductDefaultBin"],"responses":{"204":{"description":"ProductDefaultBin resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProductDefaultBin resource.","description":"Removes the ProductDefaultBin resource.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ulid","in":"path","description":"ProductDefaultBin identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1warehouses_warehouseUliddefault-bins_ulid_patch","tags":["ProductDefaultBin"],"responses":{"200":{"description":"ProductDefaultBin resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDefaultBin-product_default_bin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductDefaultBin.jsonld-product_default_bin.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProductDefaultBin resource.","description":"Updates the ProductDefaultBin resource.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ulid","in":"path","description":"ProductDefaultBin identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProductDefaultBin resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProductDefaultBin-product_default_bin.write.jsonMergePatch"}}},"required":true}}},"/api/v1/product-delivery-times":{"get":{"operationId":"api_v1product-delivery-times_get_collection","tags":["ProductDeliveryTime"],"responses":{"200":{"description":"ProductDeliveryTime collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductDeliveryTime-product_delivery_time.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductDeliveryTime.jsonld-product_delivery_time.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductDeliveryTime.jsonld-product_delivery_time.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductDeliveryTime resources.","description":"Retrieves the collection of ProductDeliveryTime resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Lieferzeit-Stufen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]}},"/api/v1/products/duplicate":{"post":{"operationId":"api_v1productsduplicate_post","tags":["ProductDuplicate"],"responses":{"201":{"description":"ProductDuplicate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDuplicate-product_duplicate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductDuplicate.jsonld-product_duplicate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductDuplicate resource.","description":"Creates a ProductDuplicate resource.","parameters":[],"requestBody":{"description":"The new ProductDuplicate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDuplicate-product_duplicate.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductDuplicate-product_duplicate.write"}}},"required":true}}},"/api/v1/product-group-price-rules":{"get":{"operationId":"api_v1product-group-price-rules_get_collection","tags":["ProductGroupPriceRule"],"responses":{"200":{"description":"ProductGroupPriceRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductGroupPriceRule-product_group_price_rule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductGroupPriceRule.jsonld-product_group_price_rule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductGroupPriceRule.jsonld-product_group_price_rule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductGroupPriceRule resources.","description":"Retrieves the collection of ProductGroupPriceRule resources.","parameters":[{"name":"productId","in":"query","description":"Artikel-Id (Pflicht) — Regeln mit scope=product und refId=productId","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/products/import":{"post":{"operationId":"api_v1productsimport_post","tags":["ProductImport"],"responses":{"201":{"description":"ProductImport resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductImport-product_import.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductImport.jsonld-product_import.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductImport resource.","description":"Creates a ProductImport resource.","parameters":[],"requestBody":{"description":"The new ProductImport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductImport-product_import.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductImport-product_import.write"}}},"required":true}}},"/api/v1/product-manufacturers":{"get":{"operationId":"api_v1product-manufacturers_get_collection","tags":["ProductManufacturer"],"responses":{"200":{"description":"ProductManufacturer collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductManufacturer-product_manufacturer.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductManufacturer.jsonld-product_manufacturer.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductManufacturer.jsonld-product_manufacturer.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductManufacturer resources.","description":"Retrieves the collection of ProductManufacturer resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Hersteller","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Code","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1product-manufacturers_post","tags":["ProductManufacturer"],"responses":{"201":{"description":"ProductManufacturer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer-product_manufacturer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer.jsonld-product_manufacturer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductManufacturer resource.","description":"Creates a ProductManufacturer resource.","parameters":[],"requestBody":{"description":"The new ProductManufacturer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer-product_manufacturer.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer-product_manufacturer.write"}}},"required":true}}},"/api/v1/product-manufacturers/{ulid}":{"get":{"operationId":"api_v1product-manufacturers_ulid_get","tags":["ProductManufacturer"],"responses":{"200":{"description":"ProductManufacturer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer-product_manufacturer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer.jsonld-product_manufacturer.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProductManufacturer resource.","description":"Retrieves a ProductManufacturer resource.","parameters":[{"name":"ulid","in":"path","description":"ProductManufacturer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1product-manufacturers_ulid_delete","tags":["ProductManufacturer"],"responses":{"204":{"description":"ProductManufacturer resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProductManufacturer resource.","description":"Removes the ProductManufacturer resource.","parameters":[{"name":"ulid","in":"path","description":"ProductManufacturer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1product-manufacturers_ulid_patch","tags":["ProductManufacturer"],"responses":{"200":{"description":"ProductManufacturer resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer-product_manufacturer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer.jsonld-product_manufacturer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProductManufacturer resource.","description":"Updates the ProductManufacturer resource.","parameters":[{"name":"ulid","in":"path","description":"ProductManufacturer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProductManufacturer resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProductManufacturer-product_manufacturer.write.jsonMergePatch"}}},"required":true}}},"/api/v1/product-packagings":{"get":{"operationId":"api_v1product-packagings_get_collection","tags":["ProductPackaging"],"responses":{"200":{"description":"ProductPackaging collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductPackaging-uom_packaging.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductPackaging.jsonld-uom_packaging.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductPackaging.jsonld-uom_packaging.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductPackaging resources.","description":"Retrieves the collection of ProductPackaging resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Produkt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"role","in":"query","description":"Gebinde-Rolle (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1product-packagings_post","tags":["ProductPackaging"],"responses":{"201":{"description":"ProductPackaging resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPackaging-uom_packaging.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductPackaging.jsonld-uom_packaging.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductPackaging resource.","description":"Creates a ProductPackaging resource.","parameters":[],"requestBody":{"description":"The new ProductPackaging resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPackaging-uom_packaging.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductPackaging-uom_packaging.write"}}},"required":true}}},"/api/v1/product-packagings/{ulid}":{"delete":{"operationId":"api_v1product-packagings_ulid_delete","tags":["ProductPackaging"],"responses":{"204":{"description":"ProductPackaging resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProductPackaging resource.","description":"Removes the ProductPackaging resource.","parameters":[{"name":"ulid","in":"path","description":"ProductPackaging identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1product-packagings_ulid_patch","tags":["ProductPackaging"],"responses":{"200":{"description":"ProductPackaging resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPackaging-uom_packaging.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductPackaging.jsonld-uom_packaging.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProductPackaging resource.","description":"Updates the ProductPackaging resource.","parameters":[{"name":"ulid","in":"path","description":"ProductPackaging identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProductPackaging resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProductPackaging-uom_packaging.write.jsonMergePatch"}}},"required":true}}},"/api/v1/product-property-groups":{"get":{"operationId":"api_v1product-property-groups_get_collection","tags":["ProductPropertyGroup"],"responses":{"200":{"description":"ProductPropertyGroup collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductPropertyGroup-product_property_group.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductPropertyGroup.jsonld-product_property_group.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductPropertyGroup.jsonld-product_property_group.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductPropertyGroup resources.","description":"Retrieves the collection of ProductPropertyGroup resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Gruppen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"variantForming","in":"query","description":"Nur variantenbildende (true) bzw. nicht variantenbildende (false) Gruppen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Code","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1product-property-groups_post","tags":["ProductPropertyGroup"],"responses":{"201":{"description":"ProductPropertyGroup resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup-product_property_group.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup.jsonld-product_property_group.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductPropertyGroup resource.","description":"Creates a ProductPropertyGroup resource.","parameters":[],"requestBody":{"description":"The new ProductPropertyGroup resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup-product_property_group.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup-product_property_group.write"}}},"required":true}}},"/api/v1/product-property-groups/{ulid}":{"get":{"operationId":"api_v1product-property-groups_ulid_get","tags":["ProductPropertyGroup"],"responses":{"200":{"description":"ProductPropertyGroup resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup-product_property_group.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup.jsonld-product_property_group.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProductPropertyGroup resource.","description":"Retrieves a ProductPropertyGroup resource.","parameters":[{"name":"ulid","in":"path","description":"ProductPropertyGroup identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1product-property-groups_ulid_delete","tags":["ProductPropertyGroup"],"responses":{"204":{"description":"ProductPropertyGroup resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProductPropertyGroup resource.","description":"Removes the ProductPropertyGroup resource.","parameters":[{"name":"ulid","in":"path","description":"ProductPropertyGroup identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1product-property-groups_ulid_patch","tags":["ProductPropertyGroup"],"responses":{"200":{"description":"ProductPropertyGroup resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup-product_property_group.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup.jsonld-product_property_group.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProductPropertyGroup resource.","description":"Updates the ProductPropertyGroup resource.","parameters":[{"name":"ulid","in":"path","description":"ProductPropertyGroup identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProductPropertyGroup resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProductPropertyGroup-product_property_group.write.jsonMergePatch"}}},"required":true}}},"/api/v1/product-stock":{"get":{"operationId":"api_v1product-stock_get_collection","tags":["ProductStock"],"responses":{"200":{"description":"ProductStock collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductStock-product_stock.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductStock.jsonld-product_stock.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductStock.jsonld-product_stock.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductStock resources.","description":"Retrieves the collection of ProductStock resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"belowReorder","in":"query","description":"true → nur Bestände unter Meldebestand","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"onlyUnvalued","in":"query","description":"true → nur Artikel mit Bestand, aber ohne bekannten Einstandspreis (derselbe Schnitt wie `unvaluedProducts` in /v1/product-stock-value)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Name und SKU","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/product-stock/{productUlid}":{"get":{"operationId":"api_v1product-stock_productUlid_get","tags":["ProductStock"],"responses":{"200":{"description":"ProductStock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductStock-product_stock.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductStock.jsonld-product_stock.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProductStock resource.","description":"Retrieves a ProductStock resource.","parameters":[{"name":"productUlid","in":"path","description":"ProductStock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1product-stock_productUlid_patch","tags":["ProductStock"],"responses":{"200":{"description":"ProductStock resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductStock-product_stock.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductStock.jsonld-product_stock.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProductStock resource.","description":"Updates the ProductStock resource.","parameters":[{"name":"productUlid","in":"path","description":"ProductStock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProductStock resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProductStock-product_stock.write.jsonMergePatch"}}},"required":true}}},"/api/v1/product-stock/{productUlid}/adjust":{"post":{"operationId":"product_stock_adjust","tags":["ProductStock"],"responses":{"201":{"description":"ProductStock resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductStock-product_stock.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductStock.jsonld-product_stock.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bestand korrigieren","description":"Korrigiert den Bestand des Artikels und schreibt die Bewegung in das append-only Bestandsjournal (Herkunft `manual`). Ein Negativ-Bestand wird abgewiesen (409), solange er nicht ausdrücklich erlaubt ist.","parameters":[{"name":"productUlid","in":"path","description":"ProductStock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProductStock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductStock-product_stock.adjust"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductStock-product_stock.adjust"}}},"required":true}}},"/api/v1/product-stock-value":{"get":{"operationId":"product_stock_value_report","tags":["ProductStockValue"],"responses":{"200":{"description":"ProductStockValue resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductStockValue-stock_value.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductStockValue.jsonld-stock_value.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProductStockValue resource.","description":"Bestandswert nach gleitendem Durchschnitt: Gesamtsumme, Zeilen je Artikel und — ausdrücklich — die Zahl der Artikel ohne bekannten Einstandspreis.","parameters":[{"name":"categoryId","in":"query","description":"Nur Artikel dieser Kategorie","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"onlyUnvalued","in":"query","description":"true → nur Artikel mit Bestand, aber ohne bekannten Einstandspreis","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"limit","in":"query","description":"Anzahl der Einzelzeilen (Default 100); die Summen bleiben davon unberührt","required":false,"deprecated":false,"schema":{"type":"integer","maximum":500},"style":"form","explode":true}]}},"/api/v1/product-variants":{"get":{"operationId":"api_v1product-variants_get_collection","tags":["ProductVariant"],"responses":{"200":{"description":"ProductVariant collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductVariant-product_variant.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductVariant.jsonld-product_variant.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductVariant.jsonld-product_variant.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductVariant resources.","description":"Retrieves the collection of ProductVariant resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Produkt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1product-variants_post","tags":["ProductVariant"],"responses":{"201":{"description":"ProductVariant resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVariant-product_variant.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVariant.jsonld-product_variant.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductVariant resource.","description":"Creates a ProductVariant resource.","parameters":[],"requestBody":{"description":"The new ProductVariant resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVariant-product_variant.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVariant-product_variant.write"}}},"required":true}}},"/api/v1/product-variants/{ulid}":{"get":{"operationId":"api_v1product-variants_ulid_get","tags":["ProductVariant"],"responses":{"200":{"description":"ProductVariant resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVariant-product_variant.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVariant.jsonld-product_variant.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProductVariant resource.","description":"Retrieves a ProductVariant resource.","parameters":[{"name":"ulid","in":"path","description":"ProductVariant identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1product-variants_ulid_delete","tags":["ProductVariant"],"responses":{"204":{"description":"ProductVariant resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProductVariant resource.","description":"Removes the ProductVariant resource.","parameters":[{"name":"ulid","in":"path","description":"ProductVariant identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1product-variants_ulid_patch","tags":["ProductVariant"],"responses":{"200":{"description":"ProductVariant resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVariant-product_variant.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVariant.jsonld-product_variant.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProductVariant resource.","description":"Updates the ProductVariant resource.","parameters":[{"name":"ulid","in":"path","description":"ProductVariant identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProductVariant resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProductVariant-product_variant.write.jsonMergePatch"}}},"required":true}}},"/api/v1/products/{ulid}/generate-variants":{"post":{"operationId":"product_generate_variants","tags":["ProductVariantGeneration"],"responses":{"201":{"description":"ProductVariantGeneration resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVariantGeneration-product_variant_generation.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVariantGeneration.jsonld-product_variant_generation.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Varianten aus den Achsen erzeugen","description":"Spannt aus den Achsen des Variantensets das kartesische Produkt der aktiven Optionen auf und legt fehlende Varianten idempotent an. Ein Rumpf ist nicht nötig.","parameters":[{"name":"ulid","in":"path","description":"ProductVariantGeneration identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProductVariantGeneration resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVariantGeneration"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVariantGeneration"}}},"required":true}}},"/api/v1/product-versions":{"get":{"operationId":"api_v1product-versions_get_collection","tags":["ProductVersion"],"responses":{"200":{"description":"ProductVersion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductVersion-product_version.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductVersion.jsonld-product_version.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductVersion.jsonld-product_version.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductVersion resources.","description":"Retrieves the collection of ProductVersion resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Produkt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1product-versions_post","tags":["ProductVersion"],"responses":{"201":{"description":"ProductVersion resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVersion-product_version.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVersion.jsonld-product_version.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProductVersion resource.","description":"Creates a ProductVersion resource.","parameters":[],"requestBody":{"description":"The new ProductVersion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVersion-product_version.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVersion-product_version.write"}}},"required":true}}},"/api/v1/product-versions/{ulid}":{"get":{"operationId":"api_v1product-versions_ulid_get","tags":["ProductVersion"],"responses":{"200":{"description":"ProductVersion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVersion-product_version.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVersion.jsonld-product_version.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProductVersion resource.","description":"Retrieves a ProductVersion resource.","parameters":[{"name":"ulid","in":"path","description":"ProductVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1product-versions_ulid_delete","tags":["ProductVersion"],"responses":{"204":{"description":"ProductVersion resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProductVersion resource.","description":"Removes the ProductVersion resource.","parameters":[{"name":"ulid","in":"path","description":"ProductVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1product-versions_ulid_patch","tags":["ProductVersion"],"responses":{"200":{"description":"ProductVersion resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVersion-product_version.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductVersion.jsonld-product_version.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProductVersion resource.","description":"Updates the ProductVersion resource.","parameters":[{"name":"ulid","in":"path","description":"ProductVersion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProductVersion resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProductVersion-product_version.write.jsonMergePatch"}}},"required":true}}},"/api/v1/manufacturing/production-orders":{"get":{"operationId":"api_v1manufacturingproduction-orders_get_collection","tags":["ProductionOrder"],"responses":{"200":{"description":"ProductionOrder collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductionOrder-production_order.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProductionOrder.jsonld-production_order.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProductionOrder.jsonld-production_order.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProductionOrder resources.","description":"Retrieves the collection of ProductionOrder resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Nur Datensätze dieser Marke (Marken-Umschalter der Oberfläche)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match): planned|released|in_progress|completed|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"open","in":"query","description":"Nur offene Aufträge (true) — alles außer fertiggemeldet/abgebrochen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"productId","in":"query","description":"Nur Aufträge für dieses Erzeugnis","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über die Auftragsnummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[number]","in":"query","description":"Sortierung nach Auftragsnummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[plannedEndAt]","in":"query","description":"Sortierung nach geplantem Ende (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1manufacturingproduction-orders_post","tags":["ProductionOrder"],"responses":{"201":{"description":"ProductionOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder.jsonld-production_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Fertigungsauftrag anlegen","description":"Pflicht sind `productId` und `qtyPlanned`. Der Materialbedarf entsteht aus der AKTIVEN Stückliste des Erzeugnisses und wird eingefroren — inklusive Ausschuss-Aufschlag, Bewertung und Versions-Schnappschuss. Ohne freigegebene Stückliste: 422.","parameters":[],"requestBody":{"description":"The new ProductionOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}}},"required":true}}},"/api/v1/manufacturing/production-orders/{ulid}":{"get":{"operationId":"api_v1manufacturingproduction-orders_ulid_get","tags":["ProductionOrder"],"responses":{"200":{"description":"ProductionOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder.jsonld-production_order.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProductionOrder resource.","description":"Retrieves a ProductionOrder resource.","parameters":[{"name":"ulid","in":"path","description":"ProductionOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/manufacturing/production-orders/{ulid}/cancel":{"post":{"operationId":"manufacturing_order_cancel","tags":["ProductionOrder"],"responses":{"201":{"description":"ProductionOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder.jsonld-production_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Abbrechen","description":"Gibt Rest-Reservierungen frei. Bereits entnommenes Material bleibt entnommen — eine automatische Rückbuchung würde Bestand erfinden, den niemand gezählt hat.","parameters":[{"name":"ulid","in":"path","description":"ProductionOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProductionOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}}},"required":true}}},"/api/v1/manufacturing/production-orders/{ulid}/complete":{"post":{"operationId":"manufacturing_order_complete","tags":["ProductionOrder"],"responses":{"201":{"description":"ProductionOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder.jsonld-production_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Fertig melden","description":"Payload `{qtyProduced, qtyScrapped?, outputBatchRef?, outputExpiresAt?, outputSerialRefs?, consumeRemaining?}`. Bucht das Erzeugnis zu — bewertet mit den tatsächlichen Materialkosten je gutgemeldetem Stück — und gibt Rest-Reservierungen frei. Ausschuss wird NICHT zugebucht. `consumeRemaining: true` entnimmt vorher den offenen Sollbedarf (Rückwärtsentnahme). Ohne jede Entnahme: 422.","parameters":[{"name":"ulid","in":"path","description":"ProductionOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProductionOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}}},"required":true}}},"/api/v1/manufacturing/production-orders/{ulid}/consume":{"post":{"operationId":"manufacturing_order_consume","tags":["ProductionOrder"],"responses":{"201":{"description":"ProductionOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder.jsonld-production_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Material entnehmen","description":"Payload `{lines: [{materialUlid, qty, batchRef?, serialRefs?}]}`. Bucht den Bestand ab (`sourceRef` `production_order:<id>`) und schreibt die Ist-Kosten mit dem Bewertungspreis DIESES Moments fort. Mehr als der offene Bedarf wird abgewiesen. Bei chargengeführtem Material wählt ohne `batchRef` die FEFO-Regel.","parameters":[{"name":"ulid","in":"path","description":"ProductionOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProductionOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}}},"required":true}}},"/api/v1/manufacturing/production-orders/{ulid}/release":{"post":{"operationId":"manufacturing_order_release","tags":["ProductionOrder"],"responses":{"201":{"description":"ProductionOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder.jsonld-production_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Freigeben — Material reservieren","description":"Reserviert den Materialbedarf. Einstellung `manufacturing.release.shortage_mode`: `partial` reserviert, was verfügbar ist (Default; die Differenz ist die Fehlteil-Liste), `strict` weist die Freigabe bei jeder Unterdeckung ab (409).","parameters":[{"name":"ulid","in":"path","description":"ProductionOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProductionOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProductionOrder-production_order.write"}}},"required":true}}},"/api/v1/projects":{"get":{"operationId":"api_v1projects_get_collection","tags":["Project"],"responses":{"200":{"description":"Project collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Project-project.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Project.jsonld-project.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Project.jsonld-project.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Project resources.","description":"Retrieves the collection of Project resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID (numerische PK); Mehrfachauswahl komma-getrennt (z.B. 3,7)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"type","in":"query","description":"Projekttyp; Mehrfachauswahl komma-getrennt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"statusId","in":"query","description":"Projektstatus-ID; Mehrfachauswahl komma-getrennt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"statusCategory","in":"query","description":"Status-Lebenszyklus-Kategorie (open|active|done|cancelled); Mehrfachauswahl komma-getrennt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"showDone","in":"query","description":"false blendet abgeschlossene/abgebrochene Projekte aus (Kategorie done|cancelled); ohne Parameter bleiben sie sichtbar. Explizite Status-/Kategorie-Filter gewinnen.","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"health","in":"query","description":"Budget-Ampel; Mehrfachauswahl komma-getrennt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"mine","in":"query","description":"Nur Projekte, in denen der angemeldete Nutzer Mitglied ist","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"search","in":"query","description":"Volltextsuche über Name und Code","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Alias zu search (nur wirksam, wenn search fehlt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach Änderungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[code]","in":"query","description":"Sortierung nach Code (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[dueAt]","in":"query","description":"Sortierung nach Fälligkeit (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[budgetAmount]","in":"query","description":"Sortierung nach Budget (asc|desc) — nur mit Budget-Sicht-Recht, sonst Fallback auf createdAt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1projects_post","tags":["Project"],"responses":{"201":{"description":"Project resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project.jsonld-project.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Project resource.","description":"Creates a Project resource.","parameters":[],"requestBody":{"description":"The new Project resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}}},"required":true}}},"/api/v1/projects/from-quote":{"post":{"operationId":"project_from_quote","tags":["Project"],"responses":{"201":{"description":"Project resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project.jsonld-project.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Create project from a quote","description":"Create project from a quote. Dedicated action endpoint — not a standard CRUD create.","parameters":[],"requestBody":{"description":"The new Project resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}}},"required":true}}},"/api/v1/projects/from-template":{"post":{"operationId":"project_from_template","tags":["Project"],"responses":{"201":{"description":"Project resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project.jsonld-project.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Project resource.","description":"Creates a Project resource.","parameters":[],"requestBody":{"description":"The new Project resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}}},"required":true}}},"/api/v1/projects/{ulid}":{"get":{"operationId":"api_v1projects_ulid_get","tags":["Project"],"responses":{"200":{"description":"Project resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project.jsonld-project.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Project resource.","description":"Retrieves a Project resource.","parameters":[{"name":"ulid","in":"path","description":"Project identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1projects_ulid_delete","tags":["Project"],"responses":{"204":{"description":"Project resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Project resource.","description":"Removes the Project resource.","parameters":[{"name":"ulid","in":"path","description":"Project identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1projects_ulid_patch","tags":["Project"],"responses":{"200":{"description":"Project resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project.jsonld-project.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Project resource.","description":"Updates the Project resource.","parameters":[{"name":"ulid","in":"path","description":"Project identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Project resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Project-project.write.jsonMergePatch"}}},"required":true}}},"/api/v1/projects/{ulid}/as-template":{"post":{"operationId":"project_to_template","tags":["Project"],"responses":{"201":{"description":"Project resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project.jsonld-project.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Projekt als Vorlage sichern","description":"Legt aus dem Projekt eine Projektvorlage an. Verlangt das Konfigurationsrecht.","parameters":[{"name":"ulid","in":"path","description":"Project identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Project resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}}},"required":true}}},"/api/v1/projects/{ulid}/duplicate":{"post":{"operationId":"project_duplicate","tags":["Project"],"responses":{"201":{"description":"Project resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project.jsonld-project.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Projekt kopieren","description":"Legt eine Kopie des Projekts an.","parameters":[{"name":"ulid","in":"path","description":"Project identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Project resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Project-project.write"}}},"required":true}}},"/api/v1/project-acceptances":{"get":{"operationId":"api_v1project-acceptances_get_collection","tags":["ProjectAcceptance"],"responses":{"200":{"description":"ProjectAcceptance collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectAcceptance-acceptance.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectAcceptance.jsonld-acceptance.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectAcceptance.jsonld-acceptance.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectAcceptance resources.","description":"Retrieves the collection of ProjectAcceptance resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectUlid","in":"query","description":"Projekt-ULID","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status (pending/approved/rejected/changes_requested)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/project-milestones/{ulid}/request-acceptance":{"post":{"operationId":"api_v1project-milestones_ulidrequest-acceptance_post","tags":["ProjectAcceptance"],"responses":{"201":{"description":"ProjectAcceptance resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAcceptance-acceptance.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAcceptance.jsonld-acceptance.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kundenabnahme des Meilensteins anfordern","description":"Fordert die Abnahme durch den Kunden an: legt sie als `pending` an und benachrichtigt das Portal. Nimmt nur `kind=customer`.","parameters":[{"name":"ulid","in":"path","description":"ProjectAcceptance identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProjectAcceptance resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAcceptance-acceptance.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAcceptance-acceptance.write"}}},"required":true}}},"/api/v1/projects/{ulid}/request-acceptance":{"post":{"operationId":"api_v1projects_ulidrequest-acceptance_post","tags":["ProjectAcceptance"],"responses":{"201":{"description":"ProjectAcceptance resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAcceptance-acceptance.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAcceptance.jsonld-acceptance.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kundenabnahme des Projekts anfordern","description":"Fordert die Abnahme des Projekts durch den Kunden an: legt sie als `pending` an und benachrichtigt das Portal. Nimmt nur `kind=customer`.","parameters":[{"name":"ulid","in":"path","description":"ProjectAcceptance identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProjectAcceptance resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAcceptance-acceptance.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAcceptance-acceptance.write"}}},"required":true}}},"/api/v1/project-activity":{"get":{"operationId":"api_v1project-activity_get_collection","tags":["ProjectActivity"],"responses":{"200":{"description":"ProjectActivity collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectActivity-project_activity.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectActivity.jsonld-project_activity.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectActivity.jsonld-project_activity.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectActivity resources.","description":"Retrieves the collection of ProjectActivity resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"itemsPerPage","in":"query","description":"The number of items per page","required":false,"deprecated":false,"schema":{"type":"integer","default":30,"minimum":0,"maximum":100},"style":"form","explode":true},{"name":"projectUlid","in":"query","description":"Projekt-ULID. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[occurredAt]","in":"query","description":"Sortierung nach Zeitpunkt (asc|desc, Default desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/projects/{projectUlid}/ai/risk-scan":{"post":{"operationId":"api_v1projects_projectUlidairisk-scan_post","tags":["ProjectAi"],"responses":{"201":{"description":"ProjectAi resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAi.jsonld-projectai.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verzugs- und Risikosignale erkennen","description":"Erkennt Verzugs-/Risiko-Signale und ordnet sie ein; `createRisk` legt daraus ein Projekt-Risiko an (verlangt projects.project.edit).","parameters":[{"name":"projectUlid","in":"path","description":"ProjectAi identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProjectAi resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.write"}}},"required":true}}},"/api/v1/projects/{projectUlid}/ai/status-summary":{"post":{"operationId":"api_v1projects_projectUlidaistatus-summary_post","tags":["ProjectAi"],"responses":{"201":{"description":"ProjectAi resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAi.jsonld-projectai.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Statusbericht erzeugen","description":"Erzeugt einen Statusbericht zum Projekt.","parameters":[{"name":"projectUlid","in":"path","description":"ProjectAi identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProjectAi resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.write"}}},"required":true}}},"/api/v1/projects/{projectUlid}/ai/task-breakdown":{"post":{"operationId":"api_v1projects_projectUlidaitask-breakdown_post","tags":["ProjectAi"],"responses":{"201":{"description":"ProjectAi resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAi.jsonld-projectai.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Aufgaben-Vorschlag aus einem Briefing","description":"Schlägt Aufgaben aus einem Briefing vor (Vorschau, legt nichts an).","parameters":[{"name":"projectUlid","in":"path","description":"ProjectAi identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProjectAi resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.write"}}},"required":true}}},"/api/v1/projects/{projectUlid}/ai/task-breakdown/apply":{"post":{"operationId":"api_v1projects_projectUlidaitask-breakdownapply_post","tags":["ProjectAi"],"responses":{"201":{"description":"ProjectAi resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAi.jsonld-projectai.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Aufgaben-Vorschläge übernehmen","description":"Legt die übergebenen Aufgaben-Vorschläge als Aufgaben des Projekts an.","parameters":[{"name":"projectUlid","in":"path","description":"ProjectAi identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ProjectAi resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAi-projectai.write"}}},"required":true}}},"/api/v1/projects/{projectUlid}/autopilot":{"get":{"operationId":"api_v1projects_projectUlidautopilot_get","tags":["ProjectAutopilot"],"responses":{"200":{"description":"ProjectAutopilot resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAutopilot-projectautopilot.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAutopilot.jsonld-projectautopilot.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectAutopilot resource.","description":"Retrieves a ProjectAutopilot resource.","parameters":[{"name":"projectUlid","in":"path","description":"ProjectAutopilot identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1projects_projectUlidautopilot_patch","tags":["ProjectAutopilot"],"responses":{"200":{"description":"ProjectAutopilot resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAutopilot-projectautopilot.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectAutopilot.jsonld-projectautopilot.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Autopilot-Einstellungen ändern","description":"Ändert die Autopilot-Einstellungen des Projekts. Wirkt ausschließlich auf Benachrichtigungen — nie auf Status oder Termine.","parameters":[{"name":"projectUlid","in":"path","description":"ProjectAutopilot identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProjectAutopilot resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProjectAutopilot-projectautopilot.write.jsonMergePatch"}}},"required":true}}},"/api/v1/projects/{projectUlid}/gantt":{"get":{"operationId":"api_v1projects_projectUlidgantt_get","tags":["ProjectGantt"],"responses":{"200":{"description":"ProjectGantt resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectGantt-projectgantt.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectGantt.jsonld-projectgantt.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectGantt resource.","description":"Balken (Aufgaben mit Start/Ende), Kanten (Abhängigkeiten) und Meilensteine eines Projekts für die Zeitachse.","parameters":[{"name":"projectUlid","in":"path","description":"ProjectGantt identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/project-members":{"get":{"operationId":"api_v1project-members_get_collection","tags":["ProjectMember"],"responses":{"200":{"description":"ProjectMember collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectMember-projectmember.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectMember.jsonld-projectmember.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectMember.jsonld-projectmember.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectMember resources.","description":"Retrieves the collection of ProjectMember resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1project-members_post","tags":["ProjectMember"],"responses":{"201":{"description":"ProjectMember resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMember-projectmember.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectMember.jsonld-projectmember.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProjectMember resource.","description":"Creates a ProjectMember resource.","parameters":[],"requestBody":{"description":"The new ProjectMember resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMember-projectmember.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectMember-projectmember.write"}}},"required":true}}},"/api/v1/project-members/{id}":{"get":{"operationId":"api_v1project-members_id_get","tags":["ProjectMember"],"responses":{"200":{"description":"ProjectMember resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMember-projectmember.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectMember.jsonld-projectmember.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectMember resource.","description":"Retrieves a ProjectMember resource.","parameters":[{"name":"id","in":"path","description":"ProjectMember identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1project-members_id_delete","tags":["ProjectMember"],"responses":{"204":{"description":"ProjectMember resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProjectMember resource.","description":"Removes the ProjectMember resource.","parameters":[{"name":"id","in":"path","description":"ProjectMember identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1project-members_id_patch","tags":["ProjectMember"],"responses":{"200":{"description":"ProjectMember resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMember-projectmember.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectMember.jsonld-projectmember.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProjectMember resource.","description":"Updates the ProjectMember resource.","parameters":[{"name":"id","in":"path","description":"ProjectMember identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProjectMember resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProjectMember-projectmember.write.jsonMergePatch"}}},"required":true}}},"/api/v1/project-risks":{"get":{"operationId":"api_v1project-risks_get_collection","tags":["ProjectRisk"],"responses":{"200":{"description":"ProjectRisk collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectRisk-projectrisk.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectRisk.jsonld-projectrisk.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectRisk.jsonld-projectrisk.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectRisk resources.","description":"Retrieves the collection of ProjectRisk resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectUlid","in":"query","description":"Projekt-ULID — nur Risiken dieses Projekts; unbekannte/unzugängliche ULIDs liefern eine leere Collection","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"type","in":"query","description":"Risiko-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1project-risks_post","tags":["ProjectRisk"],"responses":{"201":{"description":"ProjectRisk resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectRisk-projectrisk.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectRisk.jsonld-projectrisk.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProjectRisk resource.","description":"Creates a ProjectRisk resource.","parameters":[],"requestBody":{"description":"The new ProjectRisk resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectRisk-projectrisk.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectRisk-projectrisk.write"}}},"required":true}}},"/api/v1/project-risks/{ulid}":{"get":{"operationId":"api_v1project-risks_ulid_get","tags":["ProjectRisk"],"responses":{"200":{"description":"ProjectRisk resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectRisk-projectrisk.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectRisk.jsonld-projectrisk.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectRisk resource.","description":"Retrieves a ProjectRisk resource.","parameters":[{"name":"ulid","in":"path","description":"ProjectRisk identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1project-risks_ulid_delete","tags":["ProjectRisk"],"responses":{"204":{"description":"ProjectRisk resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProjectRisk resource.","description":"Removes the ProjectRisk resource.","parameters":[{"name":"ulid","in":"path","description":"ProjectRisk identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1project-risks_ulid_patch","tags":["ProjectRisk"],"responses":{"200":{"description":"ProjectRisk resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectRisk-projectrisk.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectRisk.jsonld-projectrisk.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProjectRisk resource.","description":"Updates the ProjectRisk resource.","parameters":[{"name":"ulid","in":"path","description":"ProjectRisk identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProjectRisk resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProjectRisk-projectrisk.write.jsonMergePatch"}}},"required":true}}},"/api/v1/project/project-statuses":{"get":{"operationId":"api_v1projectproject-statuses_get_collection","tags":["ProjectStatus"],"responses":{"200":{"description":"ProjectStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectStatus-project_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectStatus.jsonld-project_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectStatus.jsonld-project_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectStatus resources.","description":"Retrieves the collection of ProjectStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1projectproject-statuses_post","tags":["ProjectStatus"],"responses":{"201":{"description":"ProjectStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectStatus-project_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectStatus.jsonld-project_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProjectStatus resource.","description":"Creates a ProjectStatus resource.","parameters":[],"requestBody":{"description":"The new ProjectStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectStatus-project_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectStatus-project_status.write"}}},"required":true}}},"/api/v1/project/project-statuses/{key}":{"get":{"operationId":"api_v1projectproject-statuses_key_get","tags":["ProjectStatus"],"responses":{"200":{"description":"ProjectStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectStatus-project_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectStatus.jsonld-project_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectStatus resource.","description":"Retrieves a ProjectStatus resource.","parameters":[{"name":"key","in":"path","description":"ProjectStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1projectproject-statuses_key_delete","tags":["ProjectStatus"],"responses":{"204":{"description":"ProjectStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProjectStatus resource.","description":"Removes the ProjectStatus resource.","parameters":[{"name":"key","in":"path","description":"ProjectStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1projectproject-statuses_key_patch","tags":["ProjectStatus"],"responses":{"200":{"description":"ProjectStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectStatus-project_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectStatus.jsonld-project_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProjectStatus resource.","description":"Updates the ProjectStatus resource.","parameters":[{"name":"key","in":"path","description":"ProjectStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProjectStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProjectStatus-project_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/work-item/task-priorities":{"get":{"operationId":"api_v1work-itemtask-priorities_get_collection","tags":["ProjectTaskPriority"],"responses":{"200":{"description":"ProjectTaskPriority collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectTaskPriority-project_task_priority.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectTaskPriority.jsonld-project_task_priority.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectTaskPriority.jsonld-project_task_priority.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectTaskPriority resources.","description":"Retrieves the collection of ProjectTaskPriority resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1work-itemtask-priorities_post","tags":["ProjectTaskPriority"],"responses":{"201":{"description":"ProjectTaskPriority resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority-project_task_priority.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority.jsonld-project_task_priority.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProjectTaskPriority resource.","description":"Creates a ProjectTaskPriority resource.","parameters":[],"requestBody":{"description":"The new ProjectTaskPriority resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority-project_task_priority.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority-project_task_priority.write"}}},"required":true}}},"/api/v1/work-item/task-priorities/{key}":{"get":{"operationId":"api_v1work-itemtask-priorities_key_get","tags":["ProjectTaskPriority"],"responses":{"200":{"description":"ProjectTaskPriority resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority-project_task_priority.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority.jsonld-project_task_priority.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectTaskPriority resource.","description":"Retrieves a ProjectTaskPriority resource.","parameters":[{"name":"key","in":"path","description":"ProjectTaskPriority identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1work-itemtask-priorities_key_delete","tags":["ProjectTaskPriority"],"responses":{"204":{"description":"ProjectTaskPriority resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProjectTaskPriority resource.","description":"Removes the ProjectTaskPriority resource.","parameters":[{"name":"key","in":"path","description":"ProjectTaskPriority identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1work-itemtask-priorities_key_patch","tags":["ProjectTaskPriority"],"responses":{"200":{"description":"ProjectTaskPriority resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority-project_task_priority.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority.jsonld-project_task_priority.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProjectTaskPriority resource.","description":"Updates the ProjectTaskPriority resource.","parameters":[{"name":"key","in":"path","description":"ProjectTaskPriority identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProjectTaskPriority resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskPriority-project_task_priority.update.jsonMergePatch"}}},"required":true}}},"/api/v1/work-item/task-statuses":{"get":{"operationId":"api_v1work-itemtask-statuses_get_collection","tags":["ProjectTaskStatus"],"responses":{"200":{"description":"ProjectTaskStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectTaskStatus-project_task_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectTaskStatus.jsonld-project_task_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectTaskStatus.jsonld-project_task_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectTaskStatus resources.","description":"Retrieves the collection of ProjectTaskStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1work-itemtask-statuses_post","tags":["ProjectTaskStatus"],"responses":{"201":{"description":"ProjectTaskStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus-project_task_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus.jsonld-project_task_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProjectTaskStatus resource.","description":"Creates a ProjectTaskStatus resource.","parameters":[],"requestBody":{"description":"The new ProjectTaskStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus-project_task_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus-project_task_status.write"}}},"required":true}}},"/api/v1/work-item/task-statuses/{key}":{"get":{"operationId":"api_v1work-itemtask-statuses_key_get","tags":["ProjectTaskStatus"],"responses":{"200":{"description":"ProjectTaskStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus-project_task_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus.jsonld-project_task_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectTaskStatus resource.","description":"Retrieves a ProjectTaskStatus resource.","parameters":[{"name":"key","in":"path","description":"ProjectTaskStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1work-itemtask-statuses_key_delete","tags":["ProjectTaskStatus"],"responses":{"204":{"description":"ProjectTaskStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProjectTaskStatus resource.","description":"Removes the ProjectTaskStatus resource.","parameters":[{"name":"key","in":"path","description":"ProjectTaskStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1work-itemtask-statuses_key_patch","tags":["ProjectTaskStatus"],"responses":{"200":{"description":"ProjectTaskStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus-project_task_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus.jsonld-project_task_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProjectTaskStatus resource.","description":"Updates the ProjectTaskStatus resource.","parameters":[{"name":"key","in":"path","description":"ProjectTaskStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProjectTaskStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProjectTaskStatus-project_task_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/project-templates":{"get":{"operationId":"api_v1project-templates_get_collection","tags":["ProjectTemplate"],"responses":{"200":{"description":"ProjectTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectTemplate-project_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectTemplate.jsonld-project_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectTemplate.jsonld-project_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectTemplate resources.","description":"Retrieves the collection of ProjectTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Vorlagen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"projectType","in":"query","description":"Projekttyp-Key (ProjectType-Katalog, exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"search","in":"query","description":"LIKE-Suche über den Namen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach Änderungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1project-templates_post","tags":["ProjectTemplate"],"responses":{"201":{"description":"ProjectTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate-project_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate.jsonld-project_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProjectTemplate resource.","description":"Creates a ProjectTemplate resource.","parameters":[],"requestBody":{"description":"The new ProjectTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate-project_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate-project_template.write"}}},"required":true}}},"/api/v1/project-templates/{ulid}":{"get":{"operationId":"api_v1project-templates_ulid_get","tags":["ProjectTemplate"],"responses":{"200":{"description":"ProjectTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate-project_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate.jsonld-project_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectTemplate resource.","description":"Retrieves a ProjectTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"ProjectTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1project-templates_ulid_delete","tags":["ProjectTemplate"],"responses":{"204":{"description":"ProjectTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProjectTemplate resource.","description":"Removes the ProjectTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"ProjectTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1project-templates_ulid_patch","tags":["ProjectTemplate"],"responses":{"200":{"description":"ProjectTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate-project_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate.jsonld-project_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProjectTemplate resource.","description":"Updates the ProjectTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"ProjectTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProjectTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProjectTemplate-project_template.write.jsonMergePatch"}}},"required":true}}},"/api/v1/project/project-types":{"get":{"operationId":"api_v1projectproject-types_get_collection","tags":["ProjectType"],"responses":{"200":{"description":"ProjectType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectType-project_type.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ProjectType.jsonld-project_type.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ProjectType.jsonld-project_type.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ProjectType resources.","description":"Retrieves the collection of ProjectType resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1projectproject-types_post","tags":["ProjectType"],"responses":{"201":{"description":"ProjectType resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectType-project_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectType.jsonld-project_type.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ProjectType resource.","description":"Creates a ProjectType resource.","parameters":[],"requestBody":{"description":"The new ProjectType resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectType-project_type.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectType-project_type.write"}}},"required":true}}},"/api/v1/project/project-types/{key}":{"get":{"operationId":"api_v1projectproject-types_key_get","tags":["ProjectType"],"responses":{"200":{"description":"ProjectType resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectType-project_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectType.jsonld-project_type.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ProjectType resource.","description":"Retrieves a ProjectType resource.","parameters":[{"name":"key","in":"path","description":"ProjectType identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1projectproject-types_key_delete","tags":["ProjectType"],"responses":{"204":{"description":"ProjectType resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ProjectType resource.","description":"Removes the ProjectType resource.","parameters":[{"name":"key","in":"path","description":"ProjectType identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1projectproject-types_key_patch","tags":["ProjectType"],"responses":{"200":{"description":"ProjectType resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectType-project_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ProjectType.jsonld-project_type.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ProjectType resource.","description":"Updates the ProjectType resource.","parameters":[{"name":"key","in":"path","description":"ProjectType identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ProjectType resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ProjectType-project_type.update.jsonMergePatch"}}},"required":true}}},"/api/v1/promotions/campaigns":{"get":{"operationId":"api_v1promotionscampaigns_get_collection","tags":["Promotion"],"responses":{"200":{"description":"Promotion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Promotion-promotion.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Promotion.jsonld-promotion.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Promotion.jsonld-promotion.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Promotion resources.","description":"Retrieves the collection of Promotion resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Aktionen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"current","in":"query","description":"true = nur heute gültige Aktionen (Gültigkeitsfenster gegen den Geschäftstag)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"customerGroupId","in":"query","description":"Zielgruppe (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über den Namen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1promotionscampaigns_post","tags":["Promotion"],"responses":{"201":{"description":"Promotion resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Promotion-promotion.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Promotion.jsonld-promotion.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Promotion resource.","description":"Legt eine Aktion an. Ohne `rules` bepreist sie nichts — eine Aktion ohne Regel ist gültig, aber wirkungslos.","parameters":[],"requestBody":{"description":"The new Promotion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Promotion-promotion.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Promotion-promotion.write"}}},"required":true}}},"/api/v1/promotions/campaigns/{ulid}":{"get":{"operationId":"api_v1promotionscampaigns_ulid_get","tags":["Promotion"],"responses":{"200":{"description":"Promotion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Promotion-promotion.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Promotion.jsonld-promotion.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Promotion resource.","description":"Retrieves a Promotion resource.","parameters":[{"name":"ulid","in":"path","description":"Promotion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1promotionscampaigns_ulid_delete","tags":["Promotion"],"responses":{"204":{"description":"Promotion resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Promotion resource.","description":"Removes the Promotion resource.","parameters":[{"name":"ulid","in":"path","description":"Promotion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1promotionscampaigns_ulid_patch","tags":["Promotion"],"responses":{"200":{"description":"Promotion resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Promotion-promotion.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Promotion.jsonld-promotion.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Promotion resource.","description":"Ändert eine Aktion. Mitgesendete `rules` ERSETZEN den Regelsatz vollständig; ohne `rules` bleibt er unverändert.","parameters":[{"name":"ulid","in":"path","description":"Promotion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Promotion resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Promotion-promotion.write.jsonMergePatch"}}},"required":true}}},"/api/v1/purchasing/rfqs":{"get":{"operationId":"api_v1purchasingrfqs_get_collection","tags":["PurchaseRfq"],"responses":{"200":{"description":"PurchaseRfq collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseRfq-rfq.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PurchaseRfq.jsonld-rfq.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseRfq.jsonld-rfq.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PurchaseRfq resources.","description":"Retrieves the collection of PurchaseRfq resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"draft|sent|awarded|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1purchasingrfqs_post","tags":["PurchaseRfq"],"responses":{"201":{"description":"PurchaseRfq resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq.jsonld-rfq.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PurchaseRfq resource.","description":"Creates a PurchaseRfq resource.","parameters":[],"requestBody":{"description":"The new PurchaseRfq resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}}},"required":true}}},"/api/v1/purchasing/rfqs/{ulid}":{"get":{"operationId":"api_v1purchasingrfqs_ulid_get","tags":["PurchaseRfq"],"responses":{"200":{"description":"PurchaseRfq resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq.jsonld-rfq.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Anfrage mit Vergleichstabelle","description":"Antwort enthält `comparison`: je angefragter Position alle Angebote nebeneinander, mit Hinweis `cheapest` und `moqExceedsQty`. Der Vergleich entscheidet nicht — Lieferfähigkeit und Verlässlichkeit stehen in keiner dieser Zahlen.","parameters":[{"name":"ulid","in":"path","description":"PurchaseRfq identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1purchasingrfqs_ulid_patch","tags":["PurchaseRfq"],"responses":{"200":{"description":"PurchaseRfq resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq.jsonld-rfq.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Anfrage im Entwurf pflegen","description":"Kopf, `items` und `supplierRoleIds` — Positionen und Lieferanten werden dabei komplett ersetzt. Nur im Entwurf: nach dem Versand wäre eine geänderte Position eine Frage, die so nie gestellt wurde.","parameters":[{"name":"ulid","in":"path","description":"PurchaseRfq identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PurchaseRfq resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write.jsonMergePatch"}}},"required":true}}},"/api/v1/purchasing/rfqs/{ulid}/award":{"post":{"operationId":"purchasing_rfq_award","tags":["PurchaseRfq"],"responses":{"201":{"description":"PurchaseRfq resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq.jsonld-rfq.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Positionen vergeben und bestellen","description":"Payload `{quoteUlids}` — je Lieferant entsteht EINE Entwurfs-Bestellung mit dem ANGEBOTENEN Preis. Eine Position zweimal zu vergeben wird abgewiesen: das wäre eine Doppelbestellung.","parameters":[{"name":"ulid","in":"path","description":"PurchaseRfq identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PurchaseRfq resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}}},"required":true}}},"/api/v1/purchasing/rfqs/{ulid}/decline":{"post":{"operationId":"purchasing_rfq_decline","tags":["PurchaseRfq"],"responses":{"201":{"description":"PurchaseRfq resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq.jsonld-rfq.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Absage erfassen","description":"Payload `{supplierRoleId, note?}`. Eine Absage ist genauso wertvoll wie ein Angebot — sonst wartet der Einkauf auf eine Antwort, die nie kommt.","parameters":[{"name":"ulid","in":"path","description":"PurchaseRfq identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PurchaseRfq resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}}},"required":true}}},"/api/v1/purchasing/rfqs/{ulid}/quote":{"post":{"operationId":"purchasing_rfq_quote","tags":["PurchaseRfq"],"responses":{"201":{"description":"PurchaseRfq resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq.jsonld-rfq.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Angebot eines Lieferanten erfassen","description":"Payload `{supplierRoleId, freightCostAmount?, note?, quotes: [{itemUlid, unitPriceAmount, leadTimeDays?, minOrderQty?, note?}]}`. Ein zweites Angebot ERSETZT das erste vollständig — Zeilen zu mischen ergäbe ein Angebot, das so nie abgegeben wurde.","parameters":[{"name":"ulid","in":"path","description":"PurchaseRfq identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PurchaseRfq resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}}},"required":true}}},"/api/v1/purchasing/rfqs/{ulid}/send":{"post":{"operationId":"purchasing_rfq_send","tags":["PurchaseRfq"],"responses":{"201":{"description":"PurchaseRfq resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq.jsonld-rfq.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Anfrage verschicken","description":"Ab jetzt werden Angebote erfasst; Positionen sind fixiert.","parameters":[{"name":"ulid","in":"path","description":"PurchaseRfq identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PurchaseRfq resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseRfq-rfq.write"}}},"required":true}}},"/api/v1/purchasing/suggestion-parameter-sets":{"get":{"operationId":"api_v1purchasingsuggestion-parameter-sets_get_collection","tags":["PurchaseSuggestionParameterSet"],"responses":{"200":{"description":"PurchaseSuggestionParameterSet collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet-suggestion_param_set.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PurchaseSuggestionParameterSet.jsonld-suggestion_param_set.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet.jsonld-suggestion_param_set.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PurchaseSuggestionParameterSet resources.","description":"Retrieves the collection of PurchaseSuggestionParameterSet resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"mine","in":"query","description":"Nur die eigenen Sets (ohne die geteilten der Kolleginnen und Kollegen).","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1purchasingsuggestion-parameter-sets_post","tags":["PurchaseSuggestionParameterSet"],"responses":{"201":{"description":"PurchaseSuggestionParameterSet resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet-suggestion_param_set.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet.jsonld-suggestion_param_set.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Parameter-Set anlegen","description":"Speichert einen Parametersatz unter einem Namen. `parameters` nimmt dieselben Schlüssel wie `POST /v1/purchasing/suggestion-runs`; unbekannte werden verworfen, ungültige auf ihre Grenzen gezogen. `isShared` gibt das Set für alle mit Vorschlags-Recht frei — ändern darf es weiterhin nur der Anleger.","parameters":[],"requestBody":{"description":"The new PurchaseSuggestionParameterSet resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet-suggestion_param_set.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet-suggestion_param_set.write"}}},"required":true}}},"/api/v1/purchasing/suggestion-parameter-sets/{ulid}":{"get":{"operationId":"api_v1purchasingsuggestion-parameter-sets_ulid_get","tags":["PurchaseSuggestionParameterSet"],"responses":{"200":{"description":"PurchaseSuggestionParameterSet resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet-suggestion_param_set.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet.jsonld-suggestion_param_set.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PurchaseSuggestionParameterSet resource.","description":"Retrieves a PurchaseSuggestionParameterSet resource.","parameters":[{"name":"ulid","in":"path","description":"PurchaseSuggestionParameterSet identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1purchasingsuggestion-parameter-sets_ulid_delete","tags":["PurchaseSuggestionParameterSet"],"responses":{"204":{"description":"PurchaseSuggestionParameterSet resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the PurchaseSuggestionParameterSet resource.","description":"Removes the PurchaseSuggestionParameterSet resource.","parameters":[{"name":"ulid","in":"path","description":"PurchaseSuggestionParameterSet identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1purchasingsuggestion-parameter-sets_ulid_patch","tags":["PurchaseSuggestionParameterSet"],"responses":{"200":{"description":"PurchaseSuggestionParameterSet resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet-suggestion_param_set.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet.jsonld-suggestion_param_set.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the PurchaseSuggestionParameterSet resource.","description":"Updates the PurchaseSuggestionParameterSet resource.","parameters":[{"name":"ulid","in":"path","description":"PurchaseSuggestionParameterSet identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PurchaseSuggestionParameterSet resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionParameterSet-suggestion_param_set.write.jsonMergePatch"}}},"required":true}}},"/api/v1/purchasing/suggestion-runs":{"get":{"operationId":"api_v1purchasingsuggestion-runs_get_collection","tags":["PurchaseSuggestionRun"],"responses":{"200":{"description":"PurchaseSuggestionRun collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseSuggestionRun-suggestion_run.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PurchaseSuggestionRun.jsonld-suggestion_run.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseSuggestionRun.jsonld-suggestion_run.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PurchaseSuggestionRun resources.","description":"Retrieves the collection of PurchaseSuggestionRun resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1purchasingsuggestion-runs_post","tags":["PurchaseSuggestionRun"],"responses":{"201":{"description":"PurchaseSuggestionRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionRun-suggestion_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionRun.jsonld-suggestion_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Bestellvorschlag rechnen","description":"Payload = Parameter, alle optional. Grundlage: `referenceDays`, `horizonDays`, `safetyDays`, `includeInbound`, `supplierRoleId`, `skipWithoutConsumption`. Statt „letzte N Tage\" ein expliziter Saison-Zeitraum: `referenceFrom`/`referenceTo` (Y-m-d, nur zusammen wirksam). Genauigkeit der Verbrauchsrechnung: `outlierPercent` (Einzelabgänge über X % des Durchschnitts fallen raus; ab 100), `onlyDaysInStock` (nur Tage mit Bestand teilen). Bedarfsquelle: `demandPaymentStatuses` (`open`/`partial`/`paid` — Mengen ZURÜCKGEHALTENER Aufträge, die nichts reserviert haben; bestätigte Aufträge stecken bereits im verfügbaren Bestand). Lieferantenwahl: `respectSupplierStock` deckelt je Lieferant auf den gemeldeten `availableQty` und gibt die Restmenge an den nächsten. Statt eines Parametersatzes lässt sich ein gespeichertes Set über `/v1/purchasing/suggestion-parameter-sets` führen. Die Antwort enthält je Zeile die vollständige Rechnung: Tagesverbrauch, Reichweite in Tagen, Deckung, Bedarf im Horizont, zurückgehaltener Auftragsbedarf, Fehlmenge, Lieferanten-Deckel und die MOQ/VPE-Rundung.","parameters":[],"requestBody":{"description":"The new PurchaseSuggestionRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionRun-suggestion_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionRun-suggestion_run.write"}}},"required":true}}},"/api/v1/purchasing/suggestion-runs/{ulid}":{"get":{"operationId":"api_v1purchasingsuggestion-runs_ulid_get","tags":["PurchaseSuggestionRun"],"responses":{"200":{"description":"PurchaseSuggestionRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionRun-suggestion_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchaseSuggestionRun.jsonld-suggestion_run.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PurchaseSuggestionRun resource.","description":"Retrieves a PurchaseSuggestionRun resource.","parameters":[{"name":"ulid","in":"path","description":"PurchaseSuggestionRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/purchasing/lists":{"get":{"operationId":"api_v1purchasinglists_get_collection","tags":["PurchasingList"],"responses":{"200":{"description":"PurchasingList collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PurchasingList.jsonld-purchasing_list.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PurchasingList.jsonld-purchasing_list.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PurchasingList resources.","description":"Retrieves the collection of PurchasingList resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"open|ordered|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1purchasinglists_post","tags":["PurchasingList"],"responses":{"201":{"description":"PurchasingList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchasingList.jsonld-purchasing_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a PurchasingList resource.","description":"Creates a PurchasingList resource.","parameters":[],"requestBody":{"description":"The new PurchasingList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.write"}}},"required":true}}},"/api/v1/purchasing/lists/{ulid}":{"get":{"operationId":"api_v1purchasinglists_ulid_get","tags":["PurchasingList"],"responses":{"200":{"description":"PurchasingList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchasingList.jsonld-purchasing_list.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a PurchasingList resource.","description":"Retrieves a PurchasingList resource.","parameters":[{"name":"ulid","in":"path","description":"PurchasingList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1purchasinglists_ulid_patch","tags":["PurchasingList"],"responses":{"200":{"description":"PurchasingList resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchasingList.jsonld-purchasing_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einkaufsliste pflegen","description":"Kopf (`name`, `note`) und/oder `items` — die Positionen werden dabei KOMPLETT ersetzt: `{productId, description, qty, supplierRoleId, sourceWarehouseId, targetWarehouseId}`.","parameters":[{"name":"ulid","in":"path","description":"PurchasingList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated PurchasingList resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.write.jsonMergePatch"}}},"required":true}}},"/api/v1/purchasing/lists/{ulid}/add-from-run":{"post":{"operationId":"purchasing_list_add_from_run","tags":["PurchasingList"],"responses":{"201":{"description":"PurchasingList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchasingList.jsonld-purchasing_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vorschlagszeilen übernehmen","description":"Payload `{runUlid, productIds?, replace?}`. `replace: true` leert die Liste vorher (zweiter Lauf am selben Tag); ohne ihn wird ergänzt (Lauf für einen anderen Lieferanten). Ein bereits enthaltener Artikel wird ANGEHOBEN, nie summiert — der zweite Lauf rechnet denselben Bedarf neu, er ist kein zusätzlicher.","parameters":[{"name":"ulid","in":"path","description":"PurchasingList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PurchasingList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.write"}}},"required":true}}},"/api/v1/purchasing/lists/{ulid}/convert":{"post":{"operationId":"purchasing_list_convert","tags":["PurchasingList"],"responses":{"201":{"description":"PurchasingList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchasingList.jsonld-purchasing_list.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einkaufsliste in Bestellungen überführen","description":"Je Lieferant EINE Entwurfs-Bestellung, alles in einer Transaktion. Positionen mit Quell-Lager werden abgewiesen statt bestellt — die Umlagerung braucht den Mehrlager-Seam.","parameters":[{"name":"ulid","in":"path","description":"PurchasingList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new PurchasingList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/PurchasingList-purchasing_list.write"}}},"required":true}}},"/api/v1/warehouses/{warehouseUlid}/putaway-suggestions":{"get":{"operationId":"api_v1warehouses_warehouseUlidputaway-suggestions_get_collection","tags":["PutawaySuggestion"],"responses":{"200":{"description":"PutawaySuggestion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PutawaySuggestion-putaway_suggestion.read"}}},"application/ld+json":{"schema":{"type":"object","description":"PutawaySuggestion.jsonld-putaway_suggestion.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/PutawaySuggestion.jsonld-putaway_suggestion.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of PutawaySuggestion resources.","description":"Retrieves the collection of PutawaySuggestion resources.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"productId","in":"query","description":"Platzvorschläge für diesen Artikel; ohne ihn die Liste der nicht verorteten Artikel","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"barcode","in":"query","description":"Statt productId: EAN/SKU aus dem Scanner","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/ops/queue-health":{"get":{"operationId":"api_v1opsqueue-health_get_collection","tags":["QueueHealth"],"responses":{"200":{"description":"QueueHealth collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QueueHealth-queue_health.read"}}},"application/ld+json":{"schema":{"type":"object","description":"QueueHealth.jsonld-queue_health.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/QueueHealth.jsonld-queue_health.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of QueueHealth resources.","description":"Retrieves the collection of QueueHealth resources.","parameters":[]}},"/api/v1/quotes":{"get":{"operationId":"api_v1quotes_get_collection","tags":["Quote"],"responses":{"200":{"description":"Quote collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Quote-quote.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Quote.jsonld-quote.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Quote resources.","description":"Retrieves the collection of Quote resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Angebots-Status","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"ownerId","in":"query","description":"Verantwortliche/r (User-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche in Angebotsnummer, Titel und Kundenname","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[totalAmount]","in":"query","description":"Sortierung nach Gesamtsumme (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[validUntil]","in":"query","description":"Sortierung nach Gültig-bis (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1quotes_post","tags":["Quote"],"responses":{"201":{"description":"Quote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Quote resource.","description":"Creates a Quote resource.","parameters":[],"requestBody":{"description":"The new Quote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}}},"required":true}}},"/api/v1/quotes/{ulid}":{"get":{"operationId":"api_v1quotes_ulid_get","tags":["Quote"],"responses":{"200":{"description":"Quote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Quote resource.","description":"Retrieves a Quote resource.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1quotes_ulid_delete","tags":["Quote"],"responses":{"204":{"description":"Quote resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Quote resource.","description":"Removes the Quote resource.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1quotes_ulid_patch","tags":["Quote"],"responses":{"200":{"description":"Quote resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Quote resource.","description":"Updates the Quote resource.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Quote resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write.jsonMergePatch"}}},"required":true}}},"/api/v1/quotes/{ulid}/accept":{"post":{"operationId":"quote_accept","tags":["Quote"],"responses":{"201":{"description":"Quote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Angebot als angenommen vermerken","description":"Vermerkt das Angebot als vom Kunden angenommen. Nur aus dem Status `sent` (sonst 409) — die Nummer ist dort bereits vergeben.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Quote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}}},"required":true}}},"/api/v1/quotes/{ulid}/convert":{"post":{"operationId":"quote_convert","tags":["Quote"],"responses":{"201":{"description":"Quote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Convert quote","description":"Convert quote. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Quote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}}},"required":true}}},"/api/v1/quotes/{ulid}/pdf":{"get":{"operationId":"quote_pdf","tags":["Quote"],"responses":{"204":{"description":"Quote resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Quote resource.","description":"Retrieves a Quote resource.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/quotes/{ulid}/reject":{"post":{"operationId":"quote_reject","tags":["Quote"],"responses":{"201":{"description":"Quote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Angebot als abgelehnt schließen","description":"Schließt das Angebot endgültig (`rejected`, Ablehnzeitpunkt festgehalten) — es lässt sich danach weder annehmen noch in einen Auftrag wandeln; die verknüpfte Verkaufschance wird als verloren behandelt. Nur aus `sent` möglich (sonst 409). Body optional `{reason}`.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Quote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}}},"required":true}}},"/api/v1/quotes/{ulid}/send":{"post":{"operationId":"quote_send","tags":["Quote"],"responses":{"201":{"description":"Quote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Send quote","description":"Send quote. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Quote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}}},"required":true}}},"/api/v1/quotes/{ulid}/share":{"post":{"operationId":"quote_share","tags":["Quote"],"responses":{"201":{"description":"Quote resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote.jsonld-quote.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Freigabe-Link zum Angebot erzeugen","description":"Erzeugt einen Freigabe-Link zum Angebot für den Kunden. Verlangt das Versandrecht.","parameters":[{"name":"ulid","in":"path","description":"Quote identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Quote resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Quote-quote.write"}}},"required":true}}},"/api/v1/quotes/expiry-run":{"post":{"operationId":"quote_expiry_run","tags":["QuoteExpiryRun"],"responses":{"201":{"description":"QuoteExpiryRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteExpiryRun-quote_expiry_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteExpiryRun.jsonld-quote_expiry_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a QuoteExpiryRun resource.","description":"Creates a QuoteExpiryRun resource.","parameters":[],"requestBody":{"description":"The new QuoteExpiryRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteExpiryRun-quote_expiry_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteExpiryRun-quote_expiry_run.write"}}},"required":true}}},"/api/v1/quote-statuses":{"get":{"operationId":"api_v1quote-statuses_get_collection","tags":["QuoteStatus"],"responses":{"200":{"description":"QuoteStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuoteStatus-quote_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"QuoteStatus.jsonld-quote_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/QuoteStatus.jsonld-quote_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of QuoteStatus resources.","description":"Retrieves the collection of QuoteStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1quote-statuses_post","tags":["QuoteStatus"],"responses":{"201":{"description":"QuoteStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteStatus-quote_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteStatus.jsonld-quote_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a QuoteStatus resource.","description":"Creates a QuoteStatus resource.","parameters":[],"requestBody":{"description":"The new QuoteStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteStatus-quote_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteStatus-quote_status.write"}}},"required":true}}},"/api/v1/quote-statuses/{key}":{"get":{"operationId":"api_v1quote-statuses_key_get","tags":["QuoteStatus"],"responses":{"200":{"description":"QuoteStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteStatus-quote_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteStatus.jsonld-quote_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a QuoteStatus resource.","description":"Retrieves a QuoteStatus resource.","parameters":[{"name":"key","in":"path","description":"QuoteStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1quote-statuses_key_delete","tags":["QuoteStatus"],"responses":{"204":{"description":"QuoteStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the QuoteStatus resource.","description":"Removes the QuoteStatus resource.","parameters":[{"name":"key","in":"path","description":"QuoteStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1quote-statuses_key_patch","tags":["QuoteStatus"],"responses":{"200":{"description":"QuoteStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteStatus-quote_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteStatus.jsonld-quote_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the QuoteStatus resource.","description":"Updates the QuoteStatus resource.","parameters":[{"name":"key","in":"path","description":"QuoteStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated QuoteStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/QuoteStatus-quote_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/quote-summary":{"get":{"operationId":"api_v1quote-summary_get_collection","tags":["QuoteSummary"],"responses":{"200":{"description":"QuoteSummary collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuoteSummary-quote_summary.read"}}},"application/ld+json":{"schema":{"type":"object","description":"QuoteSummary.jsonld-quote_summary.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/QuoteSummary.jsonld-quote_summary.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of QuoteSummary resources.","description":"Retrieves the collection of QuoteSummary resources.","parameters":[]}},"/api/v1/quote-text-templates":{"get":{"operationId":"api_v1quote-text-templates_get_collection","tags":["QuoteTextTemplate"],"responses":{"200":{"description":"QuoteTextTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuoteTextTemplate-quote_text_template.read"}}},"application/ld+json":{"schema":{"type":"object","description":"QuoteTextTemplate.jsonld-quote_text_template.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/QuoteTextTemplate.jsonld-quote_text_template.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of QuoteTextTemplate resources.","description":"Retrieves the collection of QuoteTextTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1quote-text-templates_post","tags":["QuoteTextTemplate"],"responses":{"201":{"description":"QuoteTextTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate-quote_text_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate.jsonld-quote_text_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a QuoteTextTemplate resource.","description":"Creates a QuoteTextTemplate resource.","parameters":[],"requestBody":{"description":"The new QuoteTextTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate-quote_text_template.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate-quote_text_template.write"}}},"required":true}}},"/api/v1/quote-text-templates/{ulid}":{"get":{"operationId":"api_v1quote-text-templates_ulid_get","tags":["QuoteTextTemplate"],"responses":{"200":{"description":"QuoteTextTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate-quote_text_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate.jsonld-quote_text_template.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a QuoteTextTemplate resource.","description":"Retrieves a QuoteTextTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"QuoteTextTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1quote-text-templates_ulid_delete","tags":["QuoteTextTemplate"],"responses":{"204":{"description":"QuoteTextTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the QuoteTextTemplate resource.","description":"Removes the QuoteTextTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"QuoteTextTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1quote-text-templates_ulid_patch","tags":["QuoteTextTemplate"],"responses":{"200":{"description":"QuoteTextTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate-quote_text_template.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate.jsonld-quote_text_template.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the QuoteTextTemplate resource.","description":"Updates the QuoteTextTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"QuoteTextTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated QuoteTextTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/QuoteTextTemplate-quote_text_template.write.jsonMergePatch"}}},"required":true}}},"/api/v1/recurring-billing-plans":{"get":{"operationId":"api_v1recurring-billing-plans_get_collection","tags":["RecurringBillingPlan"],"responses":{"200":{"description":"RecurringBillingPlan collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.read"}}},"application/ld+json":{"schema":{"type":"object","description":"RecurringBillingPlan.jsonld-rbp.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/RecurringBillingPlan.jsonld-rbp.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of RecurringBillingPlan resources.","description":"Retrieves the collection of RecurringBillingPlan resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"licenseId","in":"query","description":"Lizenz-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über den Kundennamen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[amountAmount]","in":"query","description":"Sortierung nach Betrag (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[nextRunAt]","in":"query","description":"Sortierung nach nächstem Lauf (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1recurring-billing-plans_post","tags":["RecurringBillingPlan"],"responses":{"201":{"description":"RecurringBillingPlan resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan.jsonld-rbp.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a RecurringBillingPlan resource.","description":"Creates a RecurringBillingPlan resource.","parameters":[],"requestBody":{"description":"The new RecurringBillingPlan resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write"}}},"required":true}}},"/api/v1/recurring-billing-plans/{ulid}":{"get":{"operationId":"api_v1recurring-billing-plans_ulid_get","tags":["RecurringBillingPlan"],"responses":{"200":{"description":"RecurringBillingPlan resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan.jsonld-rbp.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a RecurringBillingPlan resource.","description":"Retrieves a RecurringBillingPlan resource.","parameters":[{"name":"ulid","in":"path","description":"RecurringBillingPlan identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1recurring-billing-plans_ulid_patch","tags":["RecurringBillingPlan"],"responses":{"200":{"description":"RecurringBillingPlan resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan.jsonld-rbp.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the RecurringBillingPlan resource.","description":"Updates the RecurringBillingPlan resource.","parameters":[{"name":"ulid","in":"path","description":"RecurringBillingPlan identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated RecurringBillingPlan resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write.jsonMergePatch"}}},"required":true}}},"/api/v1/recurring-billing-plans/{ulid}/end":{"post":{"operationId":"rbp_end","tags":["RecurringBillingPlan"],"responses":{"201":{"description":"RecurringBillingPlan resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan.jsonld-rbp.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"End recurring billing plan","description":"End recurring billing plan. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"RecurringBillingPlan identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new RecurringBillingPlan resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write"}}},"required":true}}},"/api/v1/recurring-billing-plans/{ulid}/pause":{"post":{"operationId":"rbp_pause","tags":["RecurringBillingPlan"],"responses":{"201":{"description":"RecurringBillingPlan resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan.jsonld-rbp.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Pause recurring billing plan","description":"Pause recurring billing plan. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"RecurringBillingPlan identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new RecurringBillingPlan resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write"}}},"required":true}}},"/api/v1/recurring-billing-plans/{ulid}/resume":{"post":{"operationId":"rbp_resume","tags":["RecurringBillingPlan"],"responses":{"201":{"description":"RecurringBillingPlan resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan.jsonld-rbp.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Resume recurring billing plan","description":"Resume recurring billing plan. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"RecurringBillingPlan identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new RecurringBillingPlan resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingPlan-rbp.write"}}},"required":true}}},"/api/v1/recurring-billing-plans/run":{"post":{"operationId":"recurring_billing_run","tags":["RecurringBillingRun"],"responses":{"201":{"description":"RecurringBillingRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingRun-recurring_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingRun.jsonld-recurring_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a RecurringBillingRun resource.","description":"Creates a RecurringBillingRun resource.","parameters":[],"requestBody":{"description":"The new RecurringBillingRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringBillingRun-recurring_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringBillingRun-recurring_run.write"}}},"required":true}}},"/api/v1/recurring-invoices":{"get":{"operationId":"api_v1recurring-invoices_get_collection","tags":["RecurringInvoice"],"responses":{"200":{"description":"RecurringInvoice collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.read"}}},"application/ld+json":{"schema":{"type":"object","description":"RecurringInvoice.jsonld-recurring_invoice.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/RecurringInvoice.jsonld-recurring_invoice.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of RecurringInvoice resources.","description":"Retrieves the collection of RecurringInvoice resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status (active|paused|ended)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"cycle","in":"query","description":"Zyklus (weekly|monthly|quarterly|yearly)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Bezeichnung und Kundenname","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Bezeichnung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[nextRunAt]","in":"query","description":"Sortierung nach nächstem Lauf (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[totalAmount]","in":"query","description":"Sortierung nach Zyklus-Summe (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1recurring-invoices_post","tags":["RecurringInvoice"],"responses":{"201":{"description":"RecurringInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice.jsonld-recurring_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a RecurringInvoice resource.","description":"Creates a RecurringInvoice resource.","parameters":[],"requestBody":{"description":"The new RecurringInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}}},"required":true}}},"/api/v1/recurring-invoices/{ulid}":{"get":{"operationId":"api_v1recurring-invoices_ulid_get","tags":["RecurringInvoice"],"responses":{"200":{"description":"RecurringInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice.jsonld-recurring_invoice.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a RecurringInvoice resource.","description":"Retrieves a RecurringInvoice resource.","parameters":[{"name":"ulid","in":"path","description":"RecurringInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1recurring-invoices_ulid_delete","tags":["RecurringInvoice"],"responses":{"204":{"description":"RecurringInvoice resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the RecurringInvoice resource.","description":"Removes the RecurringInvoice resource.","parameters":[{"name":"ulid","in":"path","description":"RecurringInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1recurring-invoices_ulid_patch","tags":["RecurringInvoice"],"responses":{"200":{"description":"RecurringInvoice resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice.jsonld-recurring_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the RecurringInvoice resource.","description":"Updates the RecurringInvoice resource.","parameters":[{"name":"ulid","in":"path","description":"RecurringInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated RecurringInvoice resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write.jsonMergePatch"}}},"required":true}}},"/api/v1/recurring-invoices/{ulid}/end":{"post":{"operationId":"recurring_invoice_end","tags":["RecurringInvoice"],"responses":{"201":{"description":"RecurringInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice.jsonld-recurring_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"End recurring invoice","description":"End recurring invoice. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"RecurringInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new RecurringInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}}},"required":true}}},"/api/v1/recurring-invoices/{ulid}/pause":{"post":{"operationId":"recurring_invoice_pause","tags":["RecurringInvoice"],"responses":{"201":{"description":"RecurringInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice.jsonld-recurring_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Pause recurring invoice","description":"Pause recurring invoice. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"RecurringInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new RecurringInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}}},"required":true}}},"/api/v1/recurring-invoices/{ulid}/resume":{"post":{"operationId":"recurring_invoice_resume","tags":["RecurringInvoice"],"responses":{"201":{"description":"RecurringInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice.jsonld-recurring_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Resume recurring invoice","description":"Resume recurring invoice. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"RecurringInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new RecurringInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}}},"required":true}}},"/api/v1/recurring-invoices/{ulid}/run-now":{"post":{"operationId":"recurring_invoice_run_now","tags":["RecurringInvoice"],"responses":{"201":{"description":"RecurringInvoice resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice.jsonld-recurring_invoice.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Fällige Rechnung sofort erzeugen","description":"Erzeugt sofort die fällige Rechnung aus der Serienrechnung (respektiert `runMode`), idempotent je Leistungszeitraum. Die Antwort trägt `generatedInvoiceUlid`.","parameters":[{"name":"ulid","in":"path","description":"RecurringInvoice identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new RecurringInvoice resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RecurringInvoice-recurring_invoice.write"}}},"required":true}}},"/api/v1/recurring-plan-summary":{"get":{"operationId":"api_v1recurring-plan-summary_get_collection","tags":["RecurringPlanSummary"],"responses":{"200":{"description":"RecurringPlanSummary collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RecurringPlanSummary-recurring_plan_summary.read"}}},"application/ld+json":{"schema":{"type":"object","description":"RecurringPlanSummary.jsonld-recurring_plan_summary.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/RecurringPlanSummary.jsonld-recurring_plan_summary.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of RecurringPlanSummary resources.","description":"Retrieves the collection of RecurringPlanSummary resources.","parameters":[]}},"/api/v1/purchasing/reorder-suggestions":{"get":{"operationId":"api_v1purchasingreorder-suggestions_get_collection","tags":["ReorderSuggestion"],"responses":{"200":{"description":"ReorderSuggestion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReorderSuggestion-purchasing_suggestion.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReorderSuggestion.jsonld-purchasing_suggestion.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReorderSuggestion.jsonld-purchasing_suggestion.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReorderSuggestion resources.","description":"Retrieves the collection of ReorderSuggestion resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Produkt-Name und SKU","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/purchasing/reorder-suggestions/create-orders":{"post":{"operationId":"purchasing_suggestion_create_orders","tags":["ReorderSuggestion"],"responses":{"201":{"description":"ReorderSuggestion resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderSuggestion-purchasing_suggestion.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReorderSuggestion.jsonld-purchasing_suggestion.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReorderSuggestion resource.","description":"Creates a ReorderSuggestion resource.","parameters":[],"requestBody":{"description":"The new ReorderSuggestion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderSuggestion-purchasing_suggestion.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReorderSuggestion-purchasing_suggestion.write"}}},"required":true}}},"/api/v1/purchasing/reorder-suggestions/{ulid}/dismiss":{"post":{"operationId":"purchasing_suggestion_dismiss","tags":["ReorderSuggestion"],"responses":{"201":{"description":"ReorderSuggestion resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderSuggestion-purchasing_suggestion.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReorderSuggestion.jsonld-purchasing_suggestion.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Nachbestell-Vorschlag verwerfen","description":"Verwirft den Nachbestell-Vorschlag; er wird nicht erneut vorgeschlagen.","parameters":[{"name":"ulid","in":"path","description":"ReorderSuggestion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReorderSuggestion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderSuggestion-purchasing_suggestion.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReorderSuggestion-purchasing_suggestion.write"}}},"required":true}}},"/api/v1/warehouses/{warehouseUlid}/replenishment-rules":{"get":{"operationId":"api_v1warehouses_warehouseUlidreplenishment-rules_get_collection","tags":["ReplenishmentRule"],"responses":{"200":{"description":"ReplenishmentRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReplenishmentRule-replenishment_rule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReplenishmentRule.jsonld-replenishment_rule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReplenishmentRule.jsonld-replenishment_rule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReplenishmentRule resources.","description":"Retrieves the collection of ReplenishmentRule resources.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"api_v1warehouses_warehouseUlidreplenishment-rules_post","tags":["ReplenishmentRule"],"responses":{"201":{"description":"ReplenishmentRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentRule-replenishment_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentRule.jsonld-replenishment_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Nachschubregel anlegen","description":"Legt eine Min/Max-Nachschubregel an. Genau eine je Lager, Produkt und Zielplatz — ein Duplikat scheitert (409).","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReplenishmentRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentRule-replenishment_rule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentRule-replenishment_rule.write"}}},"required":true}}},"/api/v1/warehouses/{warehouseUlid}/replenishment-rules/{ulid}":{"delete":{"operationId":"api_v1warehouses_warehouseUlidreplenishment-rules_ulid_delete","tags":["ReplenishmentRule"],"responses":{"204":{"description":"ReplenishmentRule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ReplenishmentRule resource.","description":"Removes the ReplenishmentRule resource.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ulid","in":"path","description":"ReplenishmentRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1warehouses_warehouseUlidreplenishment-rules_ulid_patch","tags":["ReplenishmentRule"],"responses":{"200":{"description":"ReplenishmentRule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentRule-replenishment_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentRule.jsonld-replenishment_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ReplenishmentRule resource.","description":"Updates the ReplenishmentRule resource.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ulid","in":"path","description":"ReplenishmentRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ReplenishmentRule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentRule-replenishment_rule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/warehouses/replenishment-suggestions":{"get":{"operationId":"api_v1warehousesreplenishment-suggestions_get_collection","tags":["ReplenishmentSuggestion"],"responses":{"200":{"description":"ReplenishmentSuggestion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReplenishmentSuggestion-replenishment_suggestion.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReplenishmentSuggestion.jsonld-replenishment_suggestion.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReplenishmentSuggestion.jsonld-replenishment_suggestion.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReplenishmentSuggestion resources.","description":"Retrieves the collection of ReplenishmentSuggestion resources.","parameters":[]}},"/api/v1/wms/replenishment-tasks":{"get":{"operationId":"api_v1wmsreplenishment-tasks_get_collection","tags":["ReplenishmentTask"],"responses":{"200":{"description":"ReplenishmentTask collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReplenishmentTask.jsonld-replenishment_task.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReplenishmentTask.jsonld-replenishment_task.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReplenishmentTask resources.","description":"Retrieves the collection of ReplenishmentTask resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"open|done|cancelled","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"warehouseId","in":"query","description":"Lager-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/wms/replenishment-tasks/generate":{"post":{"operationId":"wms_replenishment_generate","tags":["ReplenishmentTask"],"responses":{"201":{"description":"ReplenishmentTask resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask.jsonld-replenishment_task.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Nachschub-Aufträge aus den Regeln erzeugen","description":"Optionale Nutzlast `{warehouseId}` grenzt auf ein Lager ein. Erzeugt NUR für platzbezogene Regeln mit vorhandenem Quellplatz; für ein Ziel mit bereits offenem Auftrag entsteht kein zweiter. Antwort: die neu erzeugten Aufträge.","parameters":[],"requestBody":{"description":"The new ReplenishmentTask resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.write"}}},"required":true}}},"/api/v1/wms/replenishment-tasks/{ulid}":{"get":{"operationId":"api_v1wmsreplenishment-tasks_ulid_get","tags":["ReplenishmentTask"],"responses":{"200":{"description":"ReplenishmentTask resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask.jsonld-replenishment_task.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReplenishmentTask resource.","description":"Retrieves a ReplenishmentTask resource.","parameters":[{"name":"ulid","in":"path","description":"ReplenishmentTask identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/wms/replenishment-tasks/{ulid}/cancel":{"post":{"operationId":"wms_replenishment_cancel","tags":["ReplenishmentTask"],"responses":{"201":{"description":"ReplenishmentTask resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask.jsonld-replenishment_task.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Nachschub-Auftrag verwerfen","description":"Payload `{note}` — warum der Weg nicht gelaufen wird.","parameters":[{"name":"ulid","in":"path","description":"ReplenishmentTask identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReplenishmentTask resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.write"}}},"required":true}}},"/api/v1/wms/replenishment-tasks/{ulid}/confirm":{"post":{"operationId":"wms_replenishment_confirm","tags":["ReplenishmentTask"],"responses":{"201":{"description":"ReplenishmentTask resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask.jsonld-replenishment_task.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Umlagerung per Scan bestätigen","description":"Payload `{sourceBinCode, productCode, qty, targetBinCode}`. Jeder Scan muss zum Auftrag gehören (422 bei falschem Platz oder falschem Artikel); die Menge darf kleiner, nie größer als die vorgeschlagene sein.","parameters":[{"name":"ulid","in":"path","description":"ReplenishmentTask identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReplenishmentTask resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReplenishmentTask-replenishment_task.write"}}},"required":true}}},"/api/v1/reporting/reports":{"get":{"operationId":"api_v1reportingreports_get_collection","tags":["ReportDefinition"],"responses":{"200":{"description":"ReportDefinition collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportDefinition-reportdef.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportDefinition.jsonld-reportdef.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportDefinition.jsonld-reportdef.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportDefinition resources.","description":"Retrieves the collection of ReportDefinition resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1reportingreports_post","tags":["ReportDefinition"],"responses":{"201":{"description":"ReportDefinition resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition.jsonld-reportdef.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReportDefinition resource.","description":"Creates a ReportDefinition resource.","parameters":[],"requestBody":{"description":"The new ReportDefinition resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.write"}}},"required":true}}},"/api/v1/reporting/reports/from-template":{"post":{"operationId":"report_from_template","tags":["ReportDefinition"],"responses":{"201":{"description":"ReportDefinition resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition.jsonld-reportdef.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReportDefinition resource.","description":"Creates a ReportDefinition resource.","parameters":[],"requestBody":{"description":"The new ReportDefinition resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition.ReportFromTemplateInput-reportdef.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition.ReportFromTemplateInput-reportdef.write"}}},"required":true}}},"/api/v1/reporting/reports/{ulid}":{"get":{"operationId":"api_v1reportingreports_ulid_get","tags":["ReportDefinition"],"responses":{"200":{"description":"ReportDefinition resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition.jsonld-reportdef.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReportDefinition resource.","description":"Retrieves a ReportDefinition resource.","parameters":[{"name":"ulid","in":"path","description":"ReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1reportingreports_ulid_delete","tags":["ReportDefinition"],"responses":{"204":{"description":"ReportDefinition resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ReportDefinition resource.","description":"Removes the ReportDefinition resource.","parameters":[{"name":"ulid","in":"path","description":"ReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1reportingreports_ulid_patch","tags":["ReportDefinition"],"responses":{"200":{"description":"ReportDefinition resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition.jsonld-reportdef.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ReportDefinition resource.","description":"Updates the ReportDefinition resource.","parameters":[{"name":"ulid","in":"path","description":"ReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ReportDefinition resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.write.jsonMergePatch"}}},"required":true}}},"/api/v1/reporting/reports/{ulid}/result":{"get":{"operationId":"api_v1reportingreports_ulidresult_get","tags":["ReportDefinition"],"responses":{"200":{"description":"ReportDefinition resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition.jsonld-reportdef.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReportDefinition resource.","description":"Retrieves a ReportDefinition resource.","parameters":[{"name":"ulid","in":"path","description":"ReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/reporting/reports/{ulid}/run":{"post":{"operationId":"api_v1reportingreports_ulidrun_post","tags":["ReportDefinition"],"responses":{"201":{"description":"ReportDefinition resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition.jsonld-reportdef.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Gespeicherte Auswertung exportieren","description":"Stößt den Export-Lauf der gespeicherten Auswertung an (`format` csv|xlsx|pdf, Default csv). Verlangt das Export-Recht plus Sichtbarkeit auf den Report.","parameters":[{"name":"ulid","in":"path","description":"ReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"format","in":"query","description":"Export-Format des Laufs; ohne Angabe csv.","required":false,"deprecated":false,"schema":{"type":"string","enum":["csv","xlsx","pdf"],"default":"csv"},"style":"form","explode":true}],"requestBody":{"description":"The new ReportDefinition resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportDefinition-reportdef.write"}}},"required":true}}},"/api/v1/reporting/runs":{"get":{"operationId":"api_v1reportingruns_get_collection","tags":["ReportRun"],"responses":{"200":{"description":"ReportRun collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportRun-run.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportRun.jsonld-run.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportRun.jsonld-run.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportRun resources.","description":"Retrieves the collection of ReportRun resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"reportDefinitionUlid","in":"query","description":"ULID der Report-Definition","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status (exakter Match: queued|running|done|failed)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/reporting/runs/{ulid}":{"get":{"operationId":"api_v1reportingruns_ulid_get","tags":["ReportRun"],"responses":{"200":{"description":"ReportRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRun-run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportRun.jsonld-run.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReportRun resource.","description":"Retrieves a ReportRun resource.","parameters":[{"name":"ulid","in":"path","description":"ReportRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/reporting/runs/{ulid}/download":{"get":{"operationId":"api_v1reportingruns_uliddownload_get","tags":["ReportRun"],"responses":{"200":{"description":"ReportRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRun-run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportRun.jsonld-run.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReportRun resource.","description":"Retrieves a ReportRun resource.","parameters":[{"name":"ulid","in":"path","description":"ReportRun identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/reporting/schedules":{"get":{"operationId":"api_v1reportingschedules_get_collection","tags":["ReportSchedule"],"responses":{"200":{"description":"ReportSchedule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportSchedule-schedule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportSchedule.jsonld-schedule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportSchedule.jsonld-schedule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportSchedule resources.","description":"Retrieves the collection of ReportSchedule resources.","parameters":[]},"post":{"operationId":"api_v1reportingschedules_post","tags":["ReportSchedule"],"responses":{"201":{"description":"ReportSchedule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportSchedule-schedule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportSchedule.jsonld-schedule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReportSchedule resource.","description":"Creates a ReportSchedule resource.","parameters":[],"requestBody":{"description":"The new ReportSchedule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportSchedule-schedule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportSchedule-schedule.write"}}},"required":true}}},"/api/v1/reporting/schedules/{ulid}":{"get":{"operationId":"api_v1reportingschedules_ulid_get","tags":["ReportSchedule"],"responses":{"200":{"description":"ReportSchedule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportSchedule-schedule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportSchedule.jsonld-schedule.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReportSchedule resource.","description":"Retrieves a ReportSchedule resource.","parameters":[{"name":"ulid","in":"path","description":"ReportSchedule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1reportingschedules_ulid_delete","tags":["ReportSchedule"],"responses":{"204":{"description":"ReportSchedule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ReportSchedule resource.","description":"Removes the ReportSchedule resource.","parameters":[{"name":"ulid","in":"path","description":"ReportSchedule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1reportingschedules_ulid_patch","tags":["ReportSchedule"],"responses":{"200":{"description":"ReportSchedule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportSchedule-schedule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportSchedule.jsonld-schedule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ReportSchedule resource.","description":"Updates the ReportSchedule resource.","parameters":[{"name":"ulid","in":"path","description":"ReportSchedule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ReportSchedule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ReportSchedule-schedule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/reporting/report-templates":{"get":{"operationId":"api_v1reportingreport-templates_get_collection","tags":["ReportTemplate"],"responses":{"200":{"description":"ReportTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportTemplate-reporttemplate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportTemplate.jsonld-reporttemplate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportTemplate.jsonld-reporttemplate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportTemplate resources.","description":"Retrieves the collection of ReportTemplate resources.","parameters":[]}},"/api/v1/reporting/dashboards":{"get":{"operationId":"api_v1reportingdashboards_get_collection","tags":["ReportingDashboard"],"responses":{"200":{"description":"ReportingDashboard collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingDashboard.jsonld-dashboard.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingDashboard.jsonld-dashboard.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingDashboard resources.","description":"Retrieves the collection of ReportingDashboard resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1reportingdashboards_post","tags":["ReportingDashboard"],"responses":{"201":{"description":"ReportingDashboard resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard.jsonld-dashboard.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReportingDashboard resource.","description":"Creates a ReportingDashboard resource.","parameters":[],"requestBody":{"description":"The new ReportingDashboard resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.write"}}},"required":true}}},"/api/v1/reporting/dashboards/home":{"get":{"operationId":"api_v1reportingdashboardshome_get_collection","tags":["ReportingDashboard"],"responses":{"200":{"description":"ReportingDashboard collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingDashboard.jsonld-dashboard.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingDashboard.jsonld-dashboard.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingDashboard resources.","description":"Retrieves the collection of ReportingDashboard resources.","parameters":[]}},"/api/v1/reporting/dashboards/{ulid}":{"get":{"operationId":"api_v1reportingdashboards_ulid_get","tags":["ReportingDashboard"],"responses":{"200":{"description":"ReportingDashboard resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard.jsonld-dashboard.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReportingDashboard resource.","description":"Retrieves a ReportingDashboard resource.","parameters":[{"name":"ulid","in":"path","description":"ReportingDashboard identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1reportingdashboards_ulid_delete","tags":["ReportingDashboard"],"responses":{"204":{"description":"ReportingDashboard resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ReportingDashboard resource.","description":"Removes the ReportingDashboard resource.","parameters":[{"name":"ulid","in":"path","description":"ReportingDashboard identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1reportingdashboards_ulid_patch","tags":["ReportingDashboard"],"responses":{"200":{"description":"ReportingDashboard resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard.jsonld-dashboard.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ReportingDashboard resource.","description":"Updates the ReportingDashboard resource.","parameters":[{"name":"ulid","in":"path","description":"ReportingDashboard identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ReportingDashboard resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.write.jsonMergePatch"}}},"required":true}}},"/api/v1/reporting/dashboards/{ulid}/data":{"get":{"operationId":"api_v1reportingdashboards_uliddata_get","tags":["ReportingDashboard"],"responses":{"200":{"description":"ReportingDashboard resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard-dashboard.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingDashboard.jsonld-dashboard.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReportingDashboard resource.","description":"Retrieves a ReportingDashboard resource.","parameters":[{"name":"ulid","in":"path","description":"ReportingDashboard identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"brandId","in":"query","description":"Cockpit-Filter: Kennzahlen nur dieser Marke (überschreibt die Widget-Marke).","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"range","in":"query","description":"Cockpit-Filter: Zeitraum-Kürzel, überschreibt den Zeitraum jedes Widgets.","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/reporting/datasets":{"get":{"operationId":"api_v1reportingdatasets_get_collection","tags":["ReportingDataset"],"responses":{"200":{"description":"ReportingDataset collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingDataset-reporting_dataset.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingDataset.jsonld-reporting_dataset.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingDataset.jsonld-reporting_dataset.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingDataset resources.","description":"Retrieves the collection of ReportingDataset resources.","parameters":[]}},"/api/v1/reporting/insights/anomalies":{"get":{"operationId":"api_v1reportinginsightsanomalies_get_collection","tags":["ReportingInsight"],"responses":{"200":{"description":"ReportingInsight collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsight-insight.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingInsight.jsonld-insight.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsight.jsonld-insight.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingInsight resources.","description":"Retrieves the collection of ReportingInsight resources.","parameters":[{"name":"brandId","in":"query","description":"Marken-Scope (nur innerhalb des eigenen Marken-Scopes zulässig)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"period","in":"query","description":"Verdichtungsstufe (day|week|month|quarter|year; Standard month)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"range","in":"query","description":"Vordefinierter Zeitraum (this_month|last_month|this_quarter|this_year|ytd|last_12_months; Standard this_month). Wird von from+to überstimmt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Zeitraum-Beginn (YYYY-MM-DD); wirkt nur gemeinsam mit `to` und überstimmt dann `range`","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende (YYYY-MM-DD); wirkt nur gemeinsam mit `from`","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"dimension","in":"query","description":"Auswertungs-Dimension (global|brand|customer|project|employee; Standard global)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/reporting/insights/narrative":{"get":{"operationId":"api_v1reportinginsightsnarrative_get_collection","tags":["ReportingInsight"],"responses":{"200":{"description":"ReportingInsight collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsight-insight.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingInsight.jsonld-insight.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingInsight.jsonld-insight.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingInsight resources.","description":"Retrieves the collection of ReportingInsight resources.","parameters":[{"name":"brandId","in":"query","description":"Marken-Scope (nur innerhalb des eigenen Marken-Scopes zulässig)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"period","in":"query","description":"Verdichtungsstufe (day|week|month|quarter|year; Standard month)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"range","in":"query","description":"Vordefinierter Zeitraum (this_month|last_month|this_quarter|this_year|ytd|last_12_months; Standard this_month). Wird von from+to überstimmt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Zeitraum-Beginn (YYYY-MM-DD); wirkt nur gemeinsam mit `to` und überstimmt dann `range`","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende (YYYY-MM-DD); wirkt nur gemeinsam mit `from`","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"dimension","in":"query","description":"Auswertungs-Dimension (global|brand|customer|project|employee; Standard global)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/reporting/insights/query":{"post":{"operationId":"api_v1reportinginsightsquery_post","tags":["ReportingInsight"],"responses":{"201":{"description":"ReportingInsight resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingInsight-insight.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingInsight.jsonld-insight.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReportingInsight resource.","description":"Creates a ReportingInsight resource.","parameters":[],"requestBody":{"description":"The new ReportingInsight resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingInsight-insight.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingInsight-insight.write"}}},"required":true}}},"/api/v1/reporting/kpis":{"get":{"operationId":"api_v1reportingkpis_get_collection","tags":["ReportingKpi"],"responses":{"200":{"description":"ReportingKpi collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingKpi-kpi.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingKpi.jsonld-kpi.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingKpi.jsonld-kpi.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingKpi resources.","description":"Retrieves the collection of ReportingKpi resources.","parameters":[{"name":"metric","in":"query","description":"Metrik-Schlüssel (Pflicht — fehlend oder unbekannt ergibt 400)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"dimension","in":"query","description":"Dimension der Aufschlüsselung (Default: global)","required":false,"deprecated":false,"schema":{"type":"string","enum":["global","brand","customer","project","employee"]},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (nur innerhalb des eigenen Marken-Scopes zulässig)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"from","in":"query","description":"Zeitraum-Beginn (nur zusammen mit to wirksam)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende (nur zusammen mit from wirksam)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"range","in":"query","description":"Benannter Zeitraum (Default: this_month; nur ohne from/to wirksam)","required":false,"deprecated":false,"schema":{"type":"string","enum":["this_month","last_month","this_quarter","this_year","ytd","last_12_months","custom"]},"style":"form","explode":true},{"name":"period","in":"query","description":"Perioden-Raster (Default: month)","required":false,"deprecated":false,"schema":{"type":"string","enum":["day","week","month","quarter","year"]},"style":"form","explode":true},{"name":"compare","in":"query","description":"Vergleichsmodus für das Delta (Default: none)","required":false,"deprecated":false,"schema":{"type":"string","enum":["none","previous_period","previous_year"]},"style":"form","explode":true},{"name":"parentDimension","in":"query","description":"Eltern-Achse des Drill-downs — schneidet die Aufschlüsselung auf EINEN Elternwert (z.B. dimension=project + parentDimension=customer). Nur zusammen mit parentValue; muss von dimension verschieden sein (sonst 400). Kennzahl ohne Eltern-Schnitt-Fähigkeit ergibt 422.","required":false,"deprecated":false,"schema":{"type":"string","enum":["brand","customer","project","employee"]},"style":"form","explode":true},{"name":"parentValue","in":"query","description":"Konkreter Elternwert (Id der parentDimension); nur zusammen mit parentDimension wirksam.","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/reporting/kpis/series":{"get":{"operationId":"api_v1reportingkpisseries_get_collection","tags":["ReportingKpi"],"responses":{"200":{"description":"ReportingKpi collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingKpi-kpi.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingKpi.jsonld-kpi.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingKpi.jsonld-kpi.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingKpi resources.","description":"Retrieves the collection of ReportingKpi resources.","parameters":[{"name":"metric","in":"query","description":"Metrik-Schlüssel (Pflicht — fehlend oder unbekannt ergibt 400)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (nur innerhalb des eigenen Marken-Scopes zulässig)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"from","in":"query","description":"Zeitraum-Beginn (nur zusammen mit to wirksam)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende (nur zusammen mit from wirksam)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"range","in":"query","description":"Benannter Zeitraum (Default: this_month; nur ohne from/to wirksam)","required":false,"deprecated":false,"schema":{"type":"string","enum":["this_month","last_month","this_quarter","this_year","ytd","last_12_months","custom"]},"style":"form","explode":true},{"name":"period","in":"query","description":"Perioden-Raster (Default: month)","required":false,"deprecated":false,"schema":{"type":"string","enum":["day","week","month","quarter","year"]},"style":"form","explode":true},{"name":"dimension","in":"query","description":"Dimension (Default: global; nur zusammen mit dimensionValue wirksam)","required":false,"deprecated":false,"schema":{"type":"string","enum":["global","brand","customer","project","employee"]},"style":"form","explode":true},{"name":"dimensionValue","in":"query","description":"Konkreter Dimensionswert (z.B. Marken-/Kunden-ID); ohne Angabe globale Zeitreihe","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/reporting/metrics":{"get":{"operationId":"api_v1reportingmetrics_get_collection","tags":["ReportingMetric"],"responses":{"200":{"description":"ReportingMetric collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingMetric-reporting_metric.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingMetric.jsonld-reporting_metric.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingMetric.jsonld-reporting_metric.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingMetric resources.","description":"Retrieves the collection of ReportingMetric resources.","parameters":[]}},"/api/v1/reporting/targets":{"get":{"operationId":"api_v1reportingtargets_get_collection","tags":["ReportingTarget"],"responses":{"200":{"description":"ReportingTarget collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingTarget-target.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingTarget.jsonld-target.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingTarget.jsonld-target.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingTarget resources.","description":"Retrieves the collection of ReportingTarget resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"metric","in":"query","description":"Metrik-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1reportingtargets_post","tags":["ReportingTarget"],"responses":{"201":{"description":"ReportingTarget resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingTarget-target.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingTarget.jsonld-target.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReportingTarget resource.","description":"Creates a ReportingTarget resource.","parameters":[],"requestBody":{"description":"The new ReportingTarget resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingTarget-target.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingTarget-target.write"}}},"required":true}}},"/api/v1/reporting/targets/{ulid}":{"get":{"operationId":"api_v1reportingtargets_ulid_get","tags":["ReportingTarget"],"responses":{"200":{"description":"ReportingTarget resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingTarget-target.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingTarget.jsonld-target.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReportingTarget resource.","description":"Retrieves a ReportingTarget resource.","parameters":[{"name":"ulid","in":"path","description":"ReportingTarget identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1reportingtargets_ulid_delete","tags":["ReportingTarget"],"responses":{"204":{"description":"ReportingTarget resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ReportingTarget resource.","description":"Removes the ReportingTarget resource.","parameters":[{"name":"ulid","in":"path","description":"ReportingTarget identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1reportingtargets_ulid_patch","tags":["ReportingTarget"],"responses":{"200":{"description":"ReportingTarget resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportingTarget-target.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReportingTarget.jsonld-target.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ReportingTarget resource.","description":"Updates the ReportingTarget resource.","parameters":[{"name":"ulid","in":"path","description":"ReportingTarget identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ReportingTarget resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ReportingTarget-target.write.jsonMergePatch"}}},"required":true}}},"/api/v1/reporting/widget-types":{"get":{"operationId":"api_v1reportingwidget-types_get_collection","tags":["ReportingWidgetType"],"responses":{"200":{"description":"ReportingWidgetType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReportingWidgetType-reporting_widget_type.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReportingWidgetType.jsonld-reporting_widget_type.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReportingWidgetType.jsonld-reporting_widget_type.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReportingWidgetType resources.","description":"Retrieves the collection of ReportingWidgetType resources.","parameters":[]}},"/api/v1/repricer/rules":{"get":{"operationId":"api_v1repricerrules_get_collection","tags":["RepricingRule"],"responses":{"200":{"description":"RepricingRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"RepricingRule.jsonld-repricing_rule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/RepricingRule.jsonld-repricing_rule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of RepricingRule resources.","description":"Retrieves the collection of RepricingRule resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Regeln","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"channelKey","in":"query","description":"Kanal-Schlüssel (exakter Match); markenfreie „für alle\"-Regeln bleiben unberührt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1repricerrules_post","tags":["RepricingRule"],"responses":{"201":{"description":"RepricingRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RepricingRule.jsonld-repricing_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a RepricingRule resource.","description":"Creates a RepricingRule resource.","parameters":[],"requestBody":{"description":"The new RepricingRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.write"}}},"required":true}}},"/api/v1/repricer/rules/{ulid}":{"get":{"operationId":"api_v1repricerrules_ulid_get","tags":["RepricingRule"],"responses":{"200":{"description":"RepricingRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RepricingRule.jsonld-repricing_rule.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a RepricingRule resource.","description":"Retrieves a RepricingRule resource.","parameters":[{"name":"ulid","in":"path","description":"RepricingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1repricerrules_ulid_delete","tags":["RepricingRule"],"responses":{"204":{"description":"RepricingRule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the RepricingRule resource.","description":"Removes the RepricingRule resource.","parameters":[{"name":"ulid","in":"path","description":"RepricingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1repricerrules_ulid_patch","tags":["RepricingRule"],"responses":{"200":{"description":"RepricingRule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RepricingRule.jsonld-repricing_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the RepricingRule resource.","description":"Updates the RepricingRule resource.","parameters":[{"name":"ulid","in":"path","description":"RepricingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated RepricingRule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/repricer/rules/{ulid}/simulate":{"post":{"operationId":"repricer_rule_simulate","tags":["RepricingRule"],"responses":{"201":{"description":"RepricingRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RepricingRule.jsonld-repricing_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Preisregel durchrechnen ohne zu speichern","description":"Rechnet die Kette für einen angenommenen Einstand (`costAmount`) und/oder aufgelösten Preis (`resolvedPrice`) durch, OHNE etwas zu speichern. Antwort: `result` mit `price`, `applied` und `reason` — inklusive der Begründung, welche Leitplanke gegriffen hat.","parameters":[{"name":"ulid","in":"path","description":"RepricingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new RepricingRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/RepricingRule-repricing_rule.write"}}},"required":true}}},"/api/v1/reserve-overrides":{"get":{"operationId":"api_v1reserve-overrides_get_collection","tags":["ReserveOverride"],"responses":{"200":{"description":"ReserveOverride collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReserveOverride-reserve.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReserveOverride.jsonld-reserve.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReserveOverride.jsonld-reserve.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReserveOverride resources.","description":"Retrieves the collection of ReserveOverride resources.","parameters":[]},"post":{"operationId":"api_v1reserve-overrides_post","tags":["ReserveOverride"],"responses":{"201":{"description":"ReserveOverride resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReserveOverride-reserve.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReserveOverride.jsonld-reserve.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReserveOverride resource.","description":"Creates a ReserveOverride resource.","parameters":[],"requestBody":{"description":"The new ReserveOverride resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReserveOverride-reserve.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReserveOverride-reserve.write"}}},"required":true}}},"/api/v1/reserve-overrides/{ulid}":{"get":{"operationId":"api_v1reserve-overrides_ulid_get","tags":["ReserveOverride"],"responses":{"200":{"description":"ReserveOverride resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReserveOverride-reserve.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReserveOverride.jsonld-reserve.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReserveOverride resource.","description":"Retrieves a ReserveOverride resource.","parameters":[{"name":"ulid","in":"path","description":"ReserveOverride identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1reserve-overrides_ulid_delete","tags":["ReserveOverride"],"responses":{"204":{"description":"ReserveOverride resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ReserveOverride resource.","description":"Removes the ReserveOverride resource.","parameters":[{"name":"ulid","in":"path","description":"ReserveOverride identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1reserve-overrides_ulid_patch","tags":["ReserveOverride"],"responses":{"200":{"description":"ReserveOverride resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReserveOverride-reserve.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReserveOverride.jsonld-reserve.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ReserveOverride resource.","description":"Updates the ReserveOverride resource.","parameters":[{"name":"ulid","in":"path","description":"ReserveOverride identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ReserveOverride resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ReserveOverride-reserve.update.jsonMergePatch"}}},"required":true}}},"/api/v1/resource-skills":{"get":{"operationId":"api_v1resource-skills_get_collection","tags":["ResourceSkillCatalog"],"responses":{"200":{"description":"ResourceSkillCatalog collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceSkillCatalog-resource_skill.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ResourceSkillCatalog.jsonld-resource_skill.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ResourceSkillCatalog.jsonld-resource_skill.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ResourceSkillCatalog resources.","description":"Retrieves the collection of ResourceSkillCatalog resources.","parameters":[{"name":"active","in":"query","description":"Nur aktive bzw. inaktive Skills","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"Case-insensitive Teilstring-Suche über Name und Code","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"search","in":"query","description":"Alias zu q (q hat Vorrang)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/return-orders":{"get":{"operationId":"api_v1return-orders_get_collection","tags":["ReturnOrder"],"responses":{"200":{"description":"ReturnOrder collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReturnOrder-return_order.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReturnOrder.jsonld-return_order.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReturnOrder.jsonld-return_order.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReturnOrder resources.","description":"Retrieves the collection of ReturnOrder resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"orderId","in":"query","description":"Auftrags-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Retouren-Nummer und Grund","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[number]","in":"query","description":"Sortierung nach Retouren-Nummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1return-orders_post","tags":["ReturnOrder"],"responses":{"201":{"description":"ReturnOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder.jsonld-return_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReturnOrder resource.","description":"Creates a ReturnOrder resource.","parameters":[],"requestBody":{"description":"The new ReturnOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}}},"required":true}}},"/api/v1/return-orders/{ulid}":{"get":{"operationId":"api_v1return-orders_ulid_get","tags":["ReturnOrder"],"responses":{"200":{"description":"ReturnOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder.jsonld-return_order.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReturnOrder resource.","description":"Retrieves a ReturnOrder resource.","parameters":[{"name":"ulid","in":"path","description":"ReturnOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/return-orders/{ulid}/approve":{"post":{"operationId":"shipping_return_order_approve","tags":["ReturnOrder"],"responses":{"201":{"description":"ReturnOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder.jsonld-return_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Approve return order","description":"Approve return order. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ReturnOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReturnOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}}},"required":true}}},"/api/v1/return-orders/{ulid}/item-outcome":{"post":{"operationId":"shipping_return_order_item_outcome","tags":["ReturnOrder"],"responses":{"201":{"description":"ReturnOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder.jsonld-return_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verwendung, Zustand und Grund je Retourenposition festhalten","description":"Payload `{items: {\"<Positions-ULID>\": {disposition?, condition?, restock?, reasonKey?}}}`. Getrennt vom Anlegen, weil es eine andere Person zu einer anderen Zeit tut: der Kunde meldet an, das Lager sieht die Ware. `disposition` (restock|resell|repair|scrap) zieht die Wiedereinlagerung mit — nur „zurück ins Lager\" bucht Bestand zu. Erlaubt bis einschließlich `received`; NACH dem Wareneingang wird ein Wechsel der Wiedereinlagerung gegengebucht (zurück ins Lager = Zugang, weg vom Lager = Abgang), damit Flag und Lagerbestand nicht auseinanderlaufen. Lagergeführte Artikel erlauben nur ganzzahlige Wiedereinlagerungs-Mengen (sonst 422).","parameters":[{"name":"ulid","in":"path","description":"ReturnOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReturnOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}}},"required":true}}},"/api/v1/return-orders/{ulid}/receive":{"post":{"operationId":"shipping_return_order_receive","tags":["ReturnOrder"],"responses":{"201":{"description":"ReturnOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder.jsonld-return_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Receive return order","description":"Receive return order. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"ReturnOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReturnOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}}},"required":true}}},"/api/v1/return-orders/{ulid}/refund":{"post":{"operationId":"shipping_return_order_refund","tags":["ReturnOrder"],"responses":{"201":{"description":"ReturnOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder.jsonld-return_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retoure erstatten","description":"Erstattet die Retoure und setzt das Gutschrift-Signal. Vorbedingung: die Retoure ist vereinnahmt (Status `received`), sonst 409.","parameters":[{"name":"ulid","in":"path","description":"ReturnOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReturnOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}}},"required":true}}},"/api/v1/return-orders/{ulid}/reject":{"post":{"operationId":"shipping_return_order_reject","tags":["ReturnOrder"],"responses":{"201":{"description":"ReturnOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder.jsonld-return_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retoure ablehnen","description":"Schließt den Retourenvorgang als `rejected`: es wird keine Ware zurückgenommen, nichts zugebucht und keine Gutschrift ausgelöst. Nur aus `requested` oder `approved` möglich (sonst 409); ein Wiederaufnehmen gibt es nicht — der Kunde braucht eine neue Retoure.","parameters":[{"name":"ulid","in":"path","description":"ReturnOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new ReturnOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnOrder-return_order.write"}}},"required":true}}},"/api/v1/return-reasons":{"get":{"operationId":"api_v1return-reasons_get_collection","tags":["ReturnReason"],"responses":{"200":{"description":"ReturnReason collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReturnReason-return_reason.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ReturnReason.jsonld-return_reason.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ReturnReason.jsonld-return_reason.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ReturnReason resources.","description":"Retrieves the collection of ReturnReason resources.","parameters":[{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Gründe","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"customerSelectable","in":"query","description":"Nur im Kundenportal wählbare (true) bzw. nur intern feststellbare (false) Gründe","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1return-reasons_post","tags":["ReturnReason"],"responses":{"201":{"description":"ReturnReason resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnReason-return_reason.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnReason.jsonld-return_reason.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ReturnReason resource.","description":"Creates a ReturnReason resource.","parameters":[],"requestBody":{"description":"The new ReturnReason resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnReason-return_reason.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnReason-return_reason.write"}}},"required":true}}},"/api/v1/return-reasons/{ulid}":{"get":{"operationId":"api_v1return-reasons_ulid_get","tags":["ReturnReason"],"responses":{"200":{"description":"ReturnReason resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnReason-return_reason.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnReason.jsonld-return_reason.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ReturnReason resource.","description":"Retrieves a ReturnReason resource.","parameters":[{"name":"ulid","in":"path","description":"ReturnReason identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1return-reasons_ulid_delete","tags":["ReturnReason"],"responses":{"204":{"description":"ReturnReason resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ReturnReason resource.","description":"Removes the ReturnReason resource.","parameters":[{"name":"ulid","in":"path","description":"ReturnReason identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1return-reasons_ulid_patch","tags":["ReturnReason"],"responses":{"200":{"description":"ReturnReason resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReturnReason-return_reason.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ReturnReason.jsonld-return_reason.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ReturnReason resource.","description":"Updates the ReturnReason resource.","parameters":[{"name":"ulid","in":"path","description":"ReturnReason identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ReturnReason resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ReturnReason-return_reason.write.jsonMergePatch"}}},"required":true}}},"/api/v1/roles":{"get":{"operationId":"api_v1roles_get_collection","tags":["Role"],"responses":{"200":{"description":"Role collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Role-role.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Role.jsonld-role.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Role.jsonld-role.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Role resources.","description":"Retrieves the collection of Role resources.","parameters":[{"name":"search","in":"query","description":"Suche über Rollenname und Beschreibung (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1roles_post","tags":["Role"],"responses":{"201":{"description":"Role resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role-role.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Role.jsonld-role.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Role resource.","description":"Creates a Role resource.","parameters":[],"requestBody":{"description":"The new Role resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role-role.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Role-role.write"}}},"required":true}}},"/api/v1/roles/{id}":{"get":{"operationId":"api_v1roles_id_get","tags":["Role"],"responses":{"200":{"description":"Role resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role-role.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Role.jsonld-role.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Role resource.","description":"Retrieves a Role resource.","parameters":[{"name":"id","in":"path","description":"Role identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1roles_id_delete","tags":["Role"],"responses":{"204":{"description":"Role resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Role resource.","description":"Removes the Role resource.","parameters":[{"name":"id","in":"path","description":"Role identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1roles_id_patch","tags":["Role"],"responses":{"200":{"description":"Role resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role-role.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Role.jsonld-role.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Role resource.","description":"Updates the Role resource.","parameters":[{"name":"id","in":"path","description":"Role identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Role resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Role-role.write.jsonMergePatch"}}},"required":true}}},"/api/v1/ticket-rule-suggestions":{"get":{"operationId":"api_v1ticket-rule-suggestions_get_collection","tags":["RuleSuggestion"],"responses":{"200":{"description":"RuleSuggestion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RuleSuggestion-rule_suggestion.read"}}},"application/ld+json":{"schema":{"type":"object","description":"RuleSuggestion.jsonld-rule_suggestion.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/RuleSuggestion.jsonld-rule_suggestion.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of RuleSuggestion resources.","description":"Retrieves the collection of RuleSuggestion resources.","parameters":[]}},"/api/v1/channels/channels":{"get":{"operationId":"api_v1channelschannels_get_collection","tags":["SalesChannel"],"responses":{"200":{"description":"SalesChannel collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SalesChannel.jsonld-sales_channel.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SalesChannel resources.","description":"Retrieves the collection of SalesChannel resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Kanäle","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"connectorType","in":"query","description":"Konnektor-Typ (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"channelKey","in":"query","description":"Kanal-Schlüssel (exakter Match) — der Weg vom bekannten Schlüssel zur ULID, u. a. für Connect-Flows","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Schlüssel und Name","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1channelschannels_post","tags":["SalesChannel"],"responses":{"201":{"description":"SalesChannel resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SalesChannel resource.","description":"Legt einen Kanal an. Er entsteht INAKTIV — ein Kanal, der mit dem ersten POST scharf ist, geht in dem Moment gegen ein Fremdsystem, in dem jemand ihn halb fertig speichert.","parameters":[],"requestBody":{"description":"The new SalesChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}}},"required":true}}},"/api/v1/channels/channels/{ulid}":{"get":{"operationId":"api_v1channelschannels_ulid_get","tags":["SalesChannel"],"responses":{"200":{"description":"SalesChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SalesChannel resource.","description":"Retrieves a SalesChannel resource.","parameters":[{"name":"ulid","in":"path","description":"SalesChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1channelschannels_ulid_delete","tags":["SalesChannel"],"responses":{"204":{"description":"SalesChannel resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SalesChannel resource.","description":"Removes the SalesChannel resource.","parameters":[{"name":"ulid","in":"path","description":"SalesChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1channelschannels_ulid_patch","tags":["SalesChannel"],"responses":{"200":{"description":"SalesChannel resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SalesChannel resource.","description":"Updates the SalesChannel resource.","parameters":[{"name":"ulid","in":"path","description":"SalesChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SalesChannel resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write.jsonMergePatch"}}},"required":true}}},"/api/v1/channels/channels/{ulid}/activate":{"post":{"operationId":"channels_channel_activate","tags":["SalesChannel"],"responses":{"201":{"description":"SalesChannel resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Activate channel","description":"Activate channel. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"SalesChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}}},"required":true}}},"/api/v1/channels/channels/{ulid}/deactivate":{"post":{"operationId":"channels_channel_deactivate","tags":["SalesChannel"],"responses":{"201":{"description":"SalesChannel resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Deactivate channel","description":"Deactivate channel. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"SalesChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}}},"required":true}}},"/api/v1/channels/channels/{ulid}/orders":{"post":{"operationId":"channels_channel_import_orders","tags":["SalesChannel"],"responses":{"201":{"description":"SalesChannel resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kanal-Bestellungen als Aufträge übernehmen","description":"Übernimmt bereits zugeordnete Bestellungen dieses Kanals als Aufträge (`orders` = eine Bestellung oder eine Liste). Der Weg für Shop-Webhooks und eigene Zuordnungen: ein Connect-Flow ordnet die Felder des Fremdsystems zu und ruft diese Operation über `octibiz_api` auf. Idempotent über (Kanal, Fremd-Kennung) — eine doppelt gemeldete Bestellung wird übersprungen, nicht doppelt angelegt.","parameters":[{"name":"ulid","in":"path","description":"SalesChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}}},"required":true}}},"/api/v1/channels/channels/{ulid}/sync":{"post":{"operationId":"channels_channel_sync","tags":["SalesChannel"],"responses":{"201":{"description":"SalesChannel resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sync channel","description":"Sync channel. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"SalesChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}}},"required":true}}},"/api/v1/channels/channels/{ulid}/test-connection":{"post":{"operationId":"channels_channel_test","tags":["SalesChannel"],"responses":{"201":{"description":"SalesChannel resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel.jsonld-sales_channel.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kanal-Verbindung prüfen","description":"Prüft die Verbindung, ohne etwas zu verändern. Antwort: `valid` + `errors`.","parameters":[{"name":"ulid","in":"path","description":"SalesChannel identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesChannel resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesChannel-sales_channel.write"}}},"required":true}}},"/api/v1/sales-goals":{"get":{"operationId":"api_v1sales-goals_get_collection","tags":["SalesGoal"],"responses":{"200":{"description":"SalesGoal collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesGoal-sales_goal.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SalesGoal.jsonld-sales_goal.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SalesGoal.jsonld-sales_goal.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SalesGoal resources.","description":"Retrieves the collection of SalesGoal resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1sales-goals_post","tags":["SalesGoal"],"responses":{"201":{"description":"SalesGoal resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesGoal-sales_goal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesGoal.jsonld-sales_goal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SalesGoal resource.","description":"Creates a SalesGoal resource.","parameters":[],"requestBody":{"description":"The new SalesGoal resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesGoal-sales_goal.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesGoal-sales_goal.write"}}},"required":true}}},"/api/v1/sales-goals/{ulid}":{"get":{"operationId":"api_v1sales-goals_ulid_get","tags":["SalesGoal"],"responses":{"200":{"description":"SalesGoal resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesGoal-sales_goal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesGoal.jsonld-sales_goal.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SalesGoal resource.","description":"Retrieves a SalesGoal resource.","parameters":[{"name":"ulid","in":"path","description":"SalesGoal identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sales-goals_ulid_delete","tags":["SalesGoal"],"responses":{"204":{"description":"SalesGoal resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SalesGoal resource.","description":"Removes the SalesGoal resource.","parameters":[{"name":"ulid","in":"path","description":"SalesGoal identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sales-goals_ulid_patch","tags":["SalesGoal"],"responses":{"200":{"description":"SalesGoal resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesGoal-sales_goal.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesGoal.jsonld-sales_goal.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SalesGoal resource.","description":"Updates the SalesGoal resource.","parameters":[{"name":"ulid","in":"path","description":"SalesGoal identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SalesGoal resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SalesGoal-sales_goal.write.jsonMergePatch"}}},"required":true}}},"/api/v1/sales-goals/roll-recurring":{"post":{"operationId":"sales_goals_roll_recurring","tags":["SalesGoalRoll"],"responses":{"201":{"description":"SalesGoalRoll resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesGoalRoll-sales_goal_roll.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesGoalRoll.jsonld-sales_goal_roll.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SalesGoalRoll resource.","description":"Creates a SalesGoalRoll resource.","parameters":[],"requestBody":{"description":"The new SalesGoalRoll resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesGoalRoll-sales_goal_roll.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesGoalRoll-sales_goal_roll.write"}}},"required":true}}},"/api/v1/sales-orders":{"get":{"operationId":"api_v1sales-orders_get_collection","tags":["SalesOrder"],"responses":{"200":{"description":"SalesOrder collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SalesOrder.jsonld-sales_order.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SalesOrder resources.","description":"Retrieves the collection of SalesOrder resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Auftrags-Status (exakter Match oder Komma-Liste, z.B. confirmed,partially_delivered)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Auftragsnummer und Kundenname","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[number]","in":"query","description":"Sortierung nach Auftragsnummer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[totalAmount]","in":"query","description":"Sortierung nach Gesamtsumme (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[orderedAt]","in":"query","description":"Sortierung nach Bestelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sales-orders_post","tags":["SalesOrder"],"responses":{"201":{"description":"SalesOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SalesOrder resource.","description":"Creates a SalesOrder resource.","parameters":[],"requestBody":{"description":"The new SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}}},"required":true}}},"/api/v1/sales-orders/from-quote":{"post":{"operationId":"sales_order_from_quote","tags":["SalesOrder"],"responses":{"201":{"description":"SalesOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Create sales order from a quote","description":"Create sales order from a quote. Dedicated action endpoint — not a standard CRUD create.","parameters":[],"requestBody":{"description":"The new SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}":{"get":{"operationId":"api_v1sales-orders_ulid_get","tags":["SalesOrder"],"responses":{"200":{"description":"SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SalesOrder resource.","description":"Retrieves a SalesOrder resource.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sales-orders_ulid_delete","tags":["SalesOrder"],"responses":{"204":{"description":"SalesOrder resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SalesOrder resource.","description":"Removes the SalesOrder resource.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sales-orders_ulid_patch","tags":["SalesOrder"],"responses":{"200":{"description":"SalesOrder resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SalesOrder resource.","description":"Updates the SalesOrder resource.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SalesOrder resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write.jsonMergePatch"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/cancel":{"post":{"operationId":"sales_order_cancel","tags":["SalesOrder"],"responses":{"201":{"description":"SalesOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel sales order","description":"Cancel sales order. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/confirm":{"post":{"operationId":"sales_order_confirm","tags":["SalesOrder"],"responses":{"201":{"description":"SalesOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Auftrag bestätigen","description":"Bestätigt den Auftrag (Entwurf wird bestätigt). Ab hier greifen PATCH und DELETE nicht mehr.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/payment-received":{"post":{"operationId":"sales_order_payment_received","tags":["SalesOrder"],"responses":{"201":{"description":"SalesOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zahlungseingang am Auftrag vermerken","description":"Vermerkt den Zahlungseingang am Auftrag.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/pdf":{"get":{"operationId":"sales_order_pdf","tags":["SalesOrder"],"responses":{"204":{"description":"SalesOrder resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SalesOrder resource.","description":"Retrieves a SalesOrder resource.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/sales-orders/{ulid}/record-delivery":{"post":{"operationId":"sales_order_record_delivery","tags":["SalesOrder"],"responses":{"201":{"description":"SalesOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferung am Auftrag vermerken","description":"Vermerkt die Lieferung am Auftrag — ohne Lieferschein und ohne Bestandsbuchung.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/record-invoiced":{"post":{"operationId":"sales_order_record_invoiced","tags":["SalesOrder"],"responses":{"201":{"description":"SalesOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Auftrag als fakturiert vermerken","description":"Vermerkt den Auftrag als fakturiert.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/send-confirmation":{"post":{"operationId":"sales_order_send_confirmation","tags":["SalesOrder"],"responses":{"201":{"description":"SalesOrder resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder.jsonld-sales_order.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Auftragsbestätigung verschicken","description":"Verschickt die Auftragsbestätigung per Mail mit PDF-Anhang und setzt `confirmationSentAt`. Die Antwort trägt `mailSent`.","parameters":[{"name":"ulid","in":"path","description":"SalesOrder identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrder resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrder-sales_order.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/release-shipping":{"post":{"operationId":"sales_order_release_shipping","tags":["SalesOrderShippingReadiness"],"responses":{"201":{"description":"SalesOrderShippingReadiness resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness.jsonld-shipping_readiness.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Versand trotz roter Ampel freigeben","description":"Manuelle Versandfreigabe trotz roter Ampel. Hebt NUR die Regel-Kriterien auf (Zahlung, Liefersperre) — fehlender Bestand und eine unbrauchbare Adresse bleiben rot. `reason` ist Pflicht.","parameters":[{"name":"ulid","in":"path","description":"SalesOrderShippingReadiness identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrderShippingReadiness resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/shipping-charge":{"post":{"operationId":"sales_order_shipping_charge","tags":["SalesOrderShippingReadiness"],"responses":{"201":{"description":"SalesOrderShippingReadiness resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness.jsonld-shipping_readiness.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Versandkosten berechnen und als Position setzen","description":"Berechnet die Versandkosten nach den Versandregeln und schreibt sie als Position auf den Auftrag. Eine vorhandene Versandzeile wird ersetzt, nicht ergänzt. Greift keine Regel, passiert nichts.","parameters":[{"name":"ulid","in":"path","description":"SalesOrderShippingReadiness identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrderShippingReadiness resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/shipping-readiness":{"get":{"operationId":"api_v1sales-orders_ulidshipping-readiness_get","tags":["SalesOrderShippingReadiness"],"responses":{"200":{"description":"SalesOrderShippingReadiness resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness.jsonld-shipping_readiness.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SalesOrderShippingReadiness resource.","description":"Ampel-Urteil je Kriterium (payment · stock · address · delivery_block + Plugin-Beiträge) samt Gesamtstatus green/yellow/red.","parameters":[{"name":"ulid","in":"path","description":"SalesOrderShippingReadiness identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/sales-orders/{ulid}/withdraw-shipping-release":{"post":{"operationId":"sales_order_withdraw_shipping_release","tags":["SalesOrderShippingReadiness"],"responses":{"201":{"description":"SalesOrderShippingReadiness resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness.jsonld-shipping_readiness.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Manuelle Versandfreigabe zurücknehmen","description":"Nimmt eine manuelle Versandfreigabe zurück.","parameters":[{"name":"ulid","in":"path","description":"SalesOrderShippingReadiness identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrderShippingReadiness resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderShippingReadiness-shipping_readiness.write"}}},"required":true}}},"/api/v1/sales-orders/statuses":{"get":{"operationId":"api_v1sales-ordersstatuses_get_collection","tags":["SalesOrderStatus"],"responses":{"200":{"description":"SalesOrderStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesOrderStatus-sales_order_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SalesOrderStatus.jsonld-sales_order_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SalesOrderStatus.jsonld-sales_order_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SalesOrderStatus resources.","description":"Retrieves the collection of SalesOrderStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1sales-ordersstatuses_post","tags":["SalesOrderStatus"],"responses":{"201":{"description":"SalesOrderStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus-sales_order_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus.jsonld-sales_order_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SalesOrderStatus resource.","description":"Creates a SalesOrderStatus resource.","parameters":[],"requestBody":{"description":"The new SalesOrderStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus-sales_order_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus-sales_order_status.write"}}},"required":true}}},"/api/v1/sales-orders/statuses/{key}":{"get":{"operationId":"api_v1sales-ordersstatuses_key_get","tags":["SalesOrderStatus"],"responses":{"200":{"description":"SalesOrderStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus-sales_order_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus.jsonld-sales_order_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SalesOrderStatus resource.","description":"Retrieves a SalesOrderStatus resource.","parameters":[{"name":"key","in":"path","description":"SalesOrderStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sales-ordersstatuses_key_delete","tags":["SalesOrderStatus"],"responses":{"204":{"description":"SalesOrderStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SalesOrderStatus resource.","description":"Removes the SalesOrderStatus resource.","parameters":[{"name":"key","in":"path","description":"SalesOrderStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sales-ordersstatuses_key_patch","tags":["SalesOrderStatus"],"responses":{"200":{"description":"SalesOrderStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus-sales_order_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus.jsonld-sales_order_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SalesOrderStatus resource.","description":"Updates the SalesOrderStatus resource.","parameters":[{"name":"key","in":"path","description":"SalesOrderStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SalesOrderStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SalesOrderStatus-sales_order_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/redeem-voucher":{"post":{"operationId":"sales_order_redeem_voucher","tags":["SalesOrderVoucher"],"responses":{"201":{"description":"SalesOrderVoucher resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher-sales_order_voucher.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher.jsonld-sales_order_voucher.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Gutschein auf dem Auftrag einlösen","description":"Löst einen Gutschein-Code auf dem Auftrag ein und schreibt ihn als Position — bei mehreren Steuersätzen je Satz eine Zeile, damit die USt-Aufschlüsselung stimmt. Nur solange der Auftrag bearbeitbar ist. Derselbe Code ein zweites Mal auf demselben Auftrag: 422.","parameters":[{"name":"ulid","in":"path","description":"SalesOrderVoucher identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrderVoucher resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher-sales_order_voucher.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher-sales_order_voucher.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/revoke-voucher":{"post":{"operationId":"sales_order_revoke_voucher","tags":["SalesOrderVoucher"],"responses":{"201":{"description":"SalesOrderVoucher resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher-sales_order_voucher.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher.jsonld-sales_order_voucher.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Gutschein-Einlösung zurücknehmen","description":"Nimmt eine Gutschein-Einlösung zurück: entfernt die Gutschein-Positionen vom Auftrag (der Auftragswert steigt entsprechend) und gibt den Wert an den Gutschein zurück.","parameters":[{"name":"ulid","in":"path","description":"SalesOrderVoucher identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesOrderVoucher resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher-sales_order_voucher.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher-sales_order_voucher.write"}}},"required":true}}},"/api/v1/sales-orders/{ulid}/vouchers":{"get":{"operationId":"api_v1sales-orders_ulidvouchers_get","tags":["SalesOrderVoucher"],"responses":{"200":{"description":"SalesOrderVoucher resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher-sales_order_voucher.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesOrderVoucher.jsonld-sales_order_voucher.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SalesOrderVoucher resource.","description":"Welche Gutscheine liegen offen auf diesem Auftrag? Die Auskunft kommt aus dem Gutschein-Hauptbuch, nicht aus den Positions-Beschreibungen. Ohne Gutschein-Plugin eine leere Liste.","parameters":[{"name":"ulid","in":"path","description":"SalesOrderVoucher identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/crm/sales-sequences":{"get":{"operationId":"api_v1crmsales-sequences_get_collection","tags":["SalesSequence"],"responses":{"200":{"description":"SalesSequence collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SalesSequence.jsonld-sales_sequence.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SalesSequence.jsonld-sales_sequence.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SalesSequence resources.","description":"Retrieves the collection of SalesSequence resources.","parameters":[]},"post":{"operationId":"api_v1crmsales-sequences_post","tags":["SalesSequence"],"responses":{"201":{"description":"SalesSequence resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesSequence.jsonld-sales_sequence.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SalesSequence resource.","description":"Creates a SalesSequence resource.","parameters":[],"requestBody":{"description":"The new SalesSequence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.write"}}},"required":true}}},"/api/v1/crm/sales-sequences/{ulid}":{"get":{"operationId":"api_v1crmsales-sequences_ulid_get","tags":["SalesSequence"],"responses":{"200":{"description":"SalesSequence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesSequence.jsonld-sales_sequence.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SalesSequence resource.","description":"Retrieves a SalesSequence resource.","parameters":[{"name":"ulid","in":"path","description":"SalesSequence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1crmsales-sequences_ulid_delete","tags":["SalesSequence"],"responses":{"204":{"description":"SalesSequence resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SalesSequence resource.","description":"Removes the SalesSequence resource.","parameters":[{"name":"ulid","in":"path","description":"SalesSequence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1crmsales-sequences_ulid_patch","tags":["SalesSequence"],"responses":{"200":{"description":"SalesSequence resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesSequence.jsonld-sales_sequence.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SalesSequence resource.","description":"Updates the SalesSequence resource.","parameters":[{"name":"ulid","in":"path","description":"SalesSequence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SalesSequence resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.write.jsonMergePatch"}}},"required":true}}},"/api/v1/crm/sales-sequences/{ulid}/enroll":{"post":{"operationId":"sales_sequence_enroll","tags":["SalesSequence"],"responses":{"201":{"description":"SalesSequence resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesSequence.jsonld-sales_sequence.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Deal oder Lead in die Sequence einschreiben","description":"Schreibt einen Deal oder Lead in diese Sequence ein und plant deren Schritte ein.","parameters":[{"name":"ulid","in":"path","description":"SalesSequence identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SalesSequence resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SalesSequence-sales_sequence.write"}}},"required":true}}},"/api/v1/ticket-saved-views":{"get":{"operationId":"api_v1ticket-saved-views_get_collection","tags":["SavedView"],"responses":{"200":{"description":"SavedView collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SavedView-saved_view.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SavedView.jsonld-saved_view.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SavedView.jsonld-saved_view.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SavedView resources.","description":"Retrieves the collection of SavedView resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-saved-views_post","tags":["SavedView"],"responses":{"201":{"description":"SavedView resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedView-saved_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SavedView.jsonld-saved_view.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SavedView resource.","description":"Creates a SavedView resource.","parameters":[],"requestBody":{"description":"The new SavedView resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedView-saved_view.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SavedView-saved_view.write"}}},"required":true}}},"/api/v1/ticket-saved-views/{ulid}":{"get":{"operationId":"api_v1ticket-saved-views_ulid_get","tags":["SavedView"],"responses":{"200":{"description":"SavedView resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedView-saved_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SavedView.jsonld-saved_view.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SavedView resource.","description":"Retrieves a SavedView resource.","parameters":[{"name":"ulid","in":"path","description":"SavedView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-saved-views_ulid_delete","tags":["SavedView"],"responses":{"204":{"description":"SavedView resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SavedView resource.","description":"Removes the SavedView resource.","parameters":[{"name":"ulid","in":"path","description":"SavedView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-saved-views_ulid_patch","tags":["SavedView"],"responses":{"200":{"description":"SavedView resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedView-saved_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SavedView.jsonld-saved_view.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SavedView resource.","description":"Updates the SavedView resource.","parameters":[{"name":"ulid","in":"path","description":"SavedView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SavedView resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SavedView-saved_view.write.jsonMergePatch"}}},"required":true}}},"/api/v1/scenarios":{"get":{"operationId":"api_v1scenarios_get_collection","tags":["Scenario"],"responses":{"200":{"description":"Scenario collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Scenario-scenario.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Scenario.jsonld-scenario.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Scenario resources.","description":"Retrieves the collection of Scenario resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Name und Notiz","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"order[baseAsOf]","in":"query","description":"Sortierung nach Stichtag","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true}]},"post":{"operationId":"api_v1scenarios_post","tags":["Scenario"],"responses":{"201":{"description":"Scenario resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Scenario resource.","description":"Creates a Scenario resource.","parameters":[],"requestBody":{"description":"The new Scenario resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.write"}}},"required":true}}},"/api/v1/scenarios/{ulid}":{"get":{"operationId":"api_v1scenarios_ulid_get","tags":["Scenario"],"responses":{"200":{"description":"Scenario resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Scenario resource.","description":"Retrieves a Scenario resource.","parameters":[{"name":"ulid","in":"path","description":"Scenario identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1scenarios_ulid_delete","tags":["Scenario"],"responses":{"204":{"description":"Scenario resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Scenario resource.","description":"Removes the Scenario resource.","parameters":[{"name":"ulid","in":"path","description":"Scenario identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1scenarios_ulid_patch","tags":["Scenario"],"responses":{"200":{"description":"Scenario resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Scenario resource.","description":"Updates the Scenario resource.","parameters":[{"name":"ulid","in":"path","description":"Scenario identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Scenario resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.write.jsonMergePatch"}}},"required":true}}},"/api/v1/scenarios/{ulid}/allocations":{"post":{"operationId":"scenario_add_allocation","tags":["Scenario"],"responses":{"201":{"description":"Scenario resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Planzeile im Szenario anlegen","description":"Legt eine Allocation INNERHALB des Szenarios an. Die Produktivplanung bleibt unberührt, bis das Szenario übernommen wird.","parameters":[{"name":"ulid","in":"path","description":"Scenario identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Scenario resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.action"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.action"}}},"required":true}}},"/api/v1/scenarios/{ulid}/apply":{"post":{"operationId":"scenario_apply","tags":["Scenario"],"responses":{"201":{"description":"Scenario resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Szenario in die Produktivplanung übernehmen","description":"Überträgt das Szenario transaktional in die Produktivplanung — ab hier wirkt es echt.","parameters":[{"name":"ulid","in":"path","description":"Scenario identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Scenario resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.action"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.action"}}},"required":true}}},"/api/v1/scenarios/{ulid}/compare":{"get":{"operationId":"scenario_compare","tags":["Scenario"],"responses":{"200":{"description":"Scenario resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Scenario resource.","description":"Retrieves a Scenario resource.","parameters":[{"name":"ulid","in":"path","description":"Scenario identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"from","in":"query","description":"Beginn des Vergleichszeitraums (YYYY-MM-DD).","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Ende des Vergleichszeitraums (YYYY-MM-DD).","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"granularity","in":"query","description":"Auflösung der Vergleichsreihe (z. B. week|month).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/scenarios/{ulid}/discard":{"post":{"operationId":"scenario_discard","tags":["Scenario"],"responses":{"201":{"description":"Scenario resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Planungsszenario verwerfen","description":"Setzt den Entwurf endgültig auf `discarded` — er lässt sich danach weder bearbeiten noch übernehmen (`/apply`). Nur aus dem Entwurfs-Zustand möglich (sonst 409); produktive Allocations bleiben unverändert.","parameters":[{"name":"ulid","in":"path","description":"Scenario identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Scenario resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.action"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.action"}}},"required":true}}},"/api/v1/scenarios/{ulid}/remove-allocation":{"post":{"operationId":"scenario_remove_allocation","tags":["Scenario"],"responses":{"201":{"description":"Scenario resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario.jsonld-scenario.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Planungszeile aus dem Szenario löschen","description":"Pflichtfeld `scenarioAllocationUlid`. Entfernt die Zeile ersatzlos aus dem Szenario-Entwurf — die Auslastungsrechnung des Szenarios ändert sich sofort. Produktive Allocations bleiben unberührt, solange das Szenario nicht übernommen wurde.","parameters":[{"name":"ulid","in":"path","description":"Scenario identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Scenario resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.action"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Scenario-scenario.action"}}},"required":true}}},"/api/v1/scheduling/appointments":{"get":{"operationId":"api_v1schedulingappointments_get_collection","tags":["SchedulingAppointment"],"responses":{"200":{"description":"SchedulingAppointment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingAppointment.jsonld-sched_appointment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingAppointment.jsonld-sched_appointment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingAppointment resources.","description":"Retrieves the collection of SchedulingAppointment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"host","in":"query","description":"Gastgeber (Mitarbeiter-ULID); unbekannte ULID ⇒ leere Liste","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"eventType","in":"query","description":"Termintyp (ULID); unbekannt oder fremde Marke ⇒ leere Liste","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Frühester Beginn; reines Datum (YYYY-MM-DD) = Beginn dieses Kalendertags in Europe/Berlin, sonst ISO-8601-Zeitpunkt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"to","in":"query","description":"Spätester Beginn (einschließlich); reines Datum (YYYY-MM-DD) = Ende dieses Kalendertags in Europe/Berlin, sonst ISO-8601-Zeitpunkt","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Terminstatus (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Name und E-Mail der Teilnehmer (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/scheduling/appointments/{ulid}":{"get":{"operationId":"api_v1schedulingappointments_ulid_get","tags":["SchedulingAppointment"],"responses":{"200":{"description":"SchedulingAppointment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment.jsonld-sched_appointment.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SchedulingAppointment resource.","description":"Retrieves a SchedulingAppointment resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingAppointment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/scheduling/appointments/{ulid}/cancel":{"post":{"operationId":"scheduling_appointment_cancel","tags":["SchedulingAppointment"],"responses":{"200":{"description":"SchedulingAppointment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment.jsonld-sched_appointment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel appointment","description":"Cancel appointment. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"SchedulingAppointment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SchedulingAppointment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.cancel"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.cancel"}}},"required":true}}},"/api/v1/scheduling/appointments/{ulid}/complete":{"post":{"operationId":"scheduling_appointment_complete","tags":["SchedulingAppointment"],"responses":{"200":{"description":"SchedulingAppointment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment.jsonld-sched_appointment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Termin als stattgefunden abschließen","description":"Schließt den Termin als stattgefunden ab. Ein Rumpf ist nicht nötig.","parameters":[{"name":"ulid","in":"path","description":"SchedulingAppointment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SchedulingAppointment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment"}}},"required":true}}},"/api/v1/scheduling/appointments/{ulid}/no-show":{"post":{"operationId":"scheduling_appointment_no_show","tags":["SchedulingAppointment"],"responses":{"200":{"description":"SchedulingAppointment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment.jsonld-sched_appointment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Termin als nicht wahrgenommen vermerken","description":"Vermerkt den Termin als nicht wahrgenommen. Ein Rumpf ist nicht nötig.","parameters":[{"name":"ulid","in":"path","description":"SchedulingAppointment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SchedulingAppointment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment"}}},"required":true}}},"/api/v1/scheduling/appointments/{ulid}/reschedule":{"post":{"operationId":"scheduling_appointment_reschedule","tags":["SchedulingAppointment"],"responses":{"200":{"description":"SchedulingAppointment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment.jsonld-sched_appointment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Termin verlegen","description":"Verlegt den Termin auf einen neuen Zeitpunkt und benachrichtigt die Teilnehmer.","parameters":[{"name":"ulid","in":"path","description":"SchedulingAppointment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SchedulingAppointment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.reschedule"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingAppointment-sched_appointment.reschedule"}}},"required":true}}},"/api/v1/scheduling/calendar-connections/{ulid}/calendars":{"get":{"operationId":"api_v1schedulingcalendar-connections_ulidcalendars_get_collection","tags":["SchedulingAvailableCalendar"],"responses":{"200":{"description":"SchedulingAvailableCalendar collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingAvailableCalendar-sched_available_calendar.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingAvailableCalendar.jsonld-sched_available_calendar.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingAvailableCalendar.jsonld-sched_available_calendar.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingAvailableCalendar resources.","description":"Retrieves the collection of SchedulingAvailableCalendar resources.","parameters":[{"name":"id","in":"path","description":"SchedulingAvailableCalendar identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/scheduling/booking-pages":{"get":{"operationId":"api_v1schedulingbooking-pages_get_collection","tags":["SchedulingBookingPage"],"responses":{"200":{"description":"SchedulingBookingPage collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingBookingPage-sched_booking_page.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingBookingPage.jsonld-sched_booking_page.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingBookingPage.jsonld-sched_booking_page.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingBookingPage resources.","description":"Retrieves the collection of SchedulingBookingPage resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Titel und Slug der Buchungsseite (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[slug]","in":"query","description":"Sortierung nach Slug (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1schedulingbooking-pages_post","tags":["SchedulingBookingPage"],"responses":{"201":{"description":"SchedulingBookingPage resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage-sched_booking_page.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage.jsonld-sched_booking_page.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingBookingPage resource.","description":"Creates a SchedulingBookingPage resource.","parameters":[],"requestBody":{"description":"The new SchedulingBookingPage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage-sched_booking_page.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage-sched_booking_page.write"}}},"required":true}}},"/api/v1/scheduling/booking-pages/{ulid}":{"get":{"operationId":"api_v1schedulingbooking-pages_ulid_get","tags":["SchedulingBookingPage"],"responses":{"200":{"description":"SchedulingBookingPage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage-sched_booking_page.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage.jsonld-sched_booking_page.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SchedulingBookingPage resource.","description":"Retrieves a SchedulingBookingPage resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingBookingPage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1schedulingbooking-pages_ulid_delete","tags":["SchedulingBookingPage"],"responses":{"204":{"description":"SchedulingBookingPage resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SchedulingBookingPage resource.","description":"Removes the SchedulingBookingPage resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingBookingPage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1schedulingbooking-pages_ulid_patch","tags":["SchedulingBookingPage"],"responses":{"200":{"description":"SchedulingBookingPage resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage-sched_booking_page.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage.jsonld-sched_booking_page.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SchedulingBookingPage resource.","description":"Updates the SchedulingBookingPage resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingBookingPage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SchedulingBookingPage resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SchedulingBookingPage-sched_booking_page.write.jsonMergePatch"}}},"required":true}}},"/api/v1/scheduling/caldav-discovery":{"post":{"operationId":"api_v1schedulingcaldav-discovery_post","tags":["SchedulingCalDavDiscovery"],"responses":{"201":{"description":"SchedulingCalDavDiscovery resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingCalDavDiscovery-sched_caldav_discovery.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalDavDiscovery.jsonld-sched_caldav_discovery.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingCalDavDiscovery resource.","description":"Creates a SchedulingCalDavDiscovery resource.","parameters":[],"requestBody":{"description":"The new SchedulingCalDavDiscovery resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingCalDavDiscovery-sched_caldav_discovery.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalDavDiscovery-sched_caldav_discovery.write"}}},"required":true}}},"/api/v1/scheduling/calendar-connections":{"get":{"operationId":"api_v1schedulingcalendar-connections_get_collection","tags":["SchedulingCalendarConnection"],"responses":{"200":{"description":"SchedulingCalendarConnection collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingCalendarConnection.jsonld-sched_connection.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingCalendarConnection.jsonld-sched_connection.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingCalendarConnection resources.","description":"Retrieves the collection of SchedulingCalendarConnection resources.","parameters":[]}},"/api/v1/scheduling/calendar-connections/caldav":{"post":{"operationId":"api_v1schedulingcalendar-connectionscaldav_post","tags":["SchedulingCalendarConnection"],"responses":{"201":{"description":"SchedulingCalendarConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection.jsonld-sched_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingCalendarConnection resource.","description":"Creates a SchedulingCalendarConnection resource.","parameters":[],"requestBody":{"description":"The new SchedulingCalendarConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.write"}}},"required":true}}},"/api/v1/scheduling/calendar-connections/ics":{"post":{"operationId":"api_v1schedulingcalendar-connectionsics_post","tags":["SchedulingCalendarConnection"],"responses":{"201":{"description":"SchedulingCalendarConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection.jsonld-sched_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingCalendarConnection resource.","description":"Creates a SchedulingCalendarConnection resource.","parameters":[],"requestBody":{"description":"The new SchedulingCalendarConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.write"}}},"required":true}}},"/api/v1/scheduling/calendar-connections/{ulid}":{"get":{"operationId":"api_v1schedulingcalendar-connections_ulid_get","tags":["SchedulingCalendarConnection"],"responses":{"200":{"description":"SchedulingCalendarConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection.jsonld-sched_connection.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SchedulingCalendarConnection resource.","description":"Retrieves a SchedulingCalendarConnection resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingCalendarConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1schedulingcalendar-connections_ulid_delete","tags":["SchedulingCalendarConnection"],"responses":{"204":{"description":"SchedulingCalendarConnection resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SchedulingCalendarConnection resource.","description":"Removes the SchedulingCalendarConnection resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingCalendarConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1schedulingcalendar-connections_ulid_patch","tags":["SchedulingCalendarConnection"],"responses":{"200":{"description":"SchedulingCalendarConnection resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection.jsonld-sched_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SchedulingCalendarConnection resource.","description":"Updates the SchedulingCalendarConnection resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingCalendarConnection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SchedulingCalendarConnection resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SchedulingCalendarConnection-sched_connection.update.jsonMergePatch"}}},"required":true}}},"/api/v1/scheduling/date-overrides":{"get":{"operationId":"api_v1schedulingdate-overrides_get_collection","tags":["SchedulingDateOverride"],"responses":{"200":{"description":"SchedulingDateOverride collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingDateOverride-sched_override.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingDateOverride.jsonld-sched_override.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingDateOverride.jsonld-sched_override.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingDateOverride resources.","description":"Retrieves the collection of SchedulingDateOverride resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"schedule","in":"query","description":"Zeitplan (ULID). Faktisch Pflicht: ohne Angabe — und bei unbekanntem oder fremdem Zeitplan — bleibt die Liste leer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1schedulingdate-overrides_post","tags":["SchedulingDateOverride"],"responses":{"201":{"description":"SchedulingDateOverride resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride-sched_override.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride.jsonld-sched_override.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingDateOverride resource.","description":"Creates a SchedulingDateOverride resource.","parameters":[],"requestBody":{"description":"The new SchedulingDateOverride resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride-sched_override.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride-sched_override.write"}}},"required":true}}},"/api/v1/scheduling/date-overrides/{ulid}":{"get":{"operationId":"api_v1schedulingdate-overrides_ulid_get","tags":["SchedulingDateOverride"],"responses":{"200":{"description":"SchedulingDateOverride resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride-sched_override.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride.jsonld-sched_override.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SchedulingDateOverride resource.","description":"Retrieves a SchedulingDateOverride resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingDateOverride identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1schedulingdate-overrides_ulid_delete","tags":["SchedulingDateOverride"],"responses":{"204":{"description":"SchedulingDateOverride resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SchedulingDateOverride resource.","description":"Removes the SchedulingDateOverride resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingDateOverride identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1schedulingdate-overrides_ulid_patch","tags":["SchedulingDateOverride"],"responses":{"200":{"description":"SchedulingDateOverride resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride-sched_override.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride.jsonld-sched_override.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SchedulingDateOverride resource.","description":"Updates the SchedulingDateOverride resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingDateOverride identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SchedulingDateOverride resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SchedulingDateOverride-sched_override.write.jsonMergePatch"}}},"required":true}}},"/api/v1/scheduling/event-types":{"get":{"operationId":"api_v1schedulingevent-types_get_collection","tags":["SchedulingEventType"],"responses":{"200":{"description":"SchedulingEventType collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingEventType-sched_event_type.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingEventType.jsonld-sched_event_type.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingEventType.jsonld-sched_event_type.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingEventType resources.","description":"Retrieves the collection of SchedulingEventType resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Name und Slug des Termintyps (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[slug]","in":"query","description":"Sortierung nach Slug (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[durationMinutes]","in":"query","description":"Sortierung nach Dauer in Minuten (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[kind]","in":"query","description":"Sortierung nach Termintyp-Art (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1schedulingevent-types_post","tags":["SchedulingEventType"],"responses":{"201":{"description":"SchedulingEventType resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType-sched_event_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType.jsonld-sched_event_type.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingEventType resource.","description":"Creates a SchedulingEventType resource.","parameters":[],"requestBody":{"description":"The new SchedulingEventType resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType-sched_event_type.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType-sched_event_type.write"}}},"required":true}}},"/api/v1/scheduling/event-types/{ulid}":{"get":{"operationId":"api_v1schedulingevent-types_ulid_get","tags":["SchedulingEventType"],"responses":{"200":{"description":"SchedulingEventType resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType-sched_event_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType.jsonld-sched_event_type.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SchedulingEventType resource.","description":"Retrieves a SchedulingEventType resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingEventType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1schedulingevent-types_ulid_delete","tags":["SchedulingEventType"],"responses":{"204":{"description":"SchedulingEventType resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SchedulingEventType resource.","description":"Removes the SchedulingEventType resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingEventType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1schedulingevent-types_ulid_patch","tags":["SchedulingEventType"],"responses":{"200":{"description":"SchedulingEventType resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType-sched_event_type.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType.jsonld-sched_event_type.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SchedulingEventType resource.","description":"Updates the SchedulingEventType resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingEventType identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SchedulingEventType resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SchedulingEventType-sched_event_type.write.jsonMergePatch"}}},"required":true}}},"/api/v1/scheduling/resources":{"get":{"operationId":"api_v1schedulingresources_get_collection","tags":["SchedulingResource"],"responses":{"200":{"description":"SchedulingResource collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingResource-sched_resource.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingResource.jsonld-sched_resource.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingResource.jsonld-sched_resource.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingResource resources.","description":"Retrieves the collection of SchedulingResource resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Ressourcennamen (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[kind]","in":"query","description":"Sortierung nach Ressourcen-Art (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1schedulingresources_post","tags":["SchedulingResource"],"responses":{"201":{"description":"SchedulingResource resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingResource-sched_resource.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingResource.jsonld-sched_resource.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingResource resource.","description":"Creates a SchedulingResource resource.","parameters":[],"requestBody":{"description":"The new SchedulingResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingResource-sched_resource.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingResource-sched_resource.write"}}},"required":true}}},"/api/v1/scheduling/resources/{ulid}":{"get":{"operationId":"api_v1schedulingresources_ulid_get","tags":["SchedulingResource"],"responses":{"200":{"description":"SchedulingResource resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingResource-sched_resource.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingResource.jsonld-sched_resource.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SchedulingResource resource.","description":"Retrieves a SchedulingResource resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1schedulingresources_ulid_delete","tags":["SchedulingResource"],"responses":{"204":{"description":"SchedulingResource resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SchedulingResource resource.","description":"Removes the SchedulingResource resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1schedulingresources_ulid_patch","tags":["SchedulingResource"],"responses":{"200":{"description":"SchedulingResource resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingResource-sched_resource.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingResource.jsonld-sched_resource.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SchedulingResource resource.","description":"Updates the SchedulingResource resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SchedulingResource resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SchedulingResource-sched_resource.write.jsonMergePatch"}}},"required":true}}},"/api/v1/scheduling/routing-forms":{"get":{"operationId":"api_v1schedulingrouting-forms_get_collection","tags":["SchedulingRoutingForm"],"responses":{"200":{"description":"SchedulingRoutingForm collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingRoutingForm-sched_routing_form.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingRoutingForm.jsonld-sched_routing_form.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingRoutingForm.jsonld-sched_routing_form.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingRoutingForm resources.","description":"Retrieves the collection of SchedulingRoutingForm resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Name und Slug des Routing-Formulars (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[slug]","in":"query","description":"Sortierung nach Slug (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1schedulingrouting-forms_post","tags":["SchedulingRoutingForm"],"responses":{"201":{"description":"SchedulingRoutingForm resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm-sched_routing_form.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm.jsonld-sched_routing_form.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingRoutingForm resource.","description":"Creates a SchedulingRoutingForm resource.","parameters":[],"requestBody":{"description":"The new SchedulingRoutingForm resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm-sched_routing_form.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm-sched_routing_form.write"}}},"required":true}}},"/api/v1/scheduling/routing-forms/{ulid}":{"get":{"operationId":"api_v1schedulingrouting-forms_ulid_get","tags":["SchedulingRoutingForm"],"responses":{"200":{"description":"SchedulingRoutingForm resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm-sched_routing_form.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm.jsonld-sched_routing_form.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SchedulingRoutingForm resource.","description":"Retrieves a SchedulingRoutingForm resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingRoutingForm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1schedulingrouting-forms_ulid_delete","tags":["SchedulingRoutingForm"],"responses":{"204":{"description":"SchedulingRoutingForm resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SchedulingRoutingForm resource.","description":"Removes the SchedulingRoutingForm resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingRoutingForm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1schedulingrouting-forms_ulid_patch","tags":["SchedulingRoutingForm"],"responses":{"200":{"description":"SchedulingRoutingForm resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm-sched_routing_form.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm.jsonld-sched_routing_form.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SchedulingRoutingForm resource.","description":"Updates the SchedulingRoutingForm resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingRoutingForm identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SchedulingRoutingForm resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SchedulingRoutingForm-sched_routing_form.write.jsonMergePatch"}}},"required":true}}},"/api/v1/scheduling/schedules":{"get":{"operationId":"api_v1schedulingschedules_get_collection","tags":["SchedulingSchedule"],"responses":{"200":{"description":"SchedulingSchedule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingSchedule-sched_schedule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SchedulingSchedule.jsonld-sched_schedule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingSchedule.jsonld-sched_schedule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SchedulingSchedule resources.","description":"Retrieves the collection of SchedulingSchedule resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Namen des Zeitplans (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[timezone]","in":"query","description":"Sortierung nach Zeitzone (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1schedulingschedules_post","tags":["SchedulingSchedule"],"responses":{"201":{"description":"SchedulingSchedule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule-sched_schedule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule.jsonld-sched_schedule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SchedulingSchedule resource.","description":"Creates a SchedulingSchedule resource.","parameters":[],"requestBody":{"description":"The new SchedulingSchedule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule-sched_schedule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule-sched_schedule.write"}}},"required":true}}},"/api/v1/scheduling/schedules/{ulid}":{"get":{"operationId":"api_v1schedulingschedules_ulid_get","tags":["SchedulingSchedule"],"responses":{"200":{"description":"SchedulingSchedule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule-sched_schedule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule.jsonld-sched_schedule.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SchedulingSchedule resource.","description":"Retrieves a SchedulingSchedule resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingSchedule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1schedulingschedules_ulid_delete","tags":["SchedulingSchedule"],"responses":{"204":{"description":"SchedulingSchedule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SchedulingSchedule resource.","description":"Removes the SchedulingSchedule resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingSchedule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1schedulingschedules_ulid_patch","tags":["SchedulingSchedule"],"responses":{"200":{"description":"SchedulingSchedule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule-sched_schedule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule.jsonld-sched_schedule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SchedulingSchedule resource.","description":"Updates the SchedulingSchedule resource.","parameters":[{"name":"ulid","in":"path","description":"SchedulingSchedule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SchedulingSchedule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SchedulingSchedule-sched_schedule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/search":{"get":{"operationId":"api_v1search_get_collection","tags":["Search"],"responses":{"200":{"description":"Search collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Search-search.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Search.jsonld-search.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Search.jsonld-search.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Search resources.","description":"Retrieves the collection of Search resources.","parameters":[{"name":"q","in":"query","description":"Suchbegriff; leer/fehlend liefert eine leere Trefferliste","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"limit","in":"query","description":"Maximale Trefferzahl (Deckel: 100)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/search/reindex":{"post":{"operationId":"api_v1searchreindex_post","tags":["SearchReindex"],"responses":{"202":{"description":"SearchReindex resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchReindex-search_reindex.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SearchReindex.jsonld-search_reindex.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SearchReindex resource.","description":"Creates a SearchReindex resource.","parameters":[],"requestBody":{"description":"The new SearchReindex resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchReindex-search_reindex.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SearchReindex-search_reindex.write"}}},"required":true}}},"/api/v1/settings":{"get":{"operationId":"api_v1settings_get_collection","tags":["Setting"],"responses":{"200":{"description":"Setting collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Setting-setting.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Setting.jsonld-setting.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Setting.jsonld-setting.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Setting resources.","description":"Retrieves the collection of Setting resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Setting-Key (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"scope","in":"query","description":"Scope (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1settings_post","tags":["Setting"],"responses":{"201":{"description":"Setting resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Setting-setting.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Setting.jsonld-setting.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Setting resource.","description":"Creates a Setting resource.","parameters":[],"requestBody":{"description":"The new Setting resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Setting-setting.write_setting.create"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Setting-setting.write_setting.create"}}},"required":true}}},"/api/v1/settings/{id}":{"get":{"operationId":"api_v1settings_id_get","tags":["Setting"],"responses":{"200":{"description":"Setting resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Setting-setting.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Setting.jsonld-setting.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Setting resource.","description":"Retrieves a Setting resource.","parameters":[{"name":"id","in":"path","description":"Setting identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1settings_id_delete","tags":["Setting"],"responses":{"204":{"description":"Setting resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Setting resource.","description":"Removes the Setting resource.","parameters":[{"name":"id","in":"path","description":"Setting identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1settings_id_patch","tags":["Setting"],"responses":{"200":{"description":"Setting resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Setting-setting.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Setting.jsonld-setting.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Setting resource.","description":"Updates the Setting resource.","parameters":[{"name":"id","in":"path","description":"Setting identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Setting resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Setting-setting.write.jsonMergePatch"}}},"required":true}}},"/api/v1/shipments":{"get":{"operationId":"api_v1shipments_get_collection","tags":["Shipment"],"responses":{"200":{"description":"Shipment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Shipment-shipment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Shipment.jsonld-shipment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Shipment.jsonld-shipment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Shipment resources.","description":"Retrieves the collection of Shipment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Tracking-Nummer und Lieferschein-Nummer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/shipments/{ulid}":{"get":{"operationId":"api_v1shipments_ulid_get","tags":["Shipment"],"responses":{"200":{"description":"Shipment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shipment-shipment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Shipment.jsonld-shipment.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Shipment resource.","description":"Retrieves a Shipment resource.","parameters":[{"name":"ulid","in":"path","description":"Shipment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/shipments/{ulid}/retry-label":{"post":{"operationId":"shipping_shipment_retry_label","tags":["Shipment"],"responses":{"201":{"description":"Shipment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shipment-shipment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Shipment.jsonld-shipment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Versandlabel erneut kaufen","description":"Kauft das Versandlabel nach einem fehlgeschlagenen Carrier-Aufruf erneut.","parameters":[{"name":"ulid","in":"path","description":"Shipment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Shipment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shipment"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Shipment"}}},"required":true}}},"/api/v1/delivery-notes/auto-ship-run":{"post":{"operationId":"shipping_auto_ship_run","tags":["ShippingAutoShipRun"],"responses":{"201":{"description":"ShippingAutoShipRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingAutoShipRun-shipping_auto_ship_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingAutoShipRun.jsonld-shipping_auto_ship_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Autoversand-Lauf anstoßen","description":"Übergibt Aufträge mit grüner Auftragsampel an die Versand-Queue: je Auftrag ein Lieferschein, keine Labels. Idempotent (Auftrag mit offenem Lieferschein wird übersprungen). Läuft ohnehin alle 15 Minuten geplant; diese Aktion zieht ihn vor. `dryRun` urteilt nur.","parameters":[],"requestBody":{"description":"The new ShippingAutoShipRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingAutoShipRun-shipping_auto_ship_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingAutoShipRun-shipping_auto_ship_run.write"}}},"required":true}}},"/api/v1/shipping/center-stats":{"get":{"operationId":"api_v1shippingcenter-stats_get_collection","tags":["ShippingCenterStats"],"responses":{"200":{"description":"ShippingCenterStats collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ShippingCenterStats-shipping_center_stats.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ShippingCenterStats.jsonld-shipping_center_stats.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ShippingCenterStats.jsonld-shipping_center_stats.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ShippingCenterStats resources.","description":"Retrieves the collection of ShippingCenterStats resources.","parameters":[]}},"/api/v1/shipping-cost-rules":{"get":{"operationId":"api_v1shipping-cost-rules_get_collection","tags":["ShippingCostRule"],"responses":{"200":{"description":"ShippingCostRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ShippingCostRule-shipping_cost_rule.read"}}},"application/ld+json":{"schema":{"type":"object","description":"ShippingCostRule.jsonld-shipping_cost_rule.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/ShippingCostRule.jsonld-shipping_cost_rule.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of ShippingCostRule resources.","description":"Retrieves the collection of ShippingCostRule resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"zone","in":"query","description":"Versandzone (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Regeln","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"carrierPluginKey","in":"query","description":"Carrier-Plugin-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1shipping-cost-rules_post","tags":["ShippingCostRule"],"responses":{"201":{"description":"ShippingCostRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule-shipping_cost_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule.jsonld-shipping_cost_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a ShippingCostRule resource.","description":"Creates a ShippingCostRule resource.","parameters":[],"requestBody":{"description":"The new ShippingCostRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule-shipping_cost_rule.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule-shipping_cost_rule.write"}}},"required":true}}},"/api/v1/shipping-cost-rules/{ulid}":{"get":{"operationId":"api_v1shipping-cost-rules_ulid_get","tags":["ShippingCostRule"],"responses":{"200":{"description":"ShippingCostRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule-shipping_cost_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule.jsonld-shipping_cost_rule.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ShippingCostRule resource.","description":"Retrieves a ShippingCostRule resource.","parameters":[{"name":"ulid","in":"path","description":"ShippingCostRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1shipping-cost-rules_ulid_delete","tags":["ShippingCostRule"],"responses":{"204":{"description":"ShippingCostRule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the ShippingCostRule resource.","description":"Removes the ShippingCostRule resource.","parameters":[{"name":"ulid","in":"path","description":"ShippingCostRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1shipping-cost-rules_ulid_patch","tags":["ShippingCostRule"],"responses":{"200":{"description":"ShippingCostRule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule-shipping_cost_rule.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule.jsonld-shipping_cost_rule.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the ShippingCostRule resource.","description":"Updates the ShippingCostRule resource.","parameters":[{"name":"ulid","in":"path","description":"ShippingCostRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated ShippingCostRule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/ShippingCostRule-shipping_cost_rule.write.jsonMergePatch"}}},"required":true}}},"/api/v1/return-orders/quota":{"get":{"operationId":"shipping_return_quota","tags":["ShippingReturnQuota"],"responses":{"200":{"description":"ShippingReturnQuota resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingReturnQuota-return_quota.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingReturnQuota.jsonld-return_quota.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a ShippingReturnQuota resource.","description":"Retourenquote je Grund im Zeitraum. Gezählt werden eingegangene Retouren; Positionen ohne Grund werden als „Ohne Angabe\" ausgewiesen statt weggelassen.","parameters":[{"name":"from","in":"query","description":"Beginn des Zeitraums (YYYY-MM-DD); Standard 90 Tage zurück","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Ende des Zeitraums (YYYY-MM-DD), einschließlich","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]}},"/api/v1/shipments/tracking-sync-run":{"post":{"operationId":"shipping_tracking_sync_run","tags":["ShippingTrackingSyncRun"],"responses":{"201":{"description":"ShippingTrackingSyncRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingTrackingSyncRun-shipping_tracking_sync_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingTrackingSyncRun.jsonld-shipping_tracking_sync_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sendungsverfolgung abgleichen","description":"Fragt die offenen Sendungen beim Versanddienstleister ab, schreibt Fortschritte fort (nur vorwärts) und stößt die Kundenbenachrichtigung an. Läuft ohnehin alle 2 Stunden geplant; diese Aktion zieht ihn vor. `dryRun` fragt nur ab und schreibt nichts.","parameters":[],"requestBody":{"description":"The new ShippingTrackingSyncRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShippingTrackingSyncRun-shipping_tracking_sync_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/ShippingTrackingSyncRun-shipping_tracking_sync_run.write"}}},"required":true}}},"/api/v1/site/sites":{"get":{"operationId":"api_v1sitesites_get_collection","tags":["Site"],"responses":{"200":{"description":"Site collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Site-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Site.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Site.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Site resources.","description":"Retrieves the collection of Site resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext über Name und Hosts","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. deaktivierte (false) Sites","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sitesites_post","tags":["Site"],"responses":{"201":{"description":"Site resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Site.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Site anlegen","description":"Pflicht ist `name`. `primaryHost` (lowercase, ohne Schema) macht die Site öffentlich auflösbar; `locales`/`defaultLocale` steuern die Mehrsprachigkeit (je Sprache ein eigener Builder-Baum je Seite).","parameters":[],"requestBody":{"description":"The new Site resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Site-site.write"}}},"required":true}}},"/api/v1/site/sites/{ulid}":{"get":{"operationId":"api_v1sitesites_ulid_get","tags":["Site"],"responses":{"200":{"description":"Site resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Site.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Site resource.","description":"Retrieves a Site resource.","parameters":[{"name":"ulid","in":"path","description":"Site identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sitesites_ulid_delete","tags":["Site"],"responses":{"204":{"description":"Site resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Site resource.","description":"Removes the Site resource.","parameters":[{"name":"ulid","in":"path","description":"Site identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sitesites_ulid_patch","tags":["Site"],"responses":{"200":{"description":"Site resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Site.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Site ändern","description":"Jede Änderung bumpt die Cache-Version (Publish-Purge, B21). Seiten-Referenzen als Seiten-ULIDs.","parameters":[{"name":"ulid","in":"path","description":"Site identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Site resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Site-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/collections":{"get":{"operationId":"api_v1sitecollections_get_collection","tags":["SiteCollection"],"responses":{"200":{"description":"SiteCollection collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteCollection-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SiteCollection.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SiteCollection.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SiteCollection resources.","description":"Retrieves the collection of SiteCollection resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Pflicht-Filter: Collections dieser Site","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche in Name und Slug","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sitecollections_post","tags":["SiteCollection"],"responses":{"201":{"description":"SiteCollection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollection-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollection.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Collection anlegen","description":"Pflicht sind `siteUlid`, `name`, `slug`, `fields` (Schema-Felder) und `titleFieldKey` (text-Feld). Feld-Typen: text, richtext, image, number, date, toggle, link, color, reference, multireference.","parameters":[],"requestBody":{"description":"The new SiteCollection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollection-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollection-site.write"}}},"required":true}}},"/api/v1/site/collections/{ulid}":{"get":{"operationId":"api_v1sitecollections_ulid_get","tags":["SiteCollection"],"responses":{"200":{"description":"SiteCollection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollection-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollection.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SiteCollection resource.","description":"Retrieves a SiteCollection resource.","parameters":[{"name":"ulid","in":"path","description":"SiteCollection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sitecollections_ulid_delete","tags":["SiteCollection"],"responses":{"204":{"description":"SiteCollection resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SiteCollection resource.","description":"Removes the SiteCollection resource.","parameters":[{"name":"ulid","in":"path","description":"SiteCollection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sitecollections_ulid_patch","tags":["SiteCollection"],"responses":{"200":{"description":"SiteCollection resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollection-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollection.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SiteCollection resource.","description":"Updates the SiteCollection resource.","parameters":[{"name":"ulid","in":"path","description":"SiteCollection identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SiteCollection resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SiteCollection-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/collections/{ulid}/csv":{"get":{"operationId":"api_v1sitecollections_ulidcsv_get","tags":["SiteCollectionCsv"],"responses":{"200":{"description":"SiteCollectionCsv resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionCsv-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionCsv.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einträge als CSV","description":"Spalten: `itemId`, `slug`, `status`, dann je Schema-Feld eine Spalte; übersetzbare Felder zusätzlich je weiterer Sprache als `feld:xx`. Werte, die mit `=`, `+`, `-` oder `@` beginnen, werden gegen Formel-Auswertung entschärft.","parameters":[{"name":"ulid","in":"path","description":"SiteCollectionCsv identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"api_v1sitecollections_ulidcsv_post","tags":["SiteCollectionCsv"],"responses":{"201":{"description":"SiteCollectionCsv resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionCsv-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionCsv.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einträge aus CSV übernehmen","description":"Zeilen MIT `itemId` aktualisieren den Eintrag, Zeilen ohne legen einen neuen an. Nicht enthaltene Spalten lassen den Bestand unberührt. Höchstens 1000 Zeilen; je Zeile steht das Ergebnis im Bericht.","parameters":[{"name":"ulid","in":"path","description":"SiteCollectionCsv identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SiteCollectionCsv resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionCsv-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionCsv-site.write"}}},"required":true}}},"/api/v1/site/collection-items":{"get":{"operationId":"api_v1sitecollection-items_get_collection","tags":["SiteCollectionItem"],"responses":{"200":{"description":"SiteCollectionItem collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteCollectionItem-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SiteCollectionItem.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SiteCollectionItem.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SiteCollectionItem resources.","description":"Retrieves the collection of SiteCollectionItem resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"collectionUlid","in":"query","description":"Pflicht-Filter: Einträge dieser Collection","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Nur Entwürfe bzw. Veröffentlichte","required":false,"deprecated":false,"schema":{"type":"string","enum":["draft","published"]},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche in Slug und Feld-Werten","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sitecollection-items_post","tags":["SiteCollectionItem"],"responses":{"201":{"description":"SiteCollectionItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Eintrag anlegen","description":"Pflicht sind `collectionUlid` und `slug`; `fields` wird gegen das Collection-Schema geprüft (required, Typform, Referenz-Existenz). Übersetzbare Werte als `{i18n:{de:…,en:…}}`.","parameters":[],"requestBody":{"description":"The new SiteCollectionItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.write"}}},"required":true}}},"/api/v1/site/collection-items/{ulid}":{"get":{"operationId":"api_v1sitecollection-items_ulid_get","tags":["SiteCollectionItem"],"responses":{"200":{"description":"SiteCollectionItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SiteCollectionItem resource.","description":"Retrieves a SiteCollectionItem resource.","parameters":[{"name":"ulid","in":"path","description":"SiteCollectionItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sitecollection-items_ulid_delete","tags":["SiteCollectionItem"],"responses":{"204":{"description":"SiteCollectionItem resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SiteCollectionItem resource.","description":"Removes the SiteCollectionItem resource.","parameters":[{"name":"ulid","in":"path","description":"SiteCollectionItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sitecollection-items_ulid_patch","tags":["SiteCollectionItem"],"responses":{"200":{"description":"SiteCollectionItem resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SiteCollectionItem resource.","description":"Updates the SiteCollectionItem resource.","parameters":[{"name":"ulid","in":"path","description":"SiteCollectionItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SiteCollectionItem resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/collection-items/{ulid}/publish":{"post":{"operationId":"site_collection_item_publish","tags":["SiteCollectionItem"],"responses":{"201":{"description":"SiteCollectionItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Eintrag veröffentlichen","description":"Setzt `status=published` + `publishedAt`. Ausgeliefert wird über die collection-page-Vorlage der Site (aktives Release je Sprache); ohne Veröffentlichung bleibt die Eintrags-URL 404 (fail-closed).","parameters":[{"name":"ulid","in":"path","description":"SiteCollectionItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SiteCollectionItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.write"}}},"required":true}}},"/api/v1/site/collection-items/{ulid}/unpublish":{"post":{"operationId":"site_collection_item_unpublish","tags":["SiteCollectionItem"],"responses":{"201":{"description":"SiteCollectionItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Eintrag zurückziehen","description":"Setzt `status=draft`; `publishedAt` bleibt als Historie stehen. Die Eintrags-URL antwortet danach wieder 404 (fail-closed); der Site-Cache wird über den `cacheVersion`-Bump geleert.","parameters":[{"name":"ulid","in":"path","description":"SiteCollectionItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SiteCollectionItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteCollectionItem-site.write"}}},"required":true}}},"/api/v1/site/consent-events":{"get":{"operationId":"api_v1siteconsent-events_get_collection","tags":["SiteConsentEvent"],"responses":{"200":{"description":"SiteConsentEvent collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteConsentEvent-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SiteConsentEvent.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SiteConsentEvent.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SiteConsentEvent resources.","description":"Retrieves the collection of SiteConsentEvent resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Pflicht-Filter: Nachweise dieser Site","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/site/menus":{"get":{"operationId":"api_v1sitemenus_get_collection","tags":["SiteMenu"],"responses":{"200":{"description":"SiteMenu collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteMenu-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SiteMenu.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SiteMenu.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SiteMenu resources.","description":"Retrieves the collection of SiteMenu resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Pflicht-Filter: Menüs dieser Site","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sitemenus_post","tags":["SiteMenu"],"responses":{"201":{"description":"SiteMenu resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenu-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteMenu.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Menü anlegen","description":"Pflicht sind `siteUlid`, `key` (eindeutig je Site) und `name`.","parameters":[],"requestBody":{"description":"The new SiteMenu resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenu-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteMenu-site.write"}}},"required":true}}},"/api/v1/site/menus/{ulid}":{"get":{"operationId":"api_v1sitemenus_ulid_get","tags":["SiteMenu"],"responses":{"200":{"description":"SiteMenu resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenu-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteMenu.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SiteMenu resource.","description":"Retrieves a SiteMenu resource.","parameters":[{"name":"ulid","in":"path","description":"SiteMenu identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sitemenus_ulid_delete","tags":["SiteMenu"],"responses":{"204":{"description":"SiteMenu resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SiteMenu resource.","description":"Removes the SiteMenu resource.","parameters":[{"name":"ulid","in":"path","description":"SiteMenu identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sitemenus_ulid_patch","tags":["SiteMenu"],"responses":{"200":{"description":"SiteMenu resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenu-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteMenu.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SiteMenu resource.","description":"Updates the SiteMenu resource.","parameters":[{"name":"ulid","in":"path","description":"SiteMenu identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SiteMenu resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SiteMenu-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/menu-items":{"get":{"operationId":"api_v1sitemenu-items_get_collection","tags":["SiteMenuItem"],"responses":{"200":{"description":"SiteMenuItem collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteMenuItem-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SiteMenuItem.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SiteMenuItem.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SiteMenuItem resources.","description":"Retrieves the collection of SiteMenuItem resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"menuUlid","in":"query","description":"Pflicht-Filter: Einträge dieses Menüs","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Site-Kontext des Menüs (über menuUlid aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sitemenu-items_post","tags":["SiteMenuItem"],"responses":{"201":{"description":"SiteMenuItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Menü-Eintrag anlegen","description":"Pflicht sind `menuUlid`, `targetType` (`page`|`url`) und je nach Typ `pageUlid` bzw. `url`.","parameters":[],"requestBody":{"description":"The new SiteMenuItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem-site.write"}}},"required":true}}},"/api/v1/site/menu-items/{ulid}":{"get":{"operationId":"api_v1sitemenu-items_ulid_get","tags":["SiteMenuItem"],"responses":{"200":{"description":"SiteMenuItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SiteMenuItem resource.","description":"Retrieves a SiteMenuItem resource.","parameters":[{"name":"ulid","in":"path","description":"SiteMenuItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"siteUlid","in":"query","description":"Site-Kontext (über den Eintrag aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"delete":{"operationId":"api_v1sitemenu-items_ulid_delete","tags":["SiteMenuItem"],"responses":{"204":{"description":"SiteMenuItem resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SiteMenuItem resource.","description":"Removes the SiteMenuItem resource.","parameters":[{"name":"ulid","in":"path","description":"SiteMenuItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"siteUlid","in":"query","description":"Site-Kontext (über den Eintrag aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"patch":{"operationId":"api_v1sitemenu-items_ulid_patch","tags":["SiteMenuItem"],"responses":{"200":{"description":"SiteMenuItem resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SiteMenuItem resource.","description":"Updates the SiteMenuItem resource.","parameters":[{"name":"ulid","in":"path","description":"SiteMenuItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"siteUlid","in":"query","description":"Site-Kontext (über den Eintrag aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}],"requestBody":{"description":"The updated SiteMenuItem resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SiteMenuItem-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/pages":{"get":{"operationId":"api_v1sitepages_get_collection","tags":["SitePage"],"responses":{"200":{"description":"SitePage collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SitePage-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SitePage.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SitePage.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SitePage resources.","description":"Retrieves the collection of SitePage resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Pflicht-Filter: Seiten dieser Site","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parentUlid","in":"query","description":"Nur direkte Kinder dieser Seite (leer = Wurzelebene)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sitepages_post","tags":["SitePage"],"responses":{"201":{"description":"SitePage resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePage-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePage.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Seite anlegen","description":"Pflicht ist `siteUlid`. `parentUlid` haengt die Seite in den Baum, `position` sortiert; `kind` ist `page` oder `blog-index` (Blog-Übersicht, B11).","parameters":[],"requestBody":{"description":"The new SitePage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePage-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePage-site.write"}}},"required":true}}},"/api/v1/site/pages/{ulid}":{"get":{"operationId":"api_v1sitepages_ulid_get","tags":["SitePage"],"responses":{"200":{"description":"SitePage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePage-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePage.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SitePage resource.","description":"Retrieves a SitePage resource.","parameters":[{"name":"ulid","in":"path","description":"SitePage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sitepages_ulid_delete","tags":["SitePage"],"responses":{"204":{"description":"SitePage resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SitePage resource.","description":"Removes the SitePage resource.","parameters":[{"name":"ulid","in":"path","description":"SitePage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sitepages_ulid_patch","tags":["SitePage"],"responses":{"200":{"description":"SitePage resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePage-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePage.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Seite ändern/umhängen","description":"PATCH auf `parentUlid`/`position` ist das Umhängen — alle URLs des Teilbaums werden mit 301 fortgeschrieben (W-c).","parameters":[{"name":"ulid","in":"path","description":"SitePage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SitePage resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SitePage-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/pages/{ulid}/move":{"post":{"operationId":"site_page_move","tags":["SitePage"],"responses":{"201":{"description":"SitePage resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePage-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePage.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Seite umhängen","description":"Body `{parentUlid?, position}` — expliziter Umhänge-Endpunkt; identische 301-Fortschreibung wie PATCH.","parameters":[{"name":"ulid","in":"path","description":"SitePage identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SitePage resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePage-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePage-site.write"}}},"required":true}}},"/api/v1/site/page-localizations":{"get":{"operationId":"api_v1sitepage-localizations_get_collection","tags":["SitePageLocalization"],"responses":{"200":{"description":"SitePageLocalization collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SitePageLocalization-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SitePageLocalization.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SitePageLocalization.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SitePageLocalization resources.","description":"Retrieves the collection of SitePageLocalization resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"pageUlid","in":"query","description":"Pflicht-Filter: Auspraegungen dieser Seite","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Site-Kontext der Seite (über pageUlid aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parentUlid","in":"query","description":"Eltern-Knoten-Kontext (über pageUlid aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sitepage-localizations_post","tags":["SitePageLocalization"],"responses":{"201":{"description":"SitePageLocalization resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sprach-Ausprägung anlegen","description":"Body `{pageUlid, locale, title, slug}` — stellt die GETEILTE BuilderPage des Seiten-Knotens sicher (EIN Baum, Feld-Übersetzung im Element, ENT-BUILDER-12) und legt die aktive URL-Zeile an. Ausgeliefert wird erst, wenn `visible` UND ein Builder-Release dieser Sprache aktiv ist.","parameters":[],"requestBody":{"description":"The new SitePageLocalization resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization-site.write"}}},"required":true}}},"/api/v1/site/page-localizations/{ulid}":{"get":{"operationId":"api_v1sitepage-localizations_ulid_get","tags":["SitePageLocalization"],"responses":{"200":{"description":"SitePageLocalization resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SitePageLocalization resource.","description":"Retrieves a SitePageLocalization resource.","parameters":[{"name":"ulid","in":"path","description":"SitePageLocalization identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"siteUlid","in":"query","description":"Site-Kontext (über die Ausprägung aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parentUlid","in":"query","description":"Eltern-Knoten-Kontext (über die Ausprägung aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"delete":{"operationId":"api_v1sitepage-localizations_ulid_delete","tags":["SitePageLocalization"],"responses":{"204":{"description":"SitePageLocalization resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SitePageLocalization resource.","description":"Removes the SitePageLocalization resource.","parameters":[{"name":"ulid","in":"path","description":"SitePageLocalization identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"siteUlid","in":"query","description":"Site-Kontext (über die Ausprägung aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parentUlid","in":"query","description":"Eltern-Knoten-Kontext (über die Ausprägung aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"patch":{"operationId":"api_v1sitepage-localizations_ulid_patch","tags":["SitePageLocalization"],"responses":{"200":{"description":"SitePageLocalization resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sprach-Ausprägung ändern","description":"Slug-Änderung erzeugt automatisch eine 301-Weiterleitung vom alten Pfad; bestehende Ketten werden direkt umgeschrieben (W-c).","parameters":[{"name":"ulid","in":"path","description":"SitePageLocalization identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"siteUlid","in":"query","description":"Site-Kontext (über die Ausprägung aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"parentUlid","in":"query","description":"Eltern-Knoten-Kontext (über die Ausprägung aufgelöst)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}],"requestBody":{"description":"The updated SitePageLocalization resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SitePageLocalization-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/posts":{"get":{"operationId":"api_v1siteposts_get_collection","tags":["SitePost"],"responses":{"200":{"description":"SitePost collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SitePost-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SitePost.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SitePost.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SitePost resources.","description":"Retrieves the collection of SitePost resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Pflicht-Filter: Beiträge dieser Site","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Nur Entwürfe bzw. Veröffentlichte","required":false,"deprecated":false,"schema":{"type":"string","enum":["draft","published"]},"style":"form","explode":true},{"name":"categoryUlid","in":"query","description":"Nur Beiträge dieser Kategorie","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1siteposts_post","tags":["SitePost"],"responses":{"201":{"description":"SitePost resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePost-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePost.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Beitrag anlegen","description":"Pflicht sind `siteUlid`, `title`, `slug` (und `locale` bei mehrsprachiger Site). Legt automatisch die Builder-Fläche für den Inhalt an.","parameters":[],"requestBody":{"description":"The new SitePost resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePost-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePost-site.write"}}},"required":true}}},"/api/v1/site/posts/{ulid}":{"get":{"operationId":"api_v1siteposts_ulid_get","tags":["SitePost"],"responses":{"200":{"description":"SitePost resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePost-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePost.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SitePost resource.","description":"Retrieves a SitePost resource.","parameters":[{"name":"ulid","in":"path","description":"SitePost identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1siteposts_ulid_delete","tags":["SitePost"],"responses":{"204":{"description":"SitePost resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SitePost resource.","description":"Removes the SitePost resource.","parameters":[{"name":"ulid","in":"path","description":"SitePost identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1siteposts_ulid_patch","tags":["SitePost"],"responses":{"200":{"description":"SitePost resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePost-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePost.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SitePost resource.","description":"Updates the SitePost resource.","parameters":[{"name":"ulid","in":"path","description":"SitePost identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SitePost resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SitePost-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/posts/{ulid}/publish":{"post":{"operationId":"site_post_publish","tags":["SitePost"],"responses":{"201":{"description":"SitePost resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePost-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePost.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Beitrag veröffentlichen","description":"Setzt `status=published` + `publishedAt`, legt die URL-Zeile `/{locale?}/blog/{slug}` an und errechnet die Lesezeit (Wörter/200). Ausgeliefert wird erst mit aktivem Builder-Release des Inhalts.","parameters":[{"name":"ulid","in":"path","description":"SitePost identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SitePost resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePost-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePost-site.write"}}},"required":true}}},"/api/v1/site/post-categories":{"get":{"operationId":"api_v1sitepost-categories_get_collection","tags":["SitePostCategory"],"responses":{"200":{"description":"SitePostCategory collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SitePostCategory-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SitePostCategory.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SitePostCategory.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SitePostCategory resources.","description":"Retrieves the collection of SitePostCategory resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Pflicht-Filter: Kategorien dieser Site","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1sitepost-categories_post","tags":["SitePostCategory"],"responses":{"201":{"description":"SitePostCategory resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePostCategory-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePostCategory.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kategorie anlegen","description":"Pflicht sind `siteUlid`, `name` und `slug`.","parameters":[],"requestBody":{"description":"The new SitePostCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePostCategory-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePostCategory-site.write"}}},"required":true}}},"/api/v1/site/post-categories/{ulid}":{"get":{"operationId":"api_v1sitepost-categories_ulid_get","tags":["SitePostCategory"],"responses":{"200":{"description":"SitePostCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePostCategory-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePostCategory.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SitePostCategory resource.","description":"Retrieves a SitePostCategory resource.","parameters":[{"name":"ulid","in":"path","description":"SitePostCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1sitepost-categories_ulid_delete","tags":["SitePostCategory"],"responses":{"204":{"description":"SitePostCategory resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SitePostCategory resource.","description":"Removes the SitePostCategory resource.","parameters":[{"name":"ulid","in":"path","description":"SitePostCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1sitepost-categories_ulid_patch","tags":["SitePostCategory"],"responses":{"200":{"description":"SitePostCategory resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePostCategory-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SitePostCategory.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SitePostCategory resource.","description":"Updates the SitePostCategory resource.","parameters":[{"name":"ulid","in":"path","description":"SitePostCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SitePostCategory resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SitePostCategory-site.write.jsonMergePatch"}}},"required":true}}},"/api/v1/site/urls":{"get":{"operationId":"api_v1siteurls_get_collection","tags":["SiteUrl"],"responses":{"200":{"description":"SiteUrl collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SiteUrl-site.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SiteUrl.jsonld-site.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SiteUrl.jsonld-site.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SiteUrl resources.","description":"Retrieves the collection of SiteUrl resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"siteUlid","in":"query","description":"Pflicht-Filter: URLs dieser Site","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Nur aktive Pfade bzw. nur Weiterleitungen","required":false,"deprecated":false,"schema":{"type":"string","enum":["active","redirect"]},"style":"form","explode":true}]},"post":{"operationId":"api_v1siteurls_post","tags":["SiteUrl"],"responses":{"201":{"description":"SiteUrl resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteUrl-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteUrl.jsonld-site.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Manuelle Weiterleitung anlegen","description":"Body `{siteUlid, path, redirectToPath, locale?}` — legt eine 301-Zeile ohne Ziel-Objekt an (z. B. für Alt-URLs einer Vorgänger-Website).","parameters":[],"requestBody":{"description":"The new SiteUrl resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteUrl-site.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteUrl-site.write"}}},"required":true}}},"/api/v1/site/urls/{ulid}":{"get":{"operationId":"api_v1siteurls_ulid_get","tags":["SiteUrl"],"responses":{"200":{"description":"SiteUrl resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteUrl-site.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SiteUrl.jsonld-site.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SiteUrl resource.","description":"Retrieves a SiteUrl resource.","parameters":[{"name":"ulid","in":"path","description":"SiteUrl identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1siteurls_ulid_delete","tags":["SiteUrl"],"responses":{"204":{"description":"SiteUrl resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Weiterleitung löschen","description":"Nur redirect-Zeilen; aktive Zeilen pflegt das System über Slugs/Baum.","parameters":[{"name":"ulid","in":"path","description":"SiteUrl identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/skill-demands":{"get":{"operationId":"api_v1skill-demands_get_collection","tags":["SkillDemand"],"responses":{"200":{"description":"SkillDemand collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SkillDemand-skilldemand.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SkillDemand.jsonld-skilldemand.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SkillDemand.jsonld-skilldemand.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SkillDemand resources.","description":"Retrieves the collection of SkillDemand resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"skillId","in":"query","description":"Skill-ID (numerische PK, siehe /v1/resource-skills)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1skill-demands_post","tags":["SkillDemand"],"responses":{"201":{"description":"SkillDemand resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand.jsonld-skilldemand.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SkillDemand resource.","description":"Creates a SkillDemand resource.","parameters":[],"requestBody":{"description":"The new SkillDemand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.write"}}},"required":true}}},"/api/v1/skill-demands/{ulid}":{"get":{"operationId":"api_v1skill-demands_ulid_get","tags":["SkillDemand"],"responses":{"200":{"description":"SkillDemand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand.jsonld-skilldemand.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SkillDemand resource.","description":"Retrieves a SkillDemand resource.","parameters":[{"name":"ulid","in":"path","description":"SkillDemand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1skill-demands_ulid_delete","tags":["SkillDemand"],"responses":{"204":{"description":"SkillDemand resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SkillDemand resource.","description":"Removes the SkillDemand resource.","parameters":[{"name":"ulid","in":"path","description":"SkillDemand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1skill-demands_ulid_patch","tags":["SkillDemand"],"responses":{"200":{"description":"SkillDemand resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand.jsonld-skilldemand.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SkillDemand resource.","description":"Updates the SkillDemand resource.","parameters":[{"name":"ulid","in":"path","description":"SkillDemand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SkillDemand resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.update.jsonMergePatch"}}},"required":true}}},"/api/v1/skill-demands/{ulid}/candidates":{"get":{"operationId":"skill_demand_candidates","tags":["SkillDemand"],"responses":{"200":{"description":"SkillDemand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand.jsonld-skilldemand.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SkillDemand resource.","description":"Retrieves a SkillDemand resource.","parameters":[{"name":"ulid","in":"path","description":"SkillDemand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/skill-demands/{ulid}/mark-met":{"post":{"operationId":"skill_demand_mark_met","tags":["SkillDemand"],"responses":{"201":{"description":"SkillDemand resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand.jsonld-skilldemand.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Skill-Bedarf als gedeckt markieren","description":"Markiert den Skill-Bedarf als gedeckt; er verschwindet aus der offenen Bedarfsliste.","parameters":[{"name":"ulid","in":"path","description":"SkillDemand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SkillDemand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.action"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.action"}}},"required":true}}},"/api/v1/skill-demands/{ulid}/reopen":{"post":{"operationId":"skill_demand_reopen","tags":["SkillDemand"],"responses":{"201":{"description":"SkillDemand resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand.jsonld-skilldemand.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Skill-Bedarf wieder öffnen","description":"Öffnet einen bereits gedeckten Skill-Bedarf wieder.","parameters":[{"name":"ulid","in":"path","description":"SkillDemand identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SkillDemand resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.action"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SkillDemand-skilldemand.action"}}},"required":true}}},"/api/v1/ticket-slas":{"get":{"operationId":"api_v1ticket-slas_get_collection","tags":["Sla"],"responses":{"200":{"description":"Sla collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Sla-ticket_sla.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Sla.jsonld-ticket_sla.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Sla.jsonld-ticket_sla.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Sla resources.","description":"Retrieves the collection of Sla resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-slas_post","tags":["Sla"],"responses":{"201":{"description":"Sla resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sla-ticket_sla.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Sla.jsonld-ticket_sla.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Sla resource.","description":"Creates a Sla resource.","parameters":[],"requestBody":{"description":"The new Sla resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sla-ticket_sla.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Sla-ticket_sla.write"}}},"required":true}}},"/api/v1/ticket-slas/{key}":{"get":{"operationId":"api_v1ticket-slas_key_get","tags":["Sla"],"responses":{"200":{"description":"Sla resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sla-ticket_sla.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Sla.jsonld-ticket_sla.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Sla resource.","description":"Retrieves a Sla resource.","parameters":[{"name":"key","in":"path","description":"Sla identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-slas_key_delete","tags":["Sla"],"responses":{"204":{"description":"Sla resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Sla resource.","description":"Removes the Sla resource.","parameters":[{"name":"key","in":"path","description":"Sla identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-slas_key_patch","tags":["Sla"],"responses":{"200":{"description":"Sla resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sla-ticket_sla.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Sla.jsonld-ticket_sla.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Sla resource.","description":"Updates the Sla resource.","parameters":[{"name":"key","in":"path","description":"Sla identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Sla resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Sla-ticket_sla.update.jsonMergePatch"}}},"required":true}}},"/api/v1/slack/installation":{"get":{"operationId":"api_v1slackinstallation_get","tags":["SlackInstallation"],"responses":{"200":{"description":"SlackInstallation resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackInstallation-slackinstall.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SlackInstallation.jsonld-slackinstall.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SlackInstallation resource.","description":"Retrieves a SlackInstallation resource.","parameters":[]}},"/api/v1/slack/project-links":{"get":{"operationId":"api_v1slackproject-links_get_collection","tags":["SlackProjectLink"],"responses":{"200":{"description":"SlackProjectLink collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SlackProjectLink-slacklink.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SlackProjectLink.jsonld-slacklink.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SlackProjectLink.jsonld-slacklink.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SlackProjectLink resources.","description":"Retrieves the collection of SlackProjectLink resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1slackproject-links_post","tags":["SlackProjectLink"],"responses":{"201":{"description":"SlackProjectLink resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink-slacklink.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink.jsonld-slacklink.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SlackProjectLink resource.","description":"Creates a SlackProjectLink resource.","parameters":[],"requestBody":{"description":"The new SlackProjectLink resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink-slacklink.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink-slacklink.write"}}},"required":true}}},"/api/v1/slack/project-links/{ulid}":{"get":{"operationId":"api_v1slackproject-links_ulid_get","tags":["SlackProjectLink"],"responses":{"200":{"description":"SlackProjectLink resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink-slacklink.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink.jsonld-slacklink.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SlackProjectLink resource.","description":"Retrieves a SlackProjectLink resource.","parameters":[{"name":"ulid","in":"path","description":"SlackProjectLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1slackproject-links_ulid_delete","tags":["SlackProjectLink"],"responses":{"204":{"description":"SlackProjectLink resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SlackProjectLink resource.","description":"Removes the SlackProjectLink resource.","parameters":[{"name":"ulid","in":"path","description":"SlackProjectLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1slackproject-links_ulid_patch","tags":["SlackProjectLink"],"responses":{"200":{"description":"SlackProjectLink resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink-slacklink.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink.jsonld-slacklink.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SlackProjectLink resource.","description":"Updates the SlackProjectLink resource.","parameters":[{"name":"ulid","in":"path","description":"SlackProjectLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SlackProjectLink resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SlackProjectLink-slacklink.write.jsonMergePatch"}}},"required":true}}},"/api/v1/sms/campaigns":{"get":{"operationId":"api_v1smscampaigns_get_collection","tags":["SmsCampaign"],"responses":{"200":{"description":"SmsCampaign collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SmsCampaign.jsonld-sms_campaign.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SmsCampaign.jsonld-sms_campaign.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SmsCampaign resources.","description":"Retrieves the collection of SmsCampaign resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Freitext im Namen.","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"status","in":"query","description":"Zustand (draft, scheduled, queued, sending, sent, failed).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name.","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Zustand.","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (Vorgabe: absteigend).","required":false,"deprecated":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true}]},"post":{"operationId":"api_v1smscampaigns_post","tags":["SmsCampaign"],"responses":{"201":{"description":"SmsCampaign resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SmsCampaign.jsonld-sms_campaign.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SmsCampaign resource.","description":"Creates a SmsCampaign resource.","parameters":[],"requestBody":{"description":"The new SmsCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.write"}}},"required":true}}},"/api/v1/sms/campaigns/{ulid}":{"get":{"operationId":"api_v1smscampaigns_ulid_get","tags":["SmsCampaign"],"responses":{"200":{"description":"SmsCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SmsCampaign.jsonld-sms_campaign.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SmsCampaign resource.","description":"Retrieves a SmsCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"SmsCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1smscampaigns_ulid_delete","tags":["SmsCampaign"],"responses":{"204":{"description":"SmsCampaign resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SmsCampaign resource.","description":"Removes the SmsCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"SmsCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1smscampaigns_ulid_patch","tags":["SmsCampaign"],"responses":{"200":{"description":"SmsCampaign resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SmsCampaign.jsonld-sms_campaign.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SmsCampaign resource.","description":"Updates the SmsCampaign resource.","parameters":[{"name":"ulid","in":"path","description":"SmsCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SmsCampaign resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.write.jsonMergePatch"}}},"required":true}}},"/api/v1/sms/campaigns/{ulid}/send":{"post":{"operationId":"api_v1smscampaigns_ulidsend_post","tags":["SmsCampaign"],"responses":{"201":{"description":"SmsCampaign resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SmsCampaign.jsonld-sms_campaign.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Versand auslösen","description":"Reiht den Versand an die hinterlegte Zielgruppe ein (asynchron; Antwort ist die Kampagne im Zustand „queued\", sentCount füllt sich im Hintergrund). Geprüft wird JE EMPFÄNGER: bestätigte SMS-Einwilligung und keine SMS-Sperre; jede Nummer wird je Kampagne höchstens einmal bedient. Nur aus „draft\" oder „scheduled\"; ein zweiter Anstoß auf eine eingereihte, laufende oder versendete Kampagne antwortet 422. Kostet Geld je Nachricht und lässt sich nicht zurückholen.","parameters":[{"name":"ulid","in":"path","description":"SmsCampaign identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SmsCampaign resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SmsCampaign-sms_campaign.write"}}},"required":true}}},"/api/v1/social/channels":{"get":{"operationId":"api_v1socialchannels_get_collection","tags":["SocialChannelStatus"],"responses":{"200":{"description":"SocialChannelStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SocialChannelStatus-mkt_social_channel.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SocialChannelStatus.jsonld-mkt_social_channel.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SocialChannelStatus.jsonld-mkt_social_channel.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SocialChannelStatus resources.","description":"Retrieves the collection of SocialChannelStatus resources.","parameters":[{"name":"brandId","in":"query","description":"Zustand für diese Marke; ohne Angabe der markenübergreifende Blick.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/social/connections":{"get":{"operationId":"api_v1socialconnections_get_collection","tags":["SocialConnection"],"responses":{"200":{"description":"SocialConnection collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SocialConnection-mkt_social_connection.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SocialConnection.jsonld-mkt_social_connection.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SocialConnection.jsonld-mkt_social_connection.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verbindungs-Zustand je Netzwerk","description":"Je Netzwerk: verbunden ja/nein, Ablaufzeitpunkt, ob er bald erreicht ist, und die zur Wahl stehenden Konten. Markenscharf — dieselbe Instanz kann zwei Marken mit zwei Konten bedienen.","parameters":[{"name":"brandId","in":"query","description":"Marke, deren Verbindungen gelesen werden; leer = markenlose Verbindung.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/social/connections/select-account":{"post":{"operationId":"api_v1socialconnectionsselect-account_post","tags":["SocialConnection"],"responses":{"201":{"description":"SocialConnection resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialConnection-mkt_social_connection.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SocialConnection.jsonld-mkt_social_connection.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Konto für ein Netzwerk auswählen","description":"Legt fest, über welche Seite bzw. welches Konto veröffentlicht wird. Nötig bei Meta, wo ein Zugang mehrere Seiten umfassen kann — automatisch die erste zu nehmen hieße raten, und wer drei Seiten verwaltet, postet dann in die falsche. Verlangt `social.connection.manage` GENAU IN DER Marke aus `brandId`; das Recht in einer anderen Marke genügt nicht.","parameters":[],"requestBody":{"description":"The new SocialConnection resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialConnection-mkt_social_connection.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SocialConnection-mkt_social_connection.write"}}},"required":true}}},"/api/v1/social/connections/{provider}":{"delete":{"operationId":"api_v1socialconnections_provider_delete","tags":["SocialConnection"],"responses":{"204":{"description":"SocialConnection resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Verbindung trennen","description":"Entfernt die Geheimnisse der Verbindung. Die App-Zugangsdaten bleiben — sie gehören der Installation, nicht der Verbindung. Wirkt auf die markenlose Verbindung; eine Marken-Achse trägt dieser Weg nicht.","parameters":[{"name":"provider","in":"path","description":"SocialConnection identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/product-stock-takes":{"get":{"operationId":"api_v1product-stock-takes_get_collection","tags":["StockTake"],"responses":{"200":{"description":"StockTake collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StockTake-stock_take.read"}}},"application/ld+json":{"schema":{"type":"object","description":"StockTake.jsonld-stock_take.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of StockTake resources.","description":"Retrieves the collection of StockTake resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Nur Inventuren in diesem Zustand","required":false,"deprecated":false,"schema":{"type":"string","enum":["draft","counting","counted","booked","cancelled"]},"style":"form","explode":true},{"name":"type","in":"query","description":"Inventurart","required":false,"deprecated":false,"schema":{"type":"string","enum":["cutoff","permanent","location"]},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marke eingrenzen","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1product-stock-takes_post","tags":["StockTake"],"responses":{"201":{"description":"StockTake resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a StockTake resource.","description":"Creates a StockTake resource.","parameters":[],"requestBody":{"description":"The new StockTake resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}}},"required":true}}},"/api/v1/product-stock-takes/{ulid}":{"get":{"operationId":"api_v1product-stock-takes_ulid_get","tags":["StockTake"],"responses":{"200":{"description":"StockTake resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a StockTake resource.","description":"Retrieves a StockTake resource.","parameters":[{"name":"ulid","in":"path","description":"StockTake identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1product-stock-takes_ulid_patch","tags":["StockTake"],"responses":{"200":{"description":"StockTake resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the StockTake resource.","description":"Updates the StockTake resource.","parameters":[{"name":"ulid","in":"path","description":"StockTake identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated StockTake resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write.jsonMergePatch"}}},"required":true}}},"/api/v1/product-stock-takes/{ulid}/book":{"post":{"operationId":"stock_take_book","tags":["StockTake"],"responses":{"201":{"description":"StockTake resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Inventurdifferenzen buchen","description":"Bucht die Differenzen als Bewegungsart `inventory`. FINAL — nicht rückgängig. Scheitert, solange ungezählte Zeilen offen sind. Läuft unter Zeilensperre in EINER Transaktion und bucht genau einmal; ein Sperr-Konflikt ist 409 (erneut versuchen). Über `X-Idempotency-Key` benennbar: die Wiederholung desselben Vorgangs bucht nichts nach.","parameters":[{"name":"ulid","in":"path","description":"StockTake identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new StockTake resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}}},"required":true}}},"/api/v1/product-stock-takes/{ulid}/cancel":{"post":{"operationId":"stock_take_cancel","tags":["StockTake"],"responses":{"201":{"description":"StockTake resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Cancel product stock take","description":"Cancel product stock take. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"StockTake identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new StockTake resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}}},"required":true}}},"/api/v1/product-stock-takes/{ulid}/finish":{"post":{"operationId":"stock_take_finish","tags":["StockTake"],"responses":{"201":{"description":"StockTake resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zählung abschließen","description":"Schließt die Zählung ab (counting → counted). Differenzen sind jetzt prüfbar, gebucht ist noch nichts.","parameters":[{"name":"ulid","in":"path","description":"StockTake identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new StockTake resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}}},"required":true}}},"/api/v1/product-stock-takes/{ulid}/populate":{"post":{"operationId":"stock_take_populate","tags":["StockTake"],"responses":{"201":{"description":"StockTake resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zählzeilen anlegen und Sollstand einfrieren","description":"Legt die Zählzeilen an und friert den Sollstand je Artikel ein. Optional `productIds` zur Eingrenzung; ohne Angabe alle lagergeführten Artikel.","parameters":[{"name":"ulid","in":"path","description":"StockTake identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new StockTake resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}}},"required":true}}},"/api/v1/product-stock-takes/{ulid}/protocol":{"get":{"operationId":"stock_take_protocol","tags":["StockTake"],"responses":{"200":{"description":"StockTake resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a StockTake resource.","description":"Zählprotokoll als PDF: je Zeile Soll, Ist, Differenz, Zeitstempel und Zähler — das Beweisdokument der Inventur.","parameters":[{"name":"ulid","in":"path","description":"StockTake identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/product-stock-takes/{ulid}/start":{"post":{"operationId":"stock_take_start","tags":["StockTake"],"responses":{"201":{"description":"StockTake resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake.jsonld-stock_take.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zählung freigeben","description":"Gibt die Zählung frei (draft → counting). Ab hier ist der Zuschnitt festgelegt.","parameters":[{"name":"ulid","in":"path","description":"StockTake identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new StockTake resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTake-stock_take.write"}}},"required":true}}},"/api/v1/product-stock-take-lines/{ulid}":{"patch":{"operationId":"api_v1product-stock-take-lines_ulid_patch","tags":["StockTakeLine"],"responses":{"200":{"description":"StockTakeLine resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTakeLine-stock_take_line.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTakeLine.jsonld-stock_take_line.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the StockTakeLine resource.","description":"Trägt den gezählten Ist-Bestand ein. `version` MUSS die zuvor gelesene Version sein — sonst 409 (ein zweiter Zählender war schneller).","parameters":[{"name":"ulid","in":"path","description":"StockTakeLine identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated StockTakeLine resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/StockTakeLine-stock_take_line.write.jsonMergePatch"}}},"required":true}}},"/api/v1/product-stock-takes/{ulid}/lines":{"get":{"operationId":"api_v1product-stock-takes_ulidlines_get_collection","tags":["StockTakeLine"],"responses":{"200":{"description":"StockTakeLine collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StockTakeLine-stock_take_line.read"}}},"application/ld+json":{"schema":{"type":"object","description":"StockTakeLine.jsonld-stock_take_line.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/StockTakeLine.jsonld-stock_take_line.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of StockTakeLine resources.","description":"Retrieves the collection of StockTakeLine resources.","parameters":[{"name":"ulid","in":"path","description":"StockTakeLine identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"onlyDifferences","in":"query","description":"true → nur Zeilen mit Abweichung (Ist ≠ Soll)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"onlyUncounted","in":"query","description":"true → nur noch nicht gezählte Zeilen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"productId","in":"query","description":"Einzelnen Artikel nachschlagen (Scanner-Dialog)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/stock-transfers":{"get":{"operationId":"api_v1stock-transfers_get_collection","tags":["StockTransfer"],"responses":{"200":{"description":"StockTransfer collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.read"}}},"application/ld+json":{"schema":{"type":"object","description":"StockTransfer.jsonld-stock_transfer.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/StockTransfer.jsonld-stock_transfer.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of StockTransfer resources.","description":"Retrieves the collection of StockTransfer resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Notiz sowie Name/Code von Quell- und Ziel-Lager","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1stock-transfers_post","tags":["StockTransfer"],"responses":{"201":{"description":"StockTransfer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTransfer.jsonld-stock_transfer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a StockTransfer resource.","description":"Creates a StockTransfer resource.","parameters":[],"requestBody":{"description":"The new StockTransfer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.write"}}},"required":true}}},"/api/v1/stock-transfers/{ulid}":{"get":{"operationId":"api_v1stock-transfers_ulid_get","tags":["StockTransfer"],"responses":{"200":{"description":"StockTransfer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTransfer.jsonld-stock_transfer.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a StockTransfer resource.","description":"Retrieves a StockTransfer resource.","parameters":[{"name":"ulid","in":"path","description":"StockTransfer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/stock-transfers/{ulid}/receive":{"post":{"operationId":"stock_transfer_receive","tags":["StockTransfer"],"responses":{"201":{"description":"StockTransfer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTransfer.jsonld-stock_transfer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Receive stock transfer","description":"Receive stock transfer. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"StockTransfer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new StockTransfer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.write"}}},"required":true}}},"/api/v1/stock-transfers/{ulid}/send":{"post":{"operationId":"stock_transfer_send","tags":["StockTransfer"],"responses":{"201":{"description":"StockTransfer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTransfer.jsonld-stock_transfer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Send stock transfer","description":"Send stock transfer. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"StockTransfer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new StockTransfer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/StockTransfer-stock_transfer.write"}}},"required":true}}},"/api/v1/suppliers":{"get":{"operationId":"api_v1suppliers_get_collection","tags":["Supplier"],"responses":{"200":{"description":"Supplier collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Supplier-supplier.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Supplier.jsonld-supplier.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Supplier.jsonld-supplier.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Supplier resources.","description":"Retrieves the collection of Supplier resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"complianceStatus","in":"query","description":"Compliance-Status (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltext-Suche über Lieferantennummer und Partner-Name","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marke (numerische PK) — zeigt nur Lieferanten dieser Marke plus den markenlosen Bestand","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1suppliers_post","tags":["Supplier"],"responses":{"201":{"description":"Supplier resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Supplier-supplier.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Supplier.jsonld-supplier.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Supplier resource.","description":"Creates a Supplier resource.","parameters":[],"requestBody":{"description":"The new Supplier resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Supplier-supplier.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Supplier-supplier.write"}}},"required":true}}},"/api/v1/suppliers/{ulid}":{"get":{"operationId":"api_v1suppliers_ulid_get","tags":["Supplier"],"responses":{"200":{"description":"Supplier resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Supplier-supplier.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Supplier.jsonld-supplier.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Supplier resource.","description":"Retrieves a Supplier resource.","parameters":[{"name":"ulid","in":"path","description":"Supplier identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1suppliers_ulid_delete","tags":["Supplier"],"responses":{"204":{"description":"Supplier resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Supplier resource.","description":"Removes the Supplier resource.","parameters":[{"name":"ulid","in":"path","description":"Supplier identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1suppliers_ulid_patch","tags":["Supplier"],"responses":{"200":{"description":"Supplier resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Supplier-supplier.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Supplier.jsonld-supplier.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Supplier resource.","description":"Updates the Supplier resource.","parameters":[{"name":"ulid","in":"path","description":"Supplier identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Supplier resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Supplier-supplier.write.jsonMergePatch"}}},"required":true}}},"/api/v1/suppliers/{ulid}/articles":{"get":{"operationId":"api_v1suppliers_ulidarticles_get_collection","tags":["SupplierArticle"],"responses":{"200":{"description":"SupplierArticle collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SupplierArticle-supplier_article.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SupplierArticle.jsonld-supplier_article.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SupplierArticle.jsonld-supplier_article.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SupplierArticle resources.","description":"Retrieves the collection of SupplierArticle resources.","parameters":[{"name":"ulid","in":"path","description":"SupplierArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"supplier_article_upsert","tags":["SupplierArticle"],"responses":{"201":{"description":"SupplierArticle resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierArticle-supplier_article.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierArticle.jsonld-supplier_article.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferantenartikel anlegen oder aktualisieren","description":"Legt einen Lieferantenartikel an oder aktualisiert ihn (Upsert je Lieferant und Artikel). Eine Preisänderung schreibt die EK-Historie fort; `isPreferred=true` löst den bisherigen Vorzugslieferanten ab.","parameters":[{"name":"ulid","in":"path","description":"SupplierArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SupplierArticle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierArticle-supplier_article.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierArticle-supplier_article.write"}}},"required":true}}},"/api/v1/suppliers/{ulid}/articles/{articleUlid}":{"delete":{"operationId":"api_v1suppliers_ulidarticles_articleUlid_delete","tags":["SupplierArticle"],"responses":{"204":{"description":"SupplierArticle resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SupplierArticle resource.","description":"Removes the SupplierArticle resource.","parameters":[{"name":"ulid","in":"path","description":"SupplierArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"articleUlid","in":"path","description":"SupplierArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1suppliers_ulidarticles_articleUlid_patch","tags":["SupplierArticle"],"responses":{"200":{"description":"SupplierArticle resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierArticle-supplier_article.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierArticle.jsonld-supplier_article.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SupplierArticle resource.","description":"Updates the SupplierArticle resource.","parameters":[{"name":"ulid","in":"path","description":"SupplierArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"articleUlid","in":"path","description":"SupplierArticle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SupplierArticle resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SupplierArticle-supplier_article.write.jsonMergePatch"}}},"required":true}}},"/api/v1/suppliers/{ulid}/certificates":{"get":{"operationId":"api_v1suppliers_ulidcertificates_get_collection","tags":["SupplierCertificate"],"responses":{"200":{"description":"SupplierCertificate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SupplierCertificate-supplier_certificate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SupplierCertificate.jsonld-supplier_certificate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SupplierCertificate.jsonld-supplier_certificate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SupplierCertificate resources.","description":"Retrieves the collection of SupplierCertificate resources.","parameters":[{"name":"ulid","in":"path","description":"SupplierCertificate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"supplier_certificate_create","tags":["SupplierCertificate"],"responses":{"201":{"description":"SupplierCertificate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierCertificate-supplier_certificate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierCertificate.jsonld-supplier_certificate.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferanten-Zertifikat anlegen","description":"Legt ein Zertifikat des Lieferanten an (optional mit Datei-Nachweis). `expiresAt` ist die Basis der Ablaufwarnung.","parameters":[{"name":"ulid","in":"path","description":"SupplierCertificate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SupplierCertificate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierCertificate-supplier_certificate.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierCertificate-supplier_certificate.write"}}},"required":true}}},"/api/v1/suppliers/{ulid}/certificates/{certificateUlid}":{"delete":{"operationId":"api_v1suppliers_ulidcertificates_certificateUlid_delete","tags":["SupplierCertificate"],"responses":{"204":{"description":"SupplierCertificate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SupplierCertificate resource.","description":"Removes the SupplierCertificate resource.","parameters":[{"name":"ulid","in":"path","description":"SupplierCertificate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"certificateUlid","in":"path","description":"SupplierCertificate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/suppliers/{ulid}/agreements":{"get":{"operationId":"api_v1suppliers_ulidagreements_get_collection","tags":["SupplierFrameworkAgreement"],"responses":{"200":{"description":"SupplierFrameworkAgreement collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SupplierFrameworkAgreement-supplier_agreement.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SupplierFrameworkAgreement.jsonld-supplier_agreement.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SupplierFrameworkAgreement.jsonld-supplier_agreement.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SupplierFrameworkAgreement resources.","description":"Retrieves the collection of SupplierFrameworkAgreement resources.","parameters":[{"name":"ulid","in":"path","description":"SupplierFrameworkAgreement identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"supplier_agreement_create","tags":["SupplierFrameworkAgreement"],"responses":{"201":{"description":"SupplierFrameworkAgreement resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierFrameworkAgreement-supplier_agreement.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierFrameworkAgreement.jsonld-supplier_agreement.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Rahmenvereinbarung anlegen","description":"Legt eine Rahmenvereinbarung des Lieferanten an (Laufzeit, Konditionstext, Bonusstufen).","parameters":[{"name":"ulid","in":"path","description":"SupplierFrameworkAgreement identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SupplierFrameworkAgreement resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierFrameworkAgreement-supplier_agreement.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierFrameworkAgreement-supplier_agreement.write"}}},"required":true}}},"/api/v1/suppliers/{ulid}/agreements/{agreementUlid}":{"patch":{"operationId":"api_v1suppliers_ulidagreements_agreementUlid_patch","tags":["SupplierFrameworkAgreement"],"responses":{"200":{"description":"SupplierFrameworkAgreement resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierFrameworkAgreement-supplier_agreement.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierFrameworkAgreement.jsonld-supplier_agreement.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SupplierFrameworkAgreement resource.","description":"Updates the SupplierFrameworkAgreement resource.","parameters":[{"name":"ulid","in":"path","description":"SupplierFrameworkAgreement identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"agreementUlid","in":"path","description":"SupplierFrameworkAgreement identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SupplierFrameworkAgreement resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SupplierFrameworkAgreement-supplier_agreement.write.jsonMergePatch"}}},"required":true}}},"/api/v1/suppliers/{ulid}/articles/{articleUlid}/history":{"get":{"operationId":"api_v1suppliers_ulidarticles_articleUlidhistory_get_collection","tags":["SupplierPriceHistory"],"responses":{"200":{"description":"SupplierPriceHistory collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SupplierPriceHistory-supplier_price_history.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SupplierPriceHistory.jsonld-supplier_price_history.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SupplierPriceHistory.jsonld-supplier_price_history.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SupplierPriceHistory resources.","description":"Retrieves the collection of SupplierPriceHistory resources.","parameters":[{"name":"ulid","in":"path","description":"SupplierPriceHistory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"articleUlid","in":"path","description":"SupplierPriceHistory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/suppliers/{ulid}/ratings":{"get":{"operationId":"api_v1suppliers_ulidratings_get_collection","tags":["SupplierRating"],"responses":{"200":{"description":"SupplierRating collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SupplierRating-supplier_rating.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SupplierRating.jsonld-supplier_rating.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SupplierRating.jsonld-supplier_rating.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SupplierRating resources.","description":"Retrieves the collection of SupplierRating resources.","parameters":[{"name":"ulid","in":"path","description":"SupplierRating identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"post":{"operationId":"supplier_rating_upsert","tags":["SupplierRating"],"responses":{"201":{"description":"SupplierRating resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierRating-supplier_rating.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierRating.jsonld-supplier_rating.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lieferantenbewertung einer Periode setzen","description":"Legt die Bewertung einer Periode (YYYY-MM) an oder überschreibt sie (Upsert). Die Gesamtnote wird gerechnet.","parameters":[{"name":"ulid","in":"path","description":"SupplierRating identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SupplierRating resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupplierRating-supplier_rating.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupplierRating-supplier_rating.write"}}},"required":true}}},"/api/v1/support-mailboxes":{"get":{"operationId":"api_v1support-mailboxes_get_collection","tags":["SupportMailbox"],"responses":{"200":{"description":"SupportMailbox collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SupportMailbox.jsonld-support_mailbox.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SupportMailbox.jsonld-support_mailbox.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SupportMailbox resources.","description":"Retrieves the collection of SupportMailbox resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1support-mailboxes_post","tags":["SupportMailbox"],"responses":{"201":{"description":"SupportMailbox resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupportMailbox.jsonld-support_mailbox.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SupportMailbox resource.","description":"Creates a SupportMailbox resource.","parameters":[],"requestBody":{"description":"The new SupportMailbox resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.write"}}},"required":true}}},"/api/v1/support-mailboxes/{ulid}":{"get":{"operationId":"api_v1support-mailboxes_ulid_get","tags":["SupportMailbox"],"responses":{"200":{"description":"SupportMailbox resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupportMailbox.jsonld-support_mailbox.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SupportMailbox resource.","description":"Retrieves a SupportMailbox resource.","parameters":[{"name":"ulid","in":"path","description":"SupportMailbox identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1support-mailboxes_ulid_delete","tags":["SupportMailbox"],"responses":{"204":{"description":"SupportMailbox resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SupportMailbox resource.","description":"Removes the SupportMailbox resource.","parameters":[{"name":"ulid","in":"path","description":"SupportMailbox identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1support-mailboxes_ulid_patch","tags":["SupportMailbox"],"responses":{"200":{"description":"SupportMailbox resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupportMailbox.jsonld-support_mailbox.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SupportMailbox resource.","description":"Updates the SupportMailbox resource.","parameters":[{"name":"ulid","in":"path","description":"SupportMailbox identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SupportMailbox resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.write.jsonMergePatch"}}},"required":true}}},"/api/v1/support-mailboxes/{ulid}/test-connection":{"post":{"operationId":"support_mailbox_test_connection","tags":["SupportMailbox"],"responses":{"201":{"description":"SupportMailbox resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupportMailbox.jsonld-support_mailbox.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Postfach-Verbindung sofort prüfen","description":"Prüft die Erreichbarkeit auf demselben Weg wie der Abruf (IMAP: verbinden + Ordner öffnen; Gmail: OAuth-Profilabruf) und schreibt das Ergebnis in den Verbindungszustand des Postfachs. Antwort {ok, message, checkedAt, connectionState}; ein nicht erreichbares Postfach ist `ok: false`, kein HTTP-Fehler.","parameters":[{"name":"ulid","in":"path","description":"SupportMailbox identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new SupportMailbox resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SupportMailbox-support_mailbox.write"}}},"required":true}}},"/api/v1/system-mail-accounts":{"get":{"operationId":"api_v1system-mail-accounts_get_collection","tags":["SystemMailAccount"],"responses":{"200":{"description":"SystemMailAccount collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SystemMailAccount-system_mail_account.read"}}},"application/ld+json":{"schema":{"type":"object","description":"SystemMailAccount.jsonld-system_mail_account.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/SystemMailAccount.jsonld-system_mail_account.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of SystemMailAccount resources.","description":"Retrieves the collection of SystemMailAccount resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1system-mail-accounts_post","tags":["SystemMailAccount"],"responses":{"201":{"description":"SystemMailAccount resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount-system_mail_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount.jsonld-system_mail_account.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SystemMailAccount resource.","description":"Creates a SystemMailAccount resource.","parameters":[],"requestBody":{"description":"The new SystemMailAccount resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount-system_mail_account.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount-system_mail_account.write"}}},"required":true}}},"/api/v1/system-mail-accounts/{ulid}":{"get":{"operationId":"api_v1system-mail-accounts_ulid_get","tags":["SystemMailAccount"],"responses":{"200":{"description":"SystemMailAccount resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount-system_mail_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount.jsonld-system_mail_account.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SystemMailAccount resource.","description":"Retrieves a SystemMailAccount resource.","parameters":[{"name":"ulid","in":"path","description":"SystemMailAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1system-mail-accounts_ulid_delete","tags":["SystemMailAccount"],"responses":{"204":{"description":"SystemMailAccount resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the SystemMailAccount resource.","description":"Removes the SystemMailAccount resource.","parameters":[{"name":"ulid","in":"path","description":"SystemMailAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1system-mail-accounts_ulid_patch","tags":["SystemMailAccount"],"responses":{"200":{"description":"SystemMailAccount resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount-system_mail_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount.jsonld-system_mail_account.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the SystemMailAccount resource.","description":"Updates the SystemMailAccount resource.","parameters":[{"name":"ulid","in":"path","description":"SystemMailAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated SystemMailAccount resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/SystemMailAccount-system_mail_account.write.jsonMergePatch"}}},"required":true}}},"/api/v1/system/update":{"get":{"operationId":"api_v1systemupdate_get","tags":["SystemUpdate"],"responses":{"200":{"description":"SystemUpdate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUpdate-system_update.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemUpdate.jsonld-system_update.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SystemUpdate resource.","description":"Retrieves a SystemUpdate resource.","parameters":[]}},"/api/v1/system/update/check":{"post":{"operationId":"system_update_check","tags":["SystemUpdate"],"responses":{"200":{"description":"SystemUpdate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUpdate-system_update.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemUpdate.jsonld-system_update.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SystemUpdate resource.","description":"Creates a SystemUpdate resource.","parameters":[],"requestBody":{"description":"The new SystemUpdate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUpdate"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemUpdate"}}},"required":true}}},"/api/v1/system/update/run":{"post":{"operationId":"system_update_run","tags":["SystemUpdate"],"responses":{"202":{"description":"SystemUpdate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUpdate-system_update.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemUpdate.jsonld-system_update.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a SystemUpdate resource.","description":"Creates a SystemUpdate resource.","parameters":[],"requestBody":{"description":"The new SystemUpdate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUpdate"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemUpdate"}}},"required":true}}},"/api/v1/system/update/jobs/{jobId}":{"get":{"operationId":"api_v1systemupdatejobs_jobId_get","tags":["SystemUpdateJob"],"responses":{"200":{"description":"SystemUpdateJob resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUpdateJob-system_update_job.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/SystemUpdateJob.jsonld-system_update_job.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a SystemUpdateJob resource.","description":"Retrieves a SystemUpdateJob resource.","parameters":[{"name":"jobId","in":"path","description":"SystemUpdateJob identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/tags":{"get":{"operationId":"api_v1tags_get_collection","tags":["Tag"],"responses":{"200":{"description":"Tag collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Tag-tag.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Tag.jsonld-tag.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Tag.jsonld-tag.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Tag resources.","description":"Retrieves the collection of Tag resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über den Tag-Namen (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1tags_post","tags":["Tag"],"responses":{"201":{"description":"Tag resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag-tag.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Tag.jsonld-tag.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Tag resource.","description":"Creates a Tag resource.","parameters":[],"requestBody":{"description":"The new Tag resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag-tag.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Tag-tag.write"}}},"required":true}}},"/api/v1/tags/{id}":{"get":{"operationId":"api_v1tags_id_get","tags":["Tag"],"responses":{"200":{"description":"Tag resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag-tag.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Tag.jsonld-tag.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Tag resource.","description":"Retrieves a Tag resource.","parameters":[{"name":"id","in":"path","description":"Tag identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1tags_id_delete","tags":["Tag"],"responses":{"204":{"description":"Tag resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Tag resource.","description":"Removes the Tag resource.","parameters":[{"name":"id","in":"path","description":"Tag identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1tags_id_patch","tags":["Tag"],"responses":{"200":{"description":"Tag resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tag-tag.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Tag.jsonld-tag.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Tag resource.","description":"Updates the Tag resource.","parameters":[{"name":"id","in":"path","description":"Tag identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Tag resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Tag-tag.write.jsonMergePatch"}}},"required":true}}},"/api/v1/tag-assignments":{"get":{"operationId":"api_v1tag-assignments_get_collection","tags":["TagAssignment"],"responses":{"200":{"description":"TagAssignment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagAssignment-tag_assignment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TagAssignment.jsonld-tag_assignment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TagAssignment.jsonld-tag_assignment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Schlagwörter eines Objekts — oder Objekte eines Schlagworts","description":"Mit entityType+entityId die Schlagwörter EINES Objekts; mit entityType+tag die Kennungen aller Objekte dieser Art, die das Schlagwort tragen. Der tag-Zweig ist seitenweise: höchstens 100 Kennungen je Antwort (limit), Fortsetzung über afterEntityId; hasMore und nextAfterEntityId sagen, ob und wo es weitergeht.","parameters":[{"name":"entityType","in":"query","description":"Art des Ziels (work_item, contact, lead, deal, article, sop, solution, template, library, canned_response) — zusammen mit entityId Pflicht. Die Arten liefern ihre Eigentuemer ueber die Subjekt-SPI; ein deaktiviertes Plugin nimmt seine Arten mit.","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"entityId","in":"query","description":"Kennung des Ziels innerhalb seiner Art.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"tag","in":"query","description":"Statt eines Ziels: alle Objekte EINER Art, die dieses Schlagwort tragen (mit entityType).","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"limit","in":"query","description":"Nur mit tag: Kennungen je Seite (Vorgabe und Obergrenze 100).","required":false,"deprecated":false,"schema":{"type":"integer","maximum":100},"style":"form","explode":true},{"name":"afterEntityId","in":"query","description":"Nur mit tag: Fortsetzung hinter dieser Kennung — Wert aus nextAfterEntityId der Vorseite.","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1tag-assignments_post","tags":["TagAssignment"],"responses":{"201":{"description":"TagAssignment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagAssignment-tag_assignment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TagAssignment.jsonld-tag_assignment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Schlagwort vergeben oder entfernen","description":"Vergibt (`remove:false`, Vorgabe) oder entfernt (`remove:true`) ein Schlagwort. Idempotent: ein bereits vorhandenes bzw. fehlendes löst nichts aus und meldet `changed:false`. Die Zugriffsprüfung hängt am Ziel-Objekt.","parameters":[],"requestBody":{"description":"The new TagAssignment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagAssignment-tag_assignment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TagAssignment-tag_assignment.write"}}},"required":true}}},"/api/v1/task-bundles":{"get":{"operationId":"api_v1task-bundles_get_collection","tags":["TaskBundle"],"responses":{"200":{"description":"TaskBundle collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskBundle-taskbundle.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TaskBundle.jsonld-taskbundle.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TaskBundle.jsonld-taskbundle.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TaskBundle resources.","description":"Retrieves the collection of TaskBundle resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Bündel","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"Freitext über Name/Beschreibung","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[name]","in":"query","description":"Sortierung nach Name (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Anlagedatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach letzter Änderung (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1task-bundles_post","tags":["TaskBundle"],"responses":{"201":{"description":"TaskBundle resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TaskBundle.jsonld-taskbundle.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TaskBundle resource.","description":"Creates a TaskBundle resource.","parameters":[],"requestBody":{"description":"The new TaskBundle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.write"}}},"required":true}}},"/api/v1/task-bundles/{ulid}":{"get":{"operationId":"api_v1task-bundles_ulid_get","tags":["TaskBundle"],"responses":{"200":{"description":"TaskBundle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TaskBundle.jsonld-taskbundle.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TaskBundle resource.","description":"Retrieves a TaskBundle resource.","parameters":[{"name":"ulid","in":"path","description":"TaskBundle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1task-bundles_ulid_delete","tags":["TaskBundle"],"responses":{"204":{"description":"TaskBundle resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TaskBundle resource.","description":"Removes the TaskBundle resource.","parameters":[{"name":"ulid","in":"path","description":"TaskBundle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1task-bundles_ulid_patch","tags":["TaskBundle"],"responses":{"200":{"description":"TaskBundle resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TaskBundle.jsonld-taskbundle.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TaskBundle resource.","description":"Updates the TaskBundle resource.","parameters":[{"name":"ulid","in":"path","description":"TaskBundle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TaskBundle resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.write.jsonMergePatch"}}},"required":true}}},"/api/v1/task-bundles/{ulid}/apply":{"post":{"operationId":"api_v1task-bundles_ulidapply_post","tags":["TaskBundle"],"responses":{"201":{"description":"TaskBundle resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TaskBundle.jsonld-taskbundle.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Aufgaben-Bündel in ein Projekt laden","description":"Lädt das Bündel in ein bestehendes Projekt (gleichnamige Listen werden gemerged).","parameters":[{"name":"ulid","in":"path","description":"TaskBundle identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new TaskBundle resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TaskBundle-taskbundle.write"}}},"required":true}}},"/api/v1/tax-rates":{"get":{"operationId":"api_v1tax-rates_get_collection","tags":["TaxRate"],"responses":{"200":{"description":"TaxRate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaxRate-tax_rate.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TaxRate.jsonld-tax_rate.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TaxRate.jsonld-tax_rate.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TaxRate resources.","description":"Retrieves the collection of TaxRate resources.","parameters":[{"name":"active","in":"query","description":"Nur aktive (true, Default) bzw. inaktive (false) Sätze","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]}},"/api/v1/tax-rates/{id}":{"get":{"operationId":"api_v1tax-rates_id_get","tags":["TaxRate"],"responses":{"200":{"description":"TaxRate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxRate-tax_rate.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TaxRate.jsonld-tax_rate.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TaxRate resource.","description":"Retrieves a TaxRate resource.","parameters":[{"name":"id","in":"path","description":"TaxRate identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]}},"/api/v1/teams":{"get":{"operationId":"api_v1teams_get_collection","tags":["Team"],"responses":{"200":{"description":"Team collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Team-team.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Team.jsonld-team.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Team.jsonld-team.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Team resources.","description":"Retrieves the collection of Team resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1teams_post","tags":["Team"],"responses":{"201":{"description":"Team resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Team-team.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Team.jsonld-team.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Team resource.","description":"Creates a Team resource.","parameters":[],"requestBody":{"description":"The new Team resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Team-team.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Team-team.write"}}},"required":true}}},"/api/v1/teams/{ulid}":{"get":{"operationId":"api_v1teams_ulid_get","tags":["Team"],"responses":{"200":{"description":"Team resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Team-team.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Team.jsonld-team.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Team resource.","description":"Retrieves a Team resource.","parameters":[{"name":"ulid","in":"path","description":"Team identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1teams_ulid_delete","tags":["Team"],"responses":{"204":{"description":"Team resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Team resource.","description":"Removes the Team resource.","parameters":[{"name":"ulid","in":"path","description":"Team identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1teams_ulid_patch","tags":["Team"],"responses":{"200":{"description":"Team resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Team-team.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Team.jsonld-team.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Team resource.","description":"Updates the Team resource.","parameters":[{"name":"ulid","in":"path","description":"Team identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Team resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Team-team.write.jsonMergePatch"}}},"required":true}}},"/api/v1/msteams/channel-links":{"get":{"operationId":"api_v1msteamschannel-links_get_collection","tags":["TeamsChannelLink"],"responses":{"200":{"description":"TeamsChannelLink collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeamsChannelLink-teamslink.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TeamsChannelLink.jsonld-teamslink.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TeamsChannelLink.jsonld-teamslink.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TeamsChannelLink resources.","description":"Retrieves the collection of TeamsChannelLink resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1msteamschannel-links_post","tags":["TeamsChannelLink"],"responses":{"201":{"description":"TeamsChannelLink resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink-teamslink.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink.jsonld-teamslink.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TeamsChannelLink resource.","description":"Creates a TeamsChannelLink resource.","parameters":[],"requestBody":{"description":"The new TeamsChannelLink resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink-teamslink.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink-teamslink.write"}}},"required":true}}},"/api/v1/msteams/channel-links/{ulid}":{"get":{"operationId":"api_v1msteamschannel-links_ulid_get","tags":["TeamsChannelLink"],"responses":{"200":{"description":"TeamsChannelLink resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink-teamslink.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink.jsonld-teamslink.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TeamsChannelLink resource.","description":"Retrieves a TeamsChannelLink resource.","parameters":[{"name":"ulid","in":"path","description":"TeamsChannelLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1msteamschannel-links_ulid_delete","tags":["TeamsChannelLink"],"responses":{"204":{"description":"TeamsChannelLink resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TeamsChannelLink resource.","description":"Removes the TeamsChannelLink resource.","parameters":[{"name":"ulid","in":"path","description":"TeamsChannelLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1msteamschannel-links_ulid_patch","tags":["TeamsChannelLink"],"responses":{"200":{"description":"TeamsChannelLink resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink-teamslink.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink.jsonld-teamslink.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TeamsChannelLink resource.","description":"Updates the TeamsChannelLink resource.","parameters":[{"name":"ulid","in":"path","description":"TeamsChannelLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TeamsChannelLink resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TeamsChannelLink-teamslink.write.jsonMergePatch"}}},"required":true}}},"/api/v1/tickets":{"get":{"operationId":"api_v1tickets_get_collection","tags":["Ticket"],"responses":{"200":{"description":"Ticket collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Ticket-ticket.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Ticket.jsonld-ticket.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Ticket resources.","description":"Retrieves the collection of Ticket resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel; mehrere komma-separiert (IN-Filter)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"priority","in":"query","description":"Prioritäts-Schlüssel; mehrere komma-separiert (IN-Filter)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"categoryId","in":"query","description":"Kategorie-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"ownerId","in":"query","description":"Besitzer/Bearbeiter (User-ID)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"category","in":"query","description":"Alias für categoryId (UI-Kompatibilität)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"assignee","in":"query","description":"Alias für ownerId (UI-Kompatibilität)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"customer","in":"query","description":"Alias für customerId (UI-Kompatibilität)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"channel","in":"query","description":"Eingangskanal (z.B. email, portal)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über den Betreff","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"open","in":"query","description":"Nur offene Tickets (noch nicht geschlossen)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"slaRisk","in":"query","description":"Nur Tickets mit SLA-Risiko oder -Bruch","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"inbox","in":"query","description":"Nur Eingangskorb (unsicher zugeordnete Eingänge)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"excludeInbox","in":"query","description":"Eingangskorb-Eingänge aus der Support-Queue ausblenden","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach Änderungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Betreff (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1tickets_post","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Ticket resource.","description":"Creates a Ticket resource.","parameters":[],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/bulk":{"post":{"operationId":"ticket_bulk","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Ticket resource.","description":"Creates a Ticket resource.","parameters":[],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}":{"get":{"operationId":"api_v1tickets_ulid_get","tags":["Ticket"],"responses":{"200":{"description":"Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Ticket resource.","description":"Retrieves a Ticket resource.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1tickets_ulid_delete","tags":["Ticket"],"responses":{"204":{"description":"Ticket resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Ticket resource.","description":"Removes the Ticket resource.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1tickets_ulid_patch","tags":["Ticket"],"responses":{"200":{"description":"Ticket resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Ticket resource.","description":"Updates the Ticket resource.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Ticket resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write.jsonMergePatch"}}},"required":true}}},"/api/v1/tickets/{ulid}/assign":{"post":{"operationId":"ticket_assign","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ticket zuweisen","description":"Weist das Ticket einem Bearbeiter bzw. Team zu.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/assign-customer":{"post":{"operationId":"ticket_assign_customer","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kunde zum Ticket zuordnen","description":"Ordnet dem Ticket einen Kunden zu und speist die Triage-Lernstrecke.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/assign-project":{"post":{"operationId":"ticket_assign_project","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Projekt zum Ticket zuordnen","description":"Ordnet dem Ticket ein Projekt zu.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/assist":{"post":{"operationId":"ticket_assist","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"KI-Assistenz zum Ticket","description":"Liefert KI-Assistenz zum Ticket (`mode`: summary|sentiment|draft|translate) als Vorschlag zurück, ohne das Ticket zu ändern.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/block-sender":{"post":{"operationId":"ticket_block_sender","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Absender sperren — künftige Mails verwerfen","description":"Legt eine Mail-Sperre auf die Absenderadresse (`blockType: email`, Default) oder deren ganze Domain (`domain`) an: eingehende Mails erzeugen danach KEIN Ticket mehr und werden verworfen. `blockScope: global` wirkt markenübergreifend (markenbeschränkte Nutzer werden still auf die Ticket-Marke zurückgestuft). `closeOpenTickets: true` schließt zusätzlich alle offenen Tickets dieses Absenders. Ohne Absenderadresse: 400.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/merge":{"post":{"operationId":"ticket_merge","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Merge ticket","description":"Merge ticket. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/note":{"post":{"operationId":"ticket_note","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Interne Notiz am Ticket","description":"Legt eine INTERNE Notiz am Ticket an — für den Kunden nicht sichtbar.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/reopen":{"post":{"operationId":"ticket_reopen","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Geschlossenes Ticket wieder öffnen","description":"Öffnet ein geschlossenes Ticket wieder.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/reply":{"post":{"operationId":"ticket_reply","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Antwort an den Kunden senden","description":"Schickt eine Antwort nach AUSSEN an den Kunden (über Unified Messaging) und trägt sie in den Ticket-Thread ein.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/split":{"post":{"operationId":"ticket_split","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Split ticket","description":"Split ticket. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/status":{"post":{"operationId":"ticket_status","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Ticket-Status setzen","description":"Setzt den Ticket-Status auf den übergebenen Katalog-Schlüssel.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/tickets/{ulid}/triage":{"post":{"operationId":"ticket_triage","tags":["Ticket"],"responses":{"201":{"description":"Ticket resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket.jsonld-ticket.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"KI-Triage-Vorschlag erzeugen","description":"Erzeugt einen KI-Triage-Vorschlag. Erst `applyTriage=true` schreibt ihn ans Ticket.","parameters":[{"name":"ulid","in":"path","description":"Ticket identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new Ticket resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Ticket-ticket.write"}}},"required":true}}},"/api/v1/ticket-categories":{"get":{"operationId":"api_v1ticket-categories_get_collection","tags":["TicketCategory"],"responses":{"200":{"description":"TicketCategory collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TicketCategory-ticket_category.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TicketCategory.jsonld-ticket_category.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TicketCategory.jsonld-ticket_category.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TicketCategory resources.","description":"Retrieves the collection of TicketCategory resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-categories_post","tags":["TicketCategory"],"responses":{"201":{"description":"TicketCategory resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketCategory-ticket_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketCategory.jsonld-ticket_category.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TicketCategory resource.","description":"Creates a TicketCategory resource.","parameters":[],"requestBody":{"description":"The new TicketCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketCategory-ticket_category.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketCategory-ticket_category.write"}}},"required":true}}},"/api/v1/ticket-categories/{key}":{"get":{"operationId":"api_v1ticket-categories_key_get","tags":["TicketCategory"],"responses":{"200":{"description":"TicketCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketCategory-ticket_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketCategory.jsonld-ticket_category.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TicketCategory resource.","description":"Retrieves a TicketCategory resource.","parameters":[{"name":"key","in":"path","description":"TicketCategory identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-categories_key_delete","tags":["TicketCategory"],"responses":{"204":{"description":"TicketCategory resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TicketCategory resource.","description":"Removes the TicketCategory resource.","parameters":[{"name":"key","in":"path","description":"TicketCategory identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-categories_key_patch","tags":["TicketCategory"],"responses":{"200":{"description":"TicketCategory resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketCategory-ticket_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketCategory.jsonld-ticket_category.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TicketCategory resource.","description":"Updates the TicketCategory resource.","parameters":[{"name":"key","in":"path","description":"TicketCategory identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TicketCategory resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TicketCategory-ticket_category.update.jsonMergePatch"}}},"required":true}}},"/api/v1/tickets/mail-poll-run":{"post":{"operationId":"ticket_mail_poll_run","tags":["TicketMailPollRun"],"responses":{"201":{"description":"TicketMailPollRun resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketMailPollRun-mail_poll_run.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketMailPollRun.jsonld-mail_poll_run.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TicketMailPollRun resource.","description":"Creates a TicketMailPollRun resource.","parameters":[],"requestBody":{"description":"The new TicketMailPollRun resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketMailPollRun-mail_poll_run.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketMailPollRun-mail_poll_run.write"}}},"required":true}}},"/api/v1/ticket-priorities":{"get":{"operationId":"api_v1ticket-priorities_get_collection","tags":["TicketPriority"],"responses":{"200":{"description":"TicketPriority collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TicketPriority-ticket_priority.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TicketPriority.jsonld-ticket_priority.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TicketPriority.jsonld-ticket_priority.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TicketPriority resources.","description":"Retrieves the collection of TicketPriority resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-priorities_post","tags":["TicketPriority"],"responses":{"201":{"description":"TicketPriority resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPriority-ticket_priority.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketPriority.jsonld-ticket_priority.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TicketPriority resource.","description":"Creates a TicketPriority resource.","parameters":[],"requestBody":{"description":"The new TicketPriority resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPriority-ticket_priority.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketPriority-ticket_priority.write"}}},"required":true}}},"/api/v1/ticket-priorities/{key}":{"get":{"operationId":"api_v1ticket-priorities_key_get","tags":["TicketPriority"],"responses":{"200":{"description":"TicketPriority resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPriority-ticket_priority.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketPriority.jsonld-ticket_priority.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TicketPriority resource.","description":"Retrieves a TicketPriority resource.","parameters":[{"name":"key","in":"path","description":"TicketPriority identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-priorities_key_delete","tags":["TicketPriority"],"responses":{"204":{"description":"TicketPriority resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TicketPriority resource.","description":"Removes the TicketPriority resource.","parameters":[{"name":"key","in":"path","description":"TicketPriority identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-priorities_key_patch","tags":["TicketPriority"],"responses":{"200":{"description":"TicketPriority resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPriority-ticket_priority.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketPriority.jsonld-ticket_priority.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TicketPriority resource.","description":"Updates the TicketPriority resource.","parameters":[{"name":"key","in":"path","description":"TicketPriority identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TicketPriority resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TicketPriority-ticket_priority.update.jsonMergePatch"}}},"required":true}}},"/api/v1/ticket-reports":{"get":{"operationId":"api_v1ticket-reports_get_collection","tags":["TicketReport"],"responses":{"200":{"description":"TicketReport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TicketReport-ticket_report.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TicketReport.jsonld-ticket_report.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TicketReport.jsonld-ticket_report.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TicketReport resources.","description":"Retrieves the collection of TicketReport resources.","parameters":[{"name":"brandId","in":"query","description":"Marken-ID — grenzt den Report auf eine Marke ein","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/ticket-statuses":{"get":{"operationId":"api_v1ticket-statuses_get_collection","tags":["TicketStatus"],"responses":{"200":{"description":"TicketStatus collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TicketStatus-ticket_status.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TicketStatus.jsonld-ticket_status.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TicketStatus.jsonld-ticket_status.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TicketStatus resources.","description":"Retrieves the collection of TicketStatus resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-statuses_post","tags":["TicketStatus"],"responses":{"201":{"description":"TicketStatus resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketStatus-ticket_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketStatus.jsonld-ticket_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TicketStatus resource.","description":"Creates a TicketStatus resource.","parameters":[],"requestBody":{"description":"The new TicketStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketStatus-ticket_status.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketStatus-ticket_status.write"}}},"required":true}}},"/api/v1/ticket-statuses/{key}":{"get":{"operationId":"api_v1ticket-statuses_key_get","tags":["TicketStatus"],"responses":{"200":{"description":"TicketStatus resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketStatus-ticket_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketStatus.jsonld-ticket_status.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TicketStatus resource.","description":"Retrieves a TicketStatus resource.","parameters":[{"name":"key","in":"path","description":"TicketStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-statuses_key_delete","tags":["TicketStatus"],"responses":{"204":{"description":"TicketStatus resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TicketStatus resource.","description":"Removes the TicketStatus resource.","parameters":[{"name":"key","in":"path","description":"TicketStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-statuses_key_patch","tags":["TicketStatus"],"responses":{"200":{"description":"TicketStatus resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketStatus-ticket_status.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketStatus.jsonld-ticket_status.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TicketStatus resource.","description":"Updates the TicketStatus resource.","parameters":[{"name":"key","in":"path","description":"TicketStatus identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TicketStatus resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TicketStatus-ticket_status.update.jsonMergePatch"}}},"required":true}}},"/api/v1/ticket-teams":{"get":{"operationId":"api_v1ticket-teams_get_collection","tags":["TicketTeam"],"responses":{"200":{"description":"TicketTeam collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TicketTeam-ticket_team.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TicketTeam.jsonld-ticket_team.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TicketTeam.jsonld-ticket_team.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TicketTeam resources.","description":"Retrieves the collection of TicketTeam resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Namens-Teilsuche (z. B. für Auswahl-Picker)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Teams","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1ticket-teams_post","tags":["TicketTeam"],"responses":{"201":{"description":"TicketTeam resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTeam-ticket_team.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketTeam.jsonld-ticket_team.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TicketTeam resource.","description":"Creates a TicketTeam resource.","parameters":[],"requestBody":{"description":"The new TicketTeam resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTeam-ticket_team.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketTeam-ticket_team.write"}}},"required":true}}},"/api/v1/ticket-teams/{ulid}":{"get":{"operationId":"api_v1ticket-teams_ulid_get","tags":["TicketTeam"],"responses":{"200":{"description":"TicketTeam resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTeam-ticket_team.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketTeam.jsonld-ticket_team.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TicketTeam resource.","description":"Retrieves a TicketTeam resource.","parameters":[{"name":"ulid","in":"path","description":"TicketTeam identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ticket-teams_ulid_delete","tags":["TicketTeam"],"responses":{"204":{"description":"TicketTeam resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TicketTeam resource.","description":"Removes the TicketTeam resource.","parameters":[{"name":"ulid","in":"path","description":"TicketTeam identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ticket-teams_ulid_patch","tags":["TicketTeam"],"responses":{"200":{"description":"TicketTeam resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTeam-ticket_team.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketTeam.jsonld-ticket_team.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TicketTeam resource.","description":"Updates the TicketTeam resource.","parameters":[{"name":"ulid","in":"path","description":"TicketTeam identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TicketTeam resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TicketTeam-ticket_team.write.jsonMergePatch"}}},"required":true}}},"/api/v1/tickets/triage-calibrate":{"post":{"operationId":"ticket_triage_calibrate","tags":["TicketTriageCalibration"],"responses":{"201":{"description":"TicketTriageCalibration resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTriageCalibration-triage_calibration.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketTriageCalibration.jsonld-triage_calibration.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TicketTriageCalibration resource.","description":"Creates a TicketTriageCalibration resource.","parameters":[],"requestBody":{"description":"The new TicketTriageCalibration resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTriageCalibration-triage_calibration.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TicketTriageCalibration-triage_calibration.write"}}},"required":true}}},"/api/v1/time/calendar-suggestions":{"get":{"operationId":"api_v1timecalendar-suggestions_get_collection","tags":["TimeCalendarSuggestion"],"responses":{"200":{"description":"TimeCalendarSuggestion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeCalendarSuggestion-timeCalendarSuggestion.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TimeCalendarSuggestion.jsonld-timeCalendarSuggestion.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TimeCalendarSuggestion.jsonld-timeCalendarSuggestion.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TimeCalendarSuggestion resources.","description":"Retrieves the collection of TimeCalendarSuggestion resources.","parameters":[{"name":"date","in":"query","description":"Tag der Termine (Default: heute)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]}},"/api/v1/time-categories":{"get":{"operationId":"api_v1time-categories_get_collection","tags":["TimeCategory"],"responses":{"200":{"description":"TimeCategory collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeCategory-time_category.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TimeCategory.jsonld-time_category.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TimeCategory.jsonld-time_category.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TimeCategory resources.","description":"Retrieves the collection of TimeCategory resources.","parameters":[{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Kategorien","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1time-categories_post","tags":["TimeCategory"],"responses":{"201":{"description":"TimeCategory resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeCategory-time_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeCategory.jsonld-time_category.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TimeCategory resource.","description":"Creates a TimeCategory resource.","parameters":[],"requestBody":{"description":"The new TimeCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeCategory-time_category.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeCategory-time_category.write"}}},"required":true}}},"/api/v1/time-categories/{ulid}":{"get":{"operationId":"api_v1time-categories_ulid_get","tags":["TimeCategory"],"responses":{"200":{"description":"TimeCategory resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeCategory-time_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeCategory.jsonld-time_category.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TimeCategory resource.","description":"Retrieves a TimeCategory resource.","parameters":[{"name":"ulid","in":"path","description":"TimeCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1time-categories_ulid_delete","tags":["TimeCategory"],"responses":{"204":{"description":"TimeCategory resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TimeCategory resource.","description":"Removes the TimeCategory resource.","parameters":[{"name":"ulid","in":"path","description":"TimeCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1time-categories_ulid_patch","tags":["TimeCategory"],"responses":{"200":{"description":"TimeCategory resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeCategory-time_category.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeCategory.jsonld-time_category.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TimeCategory resource.","description":"Updates the TimeCategory resource.","parameters":[{"name":"ulid","in":"path","description":"TimeCategory identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TimeCategory resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TimeCategory-time_category.write.jsonMergePatch"}}},"required":true}}},"/api/v1/time/day-overview":{"get":{"operationId":"api_v1timeday-overview_get","tags":["TimeDayOverview"],"responses":{"200":{"description":"TimeDayOverview resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeDayOverview-timeday.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeDayOverview.jsonld-timeday.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TimeDayOverview resource.","description":"Retrieves a TimeDayOverview resource.","parameters":[{"name":"date","in":"query","description":"Tag (Y-m-d); Default heute","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]}},"/api/v1/time-entries":{"get":{"operationId":"api_v1time-entries_get_collection","tags":["TimeEntry"],"responses":{"200":{"description":"TimeEntry collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TimeEntry.jsonld-time_entry.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TimeEntry resources.","description":"Retrieves the collection of TimeEntry resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"workItemId","in":"query","description":"Vorgangs-ID (WorkItem)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID (über den zugehörigen Vorgang)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Freigabe-Status","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Arbeitsdatum ab (inklusive, YYYY-MM-DD)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Arbeitsdatum bis (inklusive, YYYY-MM-DD)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Beschreibung und verknüpften Vorgang (Titel/Ref)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[workDate]","in":"query","description":"Sortierung nach Arbeitsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1time-entries_post","tags":["TimeEntry"],"responses":{"201":{"description":"TimeEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TimeEntry resource.","description":"Creates a TimeEntry resource.","parameters":[],"requestBody":{"description":"The new TimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}}},"required":true}}},"/api/v1/time-entries/{ulid}":{"get":{"operationId":"api_v1time-entries_ulid_get","tags":["TimeEntry"],"responses":{"200":{"description":"TimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TimeEntry resource.","description":"Retrieves a TimeEntry resource.","parameters":[{"name":"ulid","in":"path","description":"TimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1time-entries_ulid_delete","tags":["TimeEntry"],"responses":{"204":{"description":"TimeEntry resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TimeEntry resource.","description":"Removes the TimeEntry resource.","parameters":[{"name":"ulid","in":"path","description":"TimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1time-entries_ulid_patch","tags":["TimeEntry"],"responses":{"200":{"description":"TimeEntry resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TimeEntry resource.","description":"Updates the TimeEntry resource.","parameters":[{"name":"ulid","in":"path","description":"TimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TimeEntry resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write.jsonMergePatch"}}},"required":true}}},"/api/v1/time-entries/{ulid}/invoice":{"post":{"operationId":"time_entry_invoice","tags":["TimeEntry"],"responses":{"200":{"description":"TimeEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zeitbuchung als abgerechnet markieren","description":"Setzt diesen Eintrag auf `invoiced` — aus `draft`, `submitted` oder `approved`, ohne Timesheet-Einreichung/-Genehmigung (Recht `time.entry.invoice` in der Marke des Eintrags, sonst 404). Danach ist der Eintrag schreibgeschützt; Korrektur nur per Storno. Gegenbuchungen: 422, bereits abgerechnet/gesperrt: 409. Die Übergabe aus der Abrechnungsvorbereitung (lexoffice) bleibt ein zweiter Weg zum selben Status.","parameters":[{"name":"ulid","in":"path","description":"TimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new TimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}}},"required":true}}},"/api/v1/time-entries/{ulid}/reject":{"post":{"operationId":"time_entry_reject","tags":["TimeEntry"],"responses":{"200":{"description":"TimeEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Einzelne Zeitbuchung zurückweisen","description":"Setzt GENAU DIESEN eingereichten Eintrag auf `draft` zurück — der Mitarbeiter muss ihn erneut erfassen/einreichen; der Rest der Woche bleibt eingereicht. Braucht `time.timesheet.approve` in der Marke des Eintrags (sonst 404). Body optional `{rejectNote}`.","parameters":[{"name":"ulid","in":"path","description":"TimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new TimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}}},"required":true}}},"/api/v1/time-entries/{ulid}/reverse":{"post":{"operationId":"time_entry_reverse","tags":["TimeEntry"],"responses":{"201":{"description":"TimeEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Zeitbuchung stornieren (Gegenbuchung)","description":"Legt einen NEUEN Eintrag mit negativer Dauer und `reversalOfId` an (201) — der Original-Eintrag bleibt unverändert stehen. Die abrechenbare Zeit des Projekts sinkt entsprechend. Je Original ist nur EINE Gegenbuchung möglich (Wiederholung: 409). Aufheben über `POST /v1/time-entries/{ulid}/unreverse` (gleiches Recht).","parameters":[{"name":"ulid","in":"path","description":"TimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new TimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}}},"required":true}}},"/api/v1/time-entries/{ulid}/uninvoice":{"post":{"operationId":"time_entry_uninvoice","tags":["TimeEntry"],"responses":{"200":{"description":"TimeEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Abgerechnet-Markierung zurücknehmen","description":"Nimmt den HÄNDISCHEN `invoiced`-Stempel zurück und führt den Eintrag auf den Status vor dem Stempel (`draft`/`submitted`/`approved`, ersatzweise `approved`); die Zeit ist danach wieder abrechenbar. Recht `time.entry.invoice` in der Marke des Eintrags (sonst 404). Hängt der Eintrag an einer Rechnungsposition (`invoiceItemId`), ist nur Rechnungskorrektur + Storno möglich: 422. Nicht abgerechnet: 409, bereits storniert: 409.","parameters":[{"name":"ulid","in":"path","description":"TimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new TimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}}},"required":true}}},"/api/v1/time-entries/{ulid}/unreverse":{"post":{"operationId":"time_entry_unreverse","tags":["TimeEntry"],"responses":{"200":{"description":"TimeEntry resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry.jsonld-time_entry.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Storno einer Zeitbuchung aufheben","description":"Zieht die aktive Storno-Gegenbuchung zu DIESEM Original zurück (Soft-Delete, Audit-Trail bleibt) und liefert das Original (200, `reversedByUlid` = null). Die Zeit zählt danach wieder in allen Summen und ist wieder abrechenbar bzw. gilt wieder als abgerechnet; ein Retainer-Kontingent wird erneut abgebaut, sofern der Storno es freigegeben hatte. Recht `time.entry.edit_any` in der Marke des Eintrags (sonst 404). Nur für das stornierte Original — Gegenbuchung selbst: 422; nicht storniert: 409. Ein erneuter Storno ist danach möglich.","parameters":[{"name":"ulid","in":"path","description":"TimeEntry identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new TimeEntry resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeEntry-time_entry.write"}}},"required":true}}},"/api/v1/time-reports":{"get":{"operationId":"api_v1time-reports_get_collection","tags":["TimeReport"],"responses":{"200":{"description":"TimeReport collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeReport-time_report.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TimeReport.jsonld-time_report.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TimeReport.jsonld-time_report.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TimeReport resources.","description":"Retrieves the collection of TimeReport resources.","parameters":[{"name":"groupBy","in":"query","description":"Gruppierung der Report-Zeilen (Default none)","required":false,"deprecated":false,"schema":{"type":"string","enum":["none","project","customer","employee","brand"]},"style":"form","explode":true},{"name":"from","in":"query","description":"Zeitraum-Beginn","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Kunden-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/time-report-definitions":{"get":{"operationId":"api_v1time-report-definitions_get_collection","tags":["TimeReportDefinition"],"responses":{"200":{"description":"TimeReportDefinition collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TimeReportDefinition.jsonld-timeReportDefinition.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TimeReportDefinition.jsonld-timeReportDefinition.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TimeReportDefinition resources.","description":"Retrieves the collection of TimeReportDefinition resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"visibility","in":"query","description":"Nur private bzw. geteilte Definitionen","required":false,"deprecated":false,"schema":{"type":"string","enum":["private","shared"]},"style":"form","explode":true}]},"post":{"operationId":"api_v1time-report-definitions_post","tags":["TimeReportDefinition"],"responses":{"201":{"description":"TimeReportDefinition resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition.jsonld-timeReportDefinition.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TimeReportDefinition resource.","description":"Creates a TimeReportDefinition resource.","parameters":[],"requestBody":{"description":"The new TimeReportDefinition resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.write"}}},"required":true}}},"/api/v1/time-report-definitions/{ulid}":{"get":{"operationId":"api_v1time-report-definitions_ulid_get","tags":["TimeReportDefinition"],"responses":{"200":{"description":"TimeReportDefinition resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition.jsonld-timeReportDefinition.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TimeReportDefinition resource.","description":"Retrieves a TimeReportDefinition resource.","parameters":[{"name":"ulid","in":"path","description":"TimeReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1time-report-definitions_ulid_delete","tags":["TimeReportDefinition"],"responses":{"204":{"description":"TimeReportDefinition resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TimeReportDefinition resource.","description":"Removes the TimeReportDefinition resource.","parameters":[{"name":"ulid","in":"path","description":"TimeReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1time-report-definitions_ulid_patch","tags":["TimeReportDefinition"],"responses":{"200":{"description":"TimeReportDefinition resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition.jsonld-timeReportDefinition.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TimeReportDefinition resource.","description":"Updates the TimeReportDefinition resource.","parameters":[{"name":"ulid","in":"path","description":"TimeReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TimeReportDefinition resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.write.jsonMergePatch"}}},"required":true}}},"/api/v1/time-report-definitions/{ulid}/run":{"post":{"operationId":"time_report_definition_run","tags":["TimeReportDefinition"],"responses":{"201":{"description":"TimeReportDefinition resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition.jsonld-timeReportDefinition.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Gespeicherten Zeitreport ausführen","description":"Führt den gespeicherten Zeitreport aus, löst das relative Fenster gegen heute auf und liefert die gerundeten Zeilen. Die erfassten Roh-Zeiten bleiben unberührt.","parameters":[{"name":"ulid","in":"path","description":"TimeReportDefinition identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new TimeReportDefinition resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeReportDefinition-timeReportDefinition.write"}}},"required":true}}},"/api/v1/time-rounding-rules":{"get":{"operationId":"api_v1time-rounding-rules_get_collection","tags":["TimeRoundingRule"],"responses":{"200":{"description":"TimeRoundingRule collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeRoundingRule-time_rounding.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TimeRoundingRule.jsonld-time_rounding.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TimeRoundingRule.jsonld-time_rounding.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TimeRoundingRule resources.","description":"Retrieves the collection of TimeRoundingRule resources.","parameters":[{"name":"projectId","in":"query","description":"Projekt-ID (projektgebundene Regeln)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"contractId","in":"query","description":"Vertrags-ID (vertragsgebundene Regeln)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Regeln","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1time-rounding-rules_post","tags":["TimeRoundingRule"],"responses":{"201":{"description":"TimeRoundingRule resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule-time_rounding.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule.jsonld-time_rounding.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a TimeRoundingRule resource.","description":"Creates a TimeRoundingRule resource.","parameters":[],"requestBody":{"description":"The new TimeRoundingRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule-time_rounding.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule-time_rounding.write"}}},"required":true}}},"/api/v1/time-rounding-rules/{ulid}":{"get":{"operationId":"api_v1time-rounding-rules_ulid_get","tags":["TimeRoundingRule"],"responses":{"200":{"description":"TimeRoundingRule resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule-time_rounding.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule.jsonld-time_rounding.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a TimeRoundingRule resource.","description":"Retrieves a TimeRoundingRule resource.","parameters":[{"name":"ulid","in":"path","description":"TimeRoundingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1time-rounding-rules_ulid_delete","tags":["TimeRoundingRule"],"responses":{"204":{"description":"TimeRoundingRule resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the TimeRoundingRule resource.","description":"Removes the TimeRoundingRule resource.","parameters":[{"name":"ulid","in":"path","description":"TimeRoundingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1time-rounding-rules_ulid_patch","tags":["TimeRoundingRule"],"responses":{"200":{"description":"TimeRoundingRule resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule-time_rounding.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule.jsonld-time_rounding.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the TimeRoundingRule resource.","description":"Updates the TimeRoundingRule resource.","parameters":[{"name":"ulid","in":"path","description":"TimeRoundingRule identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated TimeRoundingRule resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/TimeRoundingRule-time_rounding.write.jsonMergePatch"}}},"required":true}}},"/api/v1/time/work-item-options":{"get":{"operationId":"api_v1timework-item-options_get_collection","tags":["TimeWorkItemOption"],"responses":{"200":{"description":"TimeWorkItemOption collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TimeWorkItemOption-time_work_item_option.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TimeWorkItemOption.jsonld-time_work_item_option.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TimeWorkItemOption.jsonld-time_work_item_option.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TimeWorkItemOption resources.","description":"Retrieves the collection of TimeWorkItemOption resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Titel und Referenz","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"search","in":"query","description":"Alias zu q (LIKE-Suche über Titel und Referenz)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"kind","in":"query","description":"Work-Item-Art (task|ticket, exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/timers":{"get":{"operationId":"api_v1timers_get_collection","tags":["Timer"],"responses":{"200":{"description":"Timer collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Timer-timer.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Timer.jsonld-timer.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Timer.jsonld-timer.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Timer resources.","description":"Retrieves the collection of Timer resources.","parameters":[{"name":"employeeId","in":"query","description":"Mitarbeiter-ID — nur mit time.entry.view_project/edit_any wirksam, sonst ignoriert (eigener Scope bleibt erzwungen)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]},"post":{"operationId":"api_v1timers_post","tags":["Timer"],"responses":{"201":{"description":"Timer resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timer-timer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Timer.jsonld-timer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Timer resource.","description":"Creates a Timer resource.","parameters":[],"requestBody":{"description":"The new Timer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timer-timer.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Timer-timer.write"}}},"required":true}}},"/api/v1/timers/{ulid}":{"get":{"operationId":"api_v1timers_ulid_get","tags":["Timer"],"responses":{"200":{"description":"Timer resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timer-timer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Timer.jsonld-timer.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Timer resource.","description":"Retrieves a Timer resource.","parameters":[{"name":"ulid","in":"path","description":"Timer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1timers_ulid_delete","tags":["Timer"],"responses":{"204":{"description":"Timer resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Timer resource.","description":"Removes the Timer resource.","parameters":[{"name":"ulid","in":"path","description":"Timer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1timers_ulid_patch","tags":["Timer"],"responses":{"200":{"description":"Timer resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timer-timer.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Timer.jsonld-timer.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Timer resource.","description":"Updates the Timer resource.","parameters":[{"name":"ulid","in":"path","description":"Timer identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Timer resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Timer-timer.write.jsonMergePatch"}}},"required":true}}},"/api/v1/timesheets":{"get":{"operationId":"api_v1timesheets_get_collection","tags":["Timesheet"],"responses":{"200":{"description":"Timesheet collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Timesheet-timesheet.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Timesheet.jsonld-timesheet.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Timesheet.jsonld-timesheet.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Timesheet resources.","description":"Retrieves the collection of Timesheet resources.","parameters":[{"name":"status","in":"query","description":"Genehmigungs-Status der Woche","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID (nur für Genehmiger/Korrektoren wirksam)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Mitarbeitername und Notiz","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"page","in":"query","description":"Seitennummer (1-basiert)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"itemsPerPage","in":"query","description":"Seitengröße (max. 100, Default 25)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"order[periodStart]","in":"query","description":"Sortierung nach Wochenanfang (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[status]","in":"query","description":"Sortierung nach Status (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[entryCount]","in":"query","description":"Sortierung nach Eintragsanzahl (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[totalMinutes]","in":"query","description":"Sortierung nach Gesamtdauer (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[decidedAt]","in":"query","description":"Sortierung nach Entscheidungszeitpunkt (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1timesheets_post","tags":["Timesheet"],"responses":{"201":{"description":"Timesheet resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet-timesheet.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Timesheet.jsonld-timesheet.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Timesheet resource.","description":"Creates a Timesheet resource.","parameters":[],"requestBody":{"description":"The new Timesheet resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet-timesheet.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Timesheet-timesheet.write"}}},"required":true}}},"/api/v1/timesheets/{ulid}":{"get":{"operationId":"api_v1timesheets_ulid_get","tags":["Timesheet"],"responses":{"200":{"description":"Timesheet resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet-timesheet.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Timesheet.jsonld-timesheet.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Timesheet resource.","description":"Retrieves a Timesheet resource.","parameters":[{"name":"ulid","in":"path","description":"Timesheet identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1timesheets_ulid_patch","tags":["Timesheet"],"responses":{"200":{"description":"Timesheet resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Timesheet-timesheet.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Timesheet.jsonld-timesheet.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Timesheet resource.","description":"Updates the Timesheet resource.","parameters":[{"name":"ulid","in":"path","description":"Timesheet identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Timesheet resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Timesheet-timesheet.write.jsonMergePatch"}}},"required":true}}},"/api/v1/trash":{"get":{"operationId":"api_v1trash_get_collection","tags":["TrashItem"],"responses":{"200":{"description":"TrashItem collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TrashItem-trash.read"}}},"application/ld+json":{"schema":{"type":"object","description":"TrashItem.jsonld-trash.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/TrashItem.jsonld-trash.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of TrashItem resources.","description":"Retrieves the collection of TrashItem resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"type","in":"query","description":"Objekttyp des Papierkorb-Eintrags (exakter Match; leer = alle Typen)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/trash/{entityType}/{ulid}/restore":{"post":{"operationId":"trash_restore","tags":["TrashItem"],"responses":{"200":{"description":"TrashItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashItem-trash.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TrashItem.jsonld-trash.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Restore trash","description":"Restore trash. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"entityType","in":"path","description":"TrashItem identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false},{"name":"ulid","in":"path","description":"TrashItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new TrashItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashItem"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/TrashItem"}}},"required":true}}},"/api/v1/unit-conversions":{"get":{"operationId":"api_v1unit-conversions_get_collection","tags":["UnitConversion"],"responses":{"200":{"description":"UnitConversion collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UnitConversion-uom_conversion.read"}}},"application/ld+json":{"schema":{"type":"object","description":"UnitConversion.jsonld-uom_conversion.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/UnitConversion.jsonld-uom_conversion.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of UnitConversion resources.","description":"Retrieves the collection of UnitConversion resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"productId","in":"query","description":"Produkt-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"global","in":"query","description":"true → nur globale Konvertierungen ohne Produktbezug","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1unit-conversions_post","tags":["UnitConversion"],"responses":{"201":{"description":"UnitConversion resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitConversion-uom_conversion.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UnitConversion.jsonld-uom_conversion.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a UnitConversion resource.","description":"Creates a UnitConversion resource.","parameters":[],"requestBody":{"description":"The new UnitConversion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitConversion-uom_conversion.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UnitConversion-uom_conversion.write"}}},"required":true}}},"/api/v1/unit-conversions/{ulid}":{"get":{"operationId":"api_v1unit-conversions_ulid_get","tags":["UnitConversion"],"responses":{"200":{"description":"UnitConversion resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitConversion-uom_conversion.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UnitConversion.jsonld-uom_conversion.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a UnitConversion resource.","description":"Retrieves a UnitConversion resource.","parameters":[{"name":"ulid","in":"path","description":"UnitConversion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1unit-conversions_ulid_delete","tags":["UnitConversion"],"responses":{"204":{"description":"UnitConversion resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the UnitConversion resource.","description":"Removes the UnitConversion resource.","parameters":[{"name":"ulid","in":"path","description":"UnitConversion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1unit-conversions_ulid_patch","tags":["UnitConversion"],"responses":{"200":{"description":"UnitConversion resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitConversion-uom_conversion.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UnitConversion.jsonld-uom_conversion.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the UnitConversion resource.","description":"Updates the UnitConversion resource.","parameters":[{"name":"ulid","in":"path","description":"UnitConversion identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated UnitConversion resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/UnitConversion-uom_conversion.write.jsonMergePatch"}}},"required":true}}},"/api/v1/units-of-measure":{"get":{"operationId":"api_v1units-of-measure_get_collection","tags":["UnitOfMeasure"],"responses":{"200":{"description":"UnitOfMeasure collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UnitOfMeasure-uom_unit.read"}}},"application/ld+json":{"schema":{"type":"object","description":"UnitOfMeasure.jsonld-uom_unit.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/UnitOfMeasure.jsonld-uom_unit.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of UnitOfMeasure resources.","description":"Retrieves the collection of UnitOfMeasure resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"dimension","in":"query","description":"Dimension (exakter Match, z. B. count | weight | volume | length | area | time)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Einheiten","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1units-of-measure_post","tags":["UnitOfMeasure"],"responses":{"201":{"description":"UnitOfMeasure resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure-uom_unit.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure.jsonld-uom_unit.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a UnitOfMeasure resource.","description":"Creates a UnitOfMeasure resource.","parameters":[],"requestBody":{"description":"The new UnitOfMeasure resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure-uom_unit.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure-uom_unit.write"}}},"required":true}}},"/api/v1/units-of-measure/{code}":{"get":{"operationId":"api_v1units-of-measure_code_get","tags":["UnitOfMeasure"],"responses":{"200":{"description":"UnitOfMeasure resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure-uom_unit.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure.jsonld-uom_unit.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a UnitOfMeasure resource.","description":"Retrieves a UnitOfMeasure resource.","parameters":[{"name":"code","in":"path","description":"UnitOfMeasure identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1units-of-measure_code_delete","tags":["UnitOfMeasure"],"responses":{"204":{"description":"UnitOfMeasure resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the UnitOfMeasure resource.","description":"Removes the UnitOfMeasure resource.","parameters":[{"name":"code","in":"path","description":"UnitOfMeasure identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1units-of-measure_code_patch","tags":["UnitOfMeasure"],"responses":{"200":{"description":"UnitOfMeasure resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure-uom_unit.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure.jsonld-uom_unit.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the UnitOfMeasure resource.","description":"Updates the UnitOfMeasure resource.","parameters":[{"name":"code","in":"path","description":"UnitOfMeasure identifier","required":true,"deprecated":false,"schema":{"type":"string"},"style":"simple","explode":false}],"requestBody":{"description":"The updated UnitOfMeasure resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/UnitOfMeasure-uom_unit.write.jsonMergePatch"}}},"required":true}}},"/api/v1/users":{"get":{"operationId":"api_v1users_get_collection","tags":["UserAccount"],"responses":{"200":{"description":"UserAccount collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserAccount-user_account.read"}}},"application/ld+json":{"schema":{"type":"object","description":"UserAccount.jsonld-user_account.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/UserAccount.jsonld-user_account.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of UserAccount resources.","description":"Retrieves the collection of UserAccount resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Anzeigename und E-Mail (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"active","in":"query","description":"true = nur aktive Konten; false = inaktive und eingeladene (pending) Konten","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1users_post","tags":["UserAccount"],"responses":{"201":{"description":"UserAccount resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAccount-user_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserAccount.jsonld-user_account.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a UserAccount resource.","description":"Creates a UserAccount resource.","parameters":[],"requestBody":{"description":"The new UserAccount resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAccount-user_account.create"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserAccount-user_account.create"}}},"required":true}}},"/api/v1/users/{ulid}":{"get":{"operationId":"api_v1users_ulid_get","tags":["UserAccount"],"responses":{"200":{"description":"UserAccount resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAccount-user_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserAccount.jsonld-user_account.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a UserAccount resource.","description":"Retrieves a UserAccount resource.","parameters":[{"name":"ulid","in":"path","description":"UserAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1users_ulid_patch","tags":["UserAccount"],"responses":{"200":{"description":"UserAccount resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAccount-user_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserAccount.jsonld-user_account.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the UserAccount resource.","description":"Updates the UserAccount resource.","parameters":[{"name":"ulid","in":"path","description":"UserAccount identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated UserAccount resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/UserAccount-user_account.write.jsonMergePatch"}}},"required":true}}},"/api/v1/saved-views":{"get":{"operationId":"api_v1saved-views_get_collection","tags":["UserSavedView"],"responses":{"200":{"description":"UserSavedView collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserSavedView-saved_view.read"}}},"application/ld+json":{"schema":{"type":"object","description":"UserSavedView.jsonld-saved_view.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/UserSavedView.jsonld-saved_view.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of UserSavedView resources.","description":"Retrieves the collection of UserSavedView resources.","parameters":[{"name":"viewKey","in":"query","description":"Listen-Kennung (kebab-slug). Pflicht: ohne sie bleibt die Liste leer","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1saved-views_post","tags":["UserSavedView"],"responses":{"201":{"description":"UserSavedView resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSavedView-saved_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserSavedView.jsonld-saved_view.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a UserSavedView resource.","description":"Creates a UserSavedView resource.","parameters":[],"requestBody":{"description":"The new UserSavedView resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSavedView-saved_view.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserSavedView-saved_view.write"}}},"required":true}}},"/api/v1/saved-views/{ulid}":{"get":{"operationId":"api_v1saved-views_ulid_get","tags":["UserSavedView"],"responses":{"200":{"description":"UserSavedView resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSavedView-saved_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserSavedView.jsonld-saved_view.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a UserSavedView resource.","description":"Retrieves a UserSavedView resource.","parameters":[{"name":"ulid","in":"path","description":"UserSavedView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1saved-views_ulid_delete","tags":["UserSavedView"],"responses":{"204":{"description":"UserSavedView resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the UserSavedView resource.","description":"Removes the UserSavedView resource.","parameters":[{"name":"ulid","in":"path","description":"UserSavedView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1saved-views_ulid_patch","tags":["UserSavedView"],"responses":{"200":{"description":"UserSavedView resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSavedView-saved_view.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserSavedView.jsonld-saved_view.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the UserSavedView resource.","description":"Updates the UserSavedView resource.","parameters":[{"name":"ulid","in":"path","description":"UserSavedView identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated UserSavedView resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/UserSavedView-saved_view.write.jsonMergePatch"}}},"required":true}}},"/api/v1/ui-preferences":{"get":{"operationId":"api_v1ui-preferences_get_collection","tags":["UserUiPreference"],"responses":{"200":{"description":"UserUiPreference collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserUiPreference-ui_pref.read"}}},"application/ld+json":{"schema":{"type":"object","description":"UserUiPreference.jsonld-ui_pref.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/UserUiPreference.jsonld-ui_pref.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of UserUiPreference resources.","description":"Retrieves the collection of UserUiPreference resources.","parameters":[]},"post":{"operationId":"api_v1ui-preferences_post","tags":["UserUiPreference"],"responses":{"201":{"description":"UserUiPreference resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUiPreference-ui_pref.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserUiPreference.jsonld-ui_pref.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a UserUiPreference resource.","description":"Creates a UserUiPreference resource.","parameters":[],"requestBody":{"description":"The new UserUiPreference resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUiPreference-ui_pref.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserUiPreference-ui_pref.write"}}},"required":true}}},"/api/v1/ui-preferences/{ulid}":{"get":{"operationId":"api_v1ui-preferences_ulid_get","tags":["UserUiPreference"],"responses":{"200":{"description":"UserUiPreference resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUiPreference-ui_pref.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserUiPreference.jsonld-ui_pref.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a UserUiPreference resource.","description":"Retrieves a UserUiPreference resource.","parameters":[{"name":"ulid","in":"path","description":"UserUiPreference identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1ui-preferences_ulid_delete","tags":["UserUiPreference"],"responses":{"204":{"description":"UserUiPreference resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the UserUiPreference resource.","description":"Removes the UserUiPreference resource.","parameters":[{"name":"ulid","in":"path","description":"UserUiPreference identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1ui-preferences_ulid_patch","tags":["UserUiPreference"],"responses":{"200":{"description":"UserUiPreference resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUiPreference-ui_pref.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/UserUiPreference.jsonld-ui_pref.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the UserUiPreference resource.","description":"Updates the UserUiPreference resource.","parameters":[{"name":"ulid","in":"path","description":"UserUiPreference identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated UserUiPreference resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/UserUiPreference-ui_pref.write.jsonMergePatch"}}},"required":true}}},"/api/v1/utilization":{"get":{"operationId":"api_v1utilization_get_collection","tags":["Utilization"],"responses":{"200":{"description":"Utilization collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Utilization-utilization.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Utilization.jsonld-utilization.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Utilization.jsonld-utilization.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Utilization resources.","description":"Retrieves the collection of Utilization resources.","parameters":[{"name":"from","in":"query","description":"Zeitraum-Beginn (Default: Montag der laufenden Woche)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Zeitraum-Ende (Default: from + 12 Wochen)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"granularity","in":"query","description":"Perioden-Raster (Default: week)","required":false,"deprecated":false,"schema":{"type":"string","enum":["day","week","month"]},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (nur innerhalb des eigenen Marken-Scopes zulässig)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID (mehrfach angebbar: employeeId[]=…)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"includeFreelancers","in":"query","description":"Freelancer einbeziehen (Default: true; 0 blendet sie aus)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]}},"/api/v1/international/vat-id-checks":{"get":{"operationId":"api_v1internationalvat-id-checks_get_collection","tags":["VatIdCheck"],"responses":{"200":{"description":"VatIdCheck collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VatIdCheck-vat_id_check.read"}}},"application/ld+json":{"schema":{"type":"object","description":"VatIdCheck.jsonld-vat_id_check.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/VatIdCheck.jsonld-vat_id_check.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of VatIdCheck resources.","description":"Retrieves the collection of VatIdCheck resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"vatId","in":"query","description":"Nur Prüfungen dieser USt-IdNr. (Schreibweise egal)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"partnerId","in":"query","description":"Nur Prüfungen zu diesem Geschäftspartner","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"result","in":"query","description":"valid | invalid | unavailable","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[checkedAt]","in":"query","description":"Sortierung nach Prüfzeitpunkt (asc|desc, Default desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1internationalvat-id-checks_post","tags":["VatIdCheck"],"responses":{"201":{"description":"VatIdCheck resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VatIdCheck-vat_id_check.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/VatIdCheck.jsonld-vat_id_check.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"USt-IdNr. prüfen","description":"Payload `{vatId, partnerId?, refresh?}`. Ohne `refresh` gilt eine bereits bestätigte Nummer für die eingestellte Frist (`international.vat_id.recheck_days`, Vorgabe 90 Tage) als bestätigt und es wird KEINE neue Abfrage gestellt — nur so übersteht die Steuerermittlung eine Rechnung mit zwölf Positionen ohne zwölf Netzabfragen. Ein nicht erreichbarer Dienst liefert `result=unavailable` (HTTP 201, kein Fehler): eine Netzstörung entwertet keine gültige Nummer und winkt keine ungültige durch.","parameters":[],"requestBody":{"description":"The new VatIdCheck resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VatIdCheck-vat_id_check.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/VatIdCheck-vat_id_check.write"}}},"required":true}}},"/api/v1/visibility-policies":{"get":{"operationId":"api_v1visibility-policies_get_collection","tags":["VisibilityPolicy"],"responses":{"200":{"description":"VisibilityPolicy collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VisibilityPolicy-visibility_policy.read"}}},"application/ld+json":{"schema":{"type":"object","description":"VisibilityPolicy.jsonld-visibility_policy.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/VisibilityPolicy.jsonld-visibility_policy.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of VisibilityPolicy resources.","description":"Retrieves the collection of VisibilityPolicy resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true}]},"post":{"operationId":"api_v1visibility-policies_post","tags":["VisibilityPolicy"],"responses":{"200":{"description":"VisibilityPolicy resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityPolicy-visibility_policy.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/VisibilityPolicy.jsonld-visibility_policy.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a VisibilityPolicy resource.","description":"Creates a VisibilityPolicy resource.","parameters":[],"requestBody":{"description":"The new VisibilityPolicy resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityPolicy-visibility_policy.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/VisibilityPolicy-visibility_policy.write"}}},"required":true}}},"/api/v1/visibility-policies/{ulid}":{"delete":{"operationId":"api_v1visibility-policies_ulid_delete","tags":["VisibilityPolicy"],"responses":{"204":{"description":"VisibilityPolicy resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the VisibilityPolicy resource.","description":"Removes the VisibilityPolicy resource.","parameters":[{"name":"ulid","in":"path","description":"VisibilityPolicy identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1visibility-policies_ulid_patch","tags":["VisibilityPolicy"],"responses":{"200":{"description":"VisibilityPolicy resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityPolicy-visibility_policy.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/VisibilityPolicy.jsonld-visibility_policy.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the VisibilityPolicy resource.","description":"Updates the VisibilityPolicy resource.","parameters":[{"name":"ulid","in":"path","description":"VisibilityPolicy identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated VisibilityPolicy resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/VisibilityPolicy-visibility_policy.write.jsonMergePatch"}}},"required":true}}},"/api/v1/visibility-targets":{"get":{"operationId":"api_v1visibility-targets_get_collection","tags":["VisibilityTargetResource"],"responses":{"200":{"description":"VisibilityTargetResource collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VisibilityTargetResource-visibility_target.read"}}},"application/ld+json":{"schema":{"type":"object","description":"VisibilityTargetResource.jsonld-visibility_target.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/VisibilityTargetResource.jsonld-visibility_target.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of VisibilityTargetResource resources.","description":"Retrieves the collection of VisibilityTargetResource resources.","parameters":[]}},"/api/v1/promotions/vouchers":{"get":{"operationId":"api_v1promotionsvouchers_get_collection","tags":["Voucher"],"responses":{"200":{"description":"Voucher collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Voucher-voucher.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Voucher.jsonld-voucher.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Voucher.jsonld-voucher.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Voucher resources.","description":"Retrieves the collection of Voucher resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"code","in":"query","description":"EXAKTER Nachschlag über den Code (Gross-/Kleinschreibung egal) — ein Code ist eine Kennung, keine Suche","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"kind","in":"query","description":"Art: `discount` (Rabattgutschein, nur am Auftrag einlösbar) oder `credit` (gekauftes Guthaben, nur an der Kasse)","required":false,"deprecated":false,"schema":{"type":"string","enum":["discount","credit"]},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. gesperrte (false) Gutscheine","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"redeemable","in":"query","description":"true = heute einlösbar (aktiv, im Gültigkeitsfenster, Restwert bzw. Einlöse-Kontingent übrig)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"customerId","in":"query","description":"Nur Gutscheine dieses Kunden (exakter Match)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"q","in":"query","description":"LIKE-Suche über Code und Bezeichnung","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1promotionsvouchers_post","tags":["Voucher"],"responses":{"201":{"description":"Voucher resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voucher-voucher.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Voucher.jsonld-voucher.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Voucher resource.","description":"Stellt einen Gutschein aus. Ohne `code` erzeugt der Server einen; mit `codeCount` > 1 eine ganze Serie (Antwort: der erste, die übrigen über die Liste). `rateType=amount` startet mit `valueAmount` als Restwert. `kind` legt die Art fest — `discount` (Standard, Rabatt am Auftrag) oder `credit` (gekauftes Guthaben, nur an der Kasse; verlangt `rateType=amount`).","parameters":[],"requestBody":{"description":"The new Voucher resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voucher-voucher.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Voucher-voucher.write"}}},"required":true}}},"/api/v1/promotions/vouchers/{ulid}":{"get":{"operationId":"api_v1promotionsvouchers_ulid_get","tags":["Voucher"],"responses":{"200":{"description":"Voucher resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voucher-voucher.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Voucher.jsonld-voucher.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Voucher resource.","description":"Retrieves a Voucher resource.","parameters":[{"name":"ulid","in":"path","description":"Voucher identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1promotionsvouchers_ulid_delete","tags":["Voucher"],"responses":{"204":{"description":"Voucher resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Voucher resource.","description":"Soft-Delete. Ein bereits eingelöster Gutschein wird nicht gelöscht (409) — sonst stünde eine Beleg-Position ohne Herkunft da.","parameters":[{"name":"ulid","in":"path","description":"Voucher identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1promotionsvouchers_ulid_patch","tags":["Voucher"],"responses":{"200":{"description":"Voucher resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Voucher-voucher.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Voucher.jsonld-voucher.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Voucher resource.","description":"Ändert einen Gutschein. Der Restwert lässt sich NICHT frei setzen — er ist das Ergebnis der Einlösungen; nur `active` sperrt einen Gutschein. `kind` ist nur änderbar, solange nichts eingelöst wurde (409) — an der Art hängt die Umsatzsteuer.","parameters":[{"name":"ulid","in":"path","description":"Voucher identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Voucher resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Voucher-voucher.write.jsonMergePatch"}}},"required":true}}},"/api/v1/warehouses":{"get":{"operationId":"api_v1warehouses_get_collection","tags":["Warehouse"],"responses":{"200":{"description":"Warehouse collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Warehouse-warehouse.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Warehouse.jsonld-warehouse.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Warehouse.jsonld-warehouse.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Warehouse resources.","description":"Retrieves the collection of Warehouse resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Lager","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1warehouses_post","tags":["Warehouse"],"responses":{"201":{"description":"Warehouse resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Warehouse-warehouse.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Warehouse.jsonld-warehouse.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Warehouse resource.","description":"Creates a Warehouse resource.","parameters":[],"requestBody":{"description":"The new Warehouse resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Warehouse-warehouse.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Warehouse-warehouse.write"}}},"required":true}}},"/api/v1/warehouses/{ulid}":{"get":{"operationId":"api_v1warehouses_ulid_get","tags":["Warehouse"],"responses":{"200":{"description":"Warehouse resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Warehouse-warehouse.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Warehouse.jsonld-warehouse.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Warehouse resource.","description":"Retrieves a Warehouse resource.","parameters":[{"name":"ulid","in":"path","description":"Warehouse identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1warehouses_ulid_delete","tags":["Warehouse"],"responses":{"204":{"description":"Warehouse resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Warehouse resource.","description":"Removes the Warehouse resource.","parameters":[{"name":"ulid","in":"path","description":"Warehouse identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1warehouses_ulid_patch","tags":["Warehouse"],"responses":{"200":{"description":"Warehouse resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Warehouse-warehouse.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Warehouse.jsonld-warehouse.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Warehouse resource.","description":"Updates the Warehouse resource.","parameters":[{"name":"ulid","in":"path","description":"Warehouse identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Warehouse resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Warehouse-warehouse.write.jsonMergePatch"}}},"required":true}}},"/api/v1/warehouses/{warehouseUlid}/bins":{"get":{"operationId":"api_v1warehouses_warehouseUlidbins_get_collection","tags":["WarehouseBin"],"responses":{"200":{"description":"WarehouseBin collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WarehouseBin-warehouse_bin.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WarehouseBin.jsonld-warehouse_bin.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WarehouseBin.jsonld-warehouse_bin.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WarehouseBin resources.","description":"Retrieves the collection of WarehouseBin resources.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"type","in":"query","description":"Platzart: pick|reserve|inbound|clarification|returns|retail","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1warehouses_warehouseUlidbins_post","tags":["WarehouseBin"],"responses":{"201":{"description":"WarehouseBin resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarehouseBin-warehouse_bin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WarehouseBin.jsonld-warehouse_bin.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Lagerplatz anlegen","description":"Legt einen Lagerplatz (Bin) in diesem Lagerort an.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WarehouseBin resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarehouseBin-warehouse_bin.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WarehouseBin-warehouse_bin.write"}}},"required":true}}},"/api/v1/warehouses/{warehouseUlid}/bins/{ulid}":{"delete":{"operationId":"api_v1warehouses_warehouseUlidbins_ulid_delete","tags":["WarehouseBin"],"responses":{"204":{"description":"WarehouseBin resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WarehouseBin resource.","description":"Removes the WarehouseBin resource.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ulid","in":"path","description":"WarehouseBin identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1warehouses_warehouseUlidbins_ulid_patch","tags":["WarehouseBin"],"responses":{"200":{"description":"WarehouseBin resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarehouseBin-warehouse_bin.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WarehouseBin.jsonld-warehouse_bin.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the WarehouseBin resource.","description":"Updates the WarehouseBin resource.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"ulid","in":"path","description":"WarehouseBin identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated WarehouseBin resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/WarehouseBin-warehouse_bin.write.jsonMergePatch"}}},"required":true}}},"/api/v1/warehouses/{warehouseUlid}/stock":{"get":{"operationId":"api_v1warehouses_warehouseUlidstock_get_collection","tags":["WarehouseStock"],"responses":{"200":{"description":"WarehouseStock collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WarehouseStock-warehouse_stock.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WarehouseStock.jsonld-warehouse_stock.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WarehouseStock.jsonld-warehouse_stock.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WarehouseStock resources.","description":"Retrieves the collection of WarehouseStock resources.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseResource identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"onlyUnvalued","in":"query","description":"true → nur Bestandszeilen mit Bestand, aber ohne bekannten Einstandspreis","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]}},"/api/v1/warehouses/{warehouseUlid}/stock-value":{"get":{"operationId":"warehouse_stock_value_report","tags":["WarehouseStockValue"],"responses":{"200":{"description":"WarehouseStockValue resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarehouseStockValue-warehouse_stock_value.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WarehouseStockValue.jsonld-warehouse_stock_value.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a WarehouseStockValue resource.","description":"Bestandswert dieses Lagers nach gleitendem Durchschnitt: Gesamtsumme, Zeilen je Artikel und — ausdrücklich — die Zahl der Artikel ohne bekannten Einstandspreis.","parameters":[{"name":"warehouseUlid","in":"path","description":"WarehouseStockValue identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"onlyUnvalued","in":"query","description":"true → nur Bestandszeilen ohne bekannten Einstandspreis (derselbe Schnitt wie ?onlyUnvalued=1 auf der Bestandsliste)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"limit","in":"query","description":"Anzahl der Einzelzeilen (Default 100); die Summen bleiben davon unberührt","required":false,"deprecated":false,"schema":{"type":"integer","maximum":500},"style":"form","explode":true}]}},"/api/v1/webhooks":{"get":{"operationId":"api_v1webhooks_get_collection","tags":["Webhook"],"responses":{"200":{"description":"Webhook collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Webhook-webhook.read"}}},"application/ld+json":{"schema":{"type":"object","description":"Webhook.jsonld-webhook.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/Webhook.jsonld-webhook.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of Webhook resources.","description":"Retrieves the collection of Webhook resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Webhooks","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"q","in":"query","description":"Suche über Name und Ziel-URL (LIKE)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1webhooks_post","tags":["Webhook"],"responses":{"201":{"description":"Webhook resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook-webhook.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Webhook.jsonld-webhook.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a Webhook resource.","description":"Creates a Webhook resource.","parameters":[],"requestBody":{"description":"The new Webhook resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook-webhook.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Webhook-webhook.write"}}},"required":true}}},"/api/v1/webhooks/{ulid}":{"get":{"operationId":"api_v1webhooks_ulid_get","tags":["Webhook"],"responses":{"200":{"description":"Webhook resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook-webhook.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Webhook.jsonld-webhook.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a Webhook resource.","description":"Retrieves a Webhook resource.","parameters":[{"name":"ulid","in":"path","description":"Webhook identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1webhooks_ulid_delete","tags":["Webhook"],"responses":{"204":{"description":"Webhook resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the Webhook resource.","description":"Removes the Webhook resource.","parameters":[{"name":"ulid","in":"path","description":"Webhook identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1webhooks_ulid_patch","tags":["Webhook"],"responses":{"200":{"description":"Webhook resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook-webhook.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/Webhook.jsonld-webhook.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the Webhook resource.","description":"Updates the Webhook resource.","parameters":[{"name":"ulid","in":"path","description":"Webhook identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated Webhook resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/Webhook-webhook.write.jsonMergePatch"}}},"required":true}}},"/api/v1/webhook-event-catalog":{"get":{"operationId":"api_v1webhook-event-catalog_get_collection","tags":["WebhookEventCatalog"],"responses":{"200":{"description":"WebhookEventCatalog collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventCatalog-webhook_event_catalog.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WebhookEventCatalog.jsonld-webhook_event_catalog.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventCatalog.jsonld-webhook_event_catalog.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WebhookEventCatalog resources.","description":"Retrieves the collection of WebhookEventCatalog resources.","parameters":[]}},"/api/v1/work-items":{"get":{"operationId":"api_v1work-items_get_collection","tags":["WorkItem"],"responses":{"200":{"description":"WorkItem collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkItem-workitem.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkItem.jsonld-workitem.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkItem resources.","description":"Retrieves the collection of WorkItem resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"kind","in":"query","description":"Ausprägung (task|ticket)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"q","in":"query","description":"Volltextsuche über Titel und Referenz","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"statusId","in":"query","description":"Status-Schlüssel (mehrere komma-getrennt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"priorityId","in":"query","description":"Prioritäts-Schlüssel (mehrere komma-getrennt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"assigneeId","in":"query","description":"Zuständiger (User-ID, mehrere komma-getrennt) — treffergenau","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"mine","in":"query","description":"Nur eigene Vorgänge (löst auf den angemeldeten Nutzer auf)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID (mehrere komma-getrennt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"listId","in":"query","description":"Listen-ID (mehrere komma-getrennt)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (markenlose Vorgänge bleiben sichtbar)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"parentUlid","in":"query","description":"ULID des übergeordneten Vorgangs (Subtasks)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"includeArchived","in":"query","description":"Archivierte Vorgänge und Vorgänge archivierter Listen einschließen (Default: aus)","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"unplanned","in":"query","description":"Nur ungeplante offene Aufgaben (ohne Start ODER ohne Fälligkeit) — Nachschub-Fläche des Planners","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"showDone","in":"query","description":"false blendet erledigte Vorgänge aus (Status-Kategorie done/cancelled); ohne Parameter bleiben sie sichtbar. Ein expliziter statusId-Filter gewinnt.","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true},{"name":"order[createdAt]","in":"query","description":"Sortierung nach Erstelldatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[updatedAt]","in":"query","description":"Sortierung nach Änderungsdatum (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[startAt]","in":"query","description":"Sortierung nach geplantem Start (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[dueDate]","in":"query","description":"Sortierung nach Fälligkeit (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[title]","in":"query","description":"Sortierung nach Titel (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[position]","in":"query","description":"Sortierung nach Position (asc|desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1work-items_post","tags":["WorkItem"],"responses":{"201":{"description":"WorkItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkItem resource.","description":"Creates a WorkItem resource.","parameters":[],"requestBody":{"description":"The new WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}}},"required":true}}},"/api/v1/work-items/{ulid}":{"get":{"operationId":"api_v1work-items_ulid_get","tags":["WorkItem"],"responses":{"200":{"description":"WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a WorkItem resource.","description":"Retrieves a WorkItem resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1work-items_ulid_delete","tags":["WorkItem"],"responses":{"204":{"description":"WorkItem resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WorkItem resource.","description":"Removes the WorkItem resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1work-items_ulid_patch","tags":["WorkItem"],"responses":{"200":{"description":"WorkItem resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the WorkItem resource.","description":"Updates the WorkItem resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated WorkItem resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write.jsonMergePatch"}}},"required":true}}},"/api/v1/work-items/{ulid}/archive":{"post":{"operationId":"workitem_archive","tags":["WorkItem"],"responses":{"201":{"description":"WorkItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vorgang archivieren","description":"Archiviert den Vorgang (Soft-Archiv). Archivierte Vorgänge verschwinden aus Standard-Listen und bleiben über includeArchived=1 sichtbar.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}}},"required":true}}},"/api/v1/work-items/{ulid}/comments":{"post":{"operationId":"workitem_comment_add","tags":["WorkItem"],"responses":{"201":{"description":"WorkItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Kommentar am Vorgang anlegen","description":"Legt einen Kommentar am Work-Item an (über Unified Messaging).","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}}},"required":true}}},"/api/v1/work-items/{ulid}/dependencies":{"post":{"operationId":"workitem_dependency_add","tags":["WorkItem"],"responses":{"201":{"description":"WorkItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Abhängigkeit zu einem anderen Vorgang anlegen","description":"Legt eine Abhängigkeit zu einem anderen Work-Item an (`targetUlid`, `type` Default `blocked_by`, `lagDays` Default 0 und nur bei FS/SS/FF/SF wirksam).","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}}},"required":true}}},"/api/v1/work-items/{ulid}/dependencies/{depUlid}":{"delete":{"operationId":"workitem_dependency_remove","tags":["WorkItem"],"responses":{"204":{"description":"WorkItem resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WorkItem resource.","description":"Removes the WorkItem resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false},{"name":"depUlid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/work-items/{ulid}/move":{"post":{"operationId":"workitem_move","tags":["WorkItem"],"responses":{"201":{"description":"WorkItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Move work item","description":"Move work item. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}}},"required":true}}},"/api/v1/work-items/{ulid}/unarchive":{"post":{"operationId":"workitem_unarchive","tags":["WorkItem"],"responses":{"201":{"description":"WorkItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Vorgang dearchivieren","description":"Holt den Vorgang aus dem Soft-Archiv zurück in die Standard-Listen.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}}},"required":true}}},"/api/v1/work-items/{ulid}/unwatch":{"post":{"operationId":"workitem_unwatch","tags":["WorkItem"],"responses":{"201":{"description":"WorkItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Stop watching work item","description":"Stop watching work item. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}}},"required":true}}},"/api/v1/work-items/{ulid}/watch":{"post":{"operationId":"workitem_watch","tags":["WorkItem"],"responses":{"201":{"description":"WorkItem resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem.jsonld-workitem.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Watch work item","description":"Watch work item. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"WorkItem identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkItem resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItem-workitem.write"}}},"required":true}}},"/api/v1/work-item-attachments":{"get":{"operationId":"api_v1work-item-attachments_get_collection","tags":["WorkItemAttachment"],"responses":{"200":{"description":"WorkItemAttachment collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemAttachment-wi_attachment.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkItemAttachment.jsonld-wi_attachment.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemAttachment.jsonld-wi_attachment.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkItemAttachment resources.","description":"Retrieves the collection of WorkItemAttachment resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"workItemUlid","in":"query","description":"Vorgangs-ULID. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1work-item-attachments_post","tags":["WorkItemAttachment"],"responses":{"201":{"description":"WorkItemAttachment resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemAttachment-wi_attachment.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItemAttachment.jsonld-wi_attachment.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkItemAttachment resource.","description":"Creates a WorkItemAttachment resource.","parameters":[],"requestBody":{"description":"The new WorkItemAttachment resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemAttachment-wi_attachment.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItemAttachment-wi_attachment.write"}}},"required":true}}},"/api/v1/work-item-attachments/{ulid}":{"delete":{"operationId":"api_v1work-item-attachments_ulid_delete","tags":["WorkItemAttachment"],"responses":{"204":{"description":"WorkItemAttachment resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WorkItemAttachment resource.","description":"Removes the WorkItemAttachment resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItemAttachment identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/work-item-links":{"get":{"operationId":"api_v1work-item-links_get_collection","tags":["WorkItemLink"],"responses":{"200":{"description":"WorkItemLink collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemLink-workitemlink.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkItemLink.jsonld-workitemlink.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemLink.jsonld-workitemlink.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkItemLink resources.","description":"Retrieves the collection of WorkItemLink resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"workItemUlid","in":"query","description":"ULID des Anker-Vorgangs. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]},"post":{"operationId":"api_v1work-item-links_post","tags":["WorkItemLink"],"responses":{"201":{"description":"WorkItemLink resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLink-workitemlink.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItemLink.jsonld-workitemlink.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkItemLink resource.","description":"Creates a WorkItemLink resource.","parameters":[],"requestBody":{"description":"The new WorkItemLink resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLink-workitemlink.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItemLink-workitemlink.write"}}},"required":true}}},"/api/v1/work-item-links/{ulid}":{"delete":{"operationId":"api_v1work-item-links_ulid_delete","tags":["WorkItemLink"],"responses":{"204":{"description":"WorkItemLink resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WorkItemLink resource.","description":"Removes the WorkItemLink resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItemLink identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/work-item-lists":{"get":{"operationId":"api_v1work-item-lists_get_collection","tags":["WorkItemList"],"responses":{"200":{"description":"WorkItemList collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemList-workitemlist.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkItemList.jsonld-workitemlist.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemList.jsonld-workitemlist.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkItemList resources.","description":"Retrieves the collection of WorkItemList resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"availableForProject","in":"query","description":"Globale plus Listen dieses Projekts; hat Vorrang vor projectId","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"projectId","in":"query","description":"Projekt-ID; leer/\"null\"/\"0\" = nur globale Listen","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"includeArchived","in":"query","description":"Archivierte Listen einblenden","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1work-item-lists_post","tags":["WorkItemList"],"responses":{"201":{"description":"WorkItemList resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemList-workitemlist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItemList.jsonld-workitemlist.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkItemList resource.","description":"Creates a WorkItemList resource.","parameters":[],"requestBody":{"description":"The new WorkItemList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemList-workitemlist.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItemList-workitemlist.write"}}},"required":true}}},"/api/v1/work-item-lists/{ulid}":{"get":{"operationId":"api_v1work-item-lists_ulid_get","tags":["WorkItemList"],"responses":{"200":{"description":"WorkItemList resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemList-workitemlist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItemList.jsonld-workitemlist.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a WorkItemList resource.","description":"Retrieves a WorkItemList resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItemList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1work-item-lists_ulid_delete","tags":["WorkItemList"],"responses":{"204":{"description":"WorkItemList resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WorkItemList resource.","description":"Removes the WorkItemList resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItemList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1work-item-lists_ulid_patch","tags":["WorkItemList"],"responses":{"200":{"description":"WorkItemList resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemList-workitemlist.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkItemList.jsonld-workitemlist.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the WorkItemList resource.","description":"Updates the WorkItemList resource.","parameters":[{"name":"ulid","in":"path","description":"WorkItemList identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated WorkItemList resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/WorkItemList-workitemlist.write.jsonMergePatch"}}},"required":true}}},"/api/v1/conversation-timeline":{"get":{"operationId":"api_v1conversation-timeline_get_collection","tags":["WorkItemTimeline"],"responses":{"200":{"description":"WorkItemTimeline collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemTimeline-workitem_timeline.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkItemTimeline.jsonld-workitem_timeline.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemTimeline.jsonld-workitem_timeline.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkItemTimeline resources.","description":"Retrieves the collection of WorkItemTimeline resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"itemsPerPage","in":"query","description":"The number of items per page","required":false,"deprecated":false,"schema":{"type":"integer","default":30,"minimum":0,"maximum":100},"style":"form","explode":true},{"name":"subjectType","in":"query","description":"Subjekttyp des Konversations-Threads (task|deal|lead|customer|contact|…, registriert über ConversationSubjectResolver). Pflicht","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"subjectId","in":"query","description":"ULID des Subjekts. Pflicht — ohne beide Filter antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[occurredAt]","in":"query","description":"Sortierung nach Zeitpunkt (asc|desc, Default desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"scope","in":"query","description":"own = nur der Thread des Subjekts (Default); linked = zusätzlich die Nachrichten aller verknüpften Tickets (max. 25 Quellen) in EINEM chronologischen Strom — jede Zeile trägt ihre Herkunft (sourceKind = Subjekttyp bzw. ticket)","required":false,"deprecated":false,"schema":{"type":"string","enum":["own","linked"],"default":"own"},"style":"form","explode":true}]}},"/api/v1/work-item-timeline":{"get":{"operationId":"api_v1work-item-timeline_get_collection","tags":["WorkItemTimeline"],"responses":{"200":{"description":"WorkItemTimeline collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemTimeline-workitem_timeline.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkItemTimeline.jsonld-workitem_timeline.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkItemTimeline.jsonld-workitem_timeline.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkItemTimeline resources.","description":"Retrieves the collection of WorkItemTimeline resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"itemsPerPage","in":"query","description":"The number of items per page","required":false,"deprecated":false,"schema":{"type":"integer","default":30,"minimum":0,"maximum":100},"style":"form","explode":true},{"name":"workItemUlid","in":"query","description":"Vorgangs-ULID. Pflichtfilter — ohne ihn antwortet die API mit 400","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"order[occurredAt]","in":"query","description":"Sortierung nach Zeitpunkt (asc|desc, Default desc)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"scope","in":"query","description":"own = nur dieser Vorgang (Default); linked = zusätzlich die Nachrichten aller verknüpften Tickets (WorkItemLink, max. 25 Quellen) in EINEM chronologischen Strom — jede Zeile trägt ihre Herkunft (sourceWorkItemUlid/sourceRef/sourceKind/sourceTitle/sourceChannel)","required":false,"deprecated":false,"schema":{"type":"string","enum":["own","linked"],"default":"own"},"style":"form","explode":true}]}},"/api/v1/workforce/attendance-days":{"get":{"operationId":"api_v1workforceattendance-days_get_collection","tags":["WorkforceAttendanceDay"],"responses":{"200":{"description":"WorkforceAttendanceDay collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceAttendanceDay-workforce_day.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkforceAttendanceDay.jsonld-workforce_day.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceAttendanceDay.jsonld-workforce_day.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkforceAttendanceDay resources.","description":"Retrieves the collection of WorkforceAttendanceDay resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"Status-Schlüssel (exakter Match)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Arbeitstag ab (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Arbeitstag bis (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]}},"/api/v1/workforce/attendance-days/{ulid}":{"get":{"operationId":"api_v1workforceattendance-days_ulid_get","tags":["WorkforceAttendanceDay"],"responses":{"200":{"description":"WorkforceAttendanceDay resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay-workforce_day.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay.jsonld-workforce_day.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a WorkforceAttendanceDay resource.","description":"Retrieves a WorkforceAttendanceDay resource.","parameters":[{"name":"ulid","in":"path","description":"WorkforceAttendanceDay identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/workforce/attendance-days/{ulid}/approve":{"post":{"operationId":"workforce_day_approve","tags":["WorkforceAttendanceDay"],"responses":{"201":{"description":"WorkforceAttendanceDay resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay-workforce_day.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay.jsonld-workforce_day.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Approve attendance day","description":"Approve attendance day. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"WorkforceAttendanceDay identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkforceAttendanceDay resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay-workforce_day.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay-workforce_day.write"}}},"required":true}}},"/api/v1/workforce/attendance-days/{ulid}/correct":{"post":{"operationId":"workforce_day_correct","tags":["WorkforceAttendanceDay"],"responses":{"201":{"description":"WorkforceAttendanceDay resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay-workforce_day.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay.jsonld-workforce_day.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Correct attendance day","description":"Correct attendance day. Dedicated action endpoint — not a standard CRUD create.","parameters":[{"name":"ulid","in":"path","description":"WorkforceAttendanceDay identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The new WorkforceAttendanceDay resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay-workforce_day.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceDay-workforce_day.write"}}},"required":true}}},"/api/v1/workforce/attendance-events":{"get":{"operationId":"api_v1workforceattendance-events_get_collection","tags":["WorkforceAttendanceEvent"],"responses":{"200":{"description":"WorkforceAttendanceEvent collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceAttendanceEvent-workforce_event.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkforceAttendanceEvent.jsonld-workforce_event.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceAttendanceEvent.jsonld-workforce_event.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkforceAttendanceEvent resources.","description":"Retrieves the collection of WorkforceAttendanceEvent resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"from","in":"query","description":"Arbeitstag ab (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Arbeitstag bis (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]}},"/api/v1/workforce/attendance-events/sync":{"post":{"operationId":"workforce_attendance_sync","tags":["WorkforceAttendanceEvent"],"responses":{"201":{"description":"WorkforceAttendanceEvent resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceEvent-workforce_event.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceEvent.jsonld-workforce_event.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Sync attendance event","description":"Sync attendance event. Dedicated action endpoint — not a standard CRUD create.","parameters":[],"requestBody":{"description":"The new WorkforceAttendanceEvent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceEvent-workforce_event.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceEvent-workforce_event.write"}}},"required":true}}},"/api/v1/workforce/clock":{"post":{"operationId":"workforce_clock","tags":["WorkforceAttendanceEvent"],"responses":{"201":{"description":"WorkforceAttendanceEvent resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceEvent-workforce_event.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceEvent.jsonld-workforce_event.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Record time-clock event for workforce","description":"Record time-clock event for workforce. Dedicated action endpoint — not a standard CRUD create.","parameters":[],"requestBody":{"description":"The new WorkforceAttendanceEvent resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceEvent-workforce_event.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceAttendanceEvent-workforce_event.write"}}},"required":true}}},"/api/v1/workforce/clock-state":{"get":{"operationId":"api_v1workforceclock-state_get_collection","tags":["WorkforceClockState"],"responses":{"200":{"description":"WorkforceClockState collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceClockState-workforce_clock_state.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkforceClockState.jsonld-workforce_clock_state.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceClockState.jsonld-workforce_clock_state.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkforceClockState resources.","description":"Retrieves the collection of WorkforceClockState resources.","parameters":[]}},"/api/v1/workforce/payroll-export":{"get":{"operationId":"workforce_payroll_export","tags":["WorkforcePayrollExport"],"responses":{"200":{"description":"WorkforcePayrollExport resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforcePayrollExport-workforce_payroll.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforcePayrollExport.jsonld-workforce_payroll.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a WorkforcePayrollExport resource.","description":"Retrieves a WorkforcePayrollExport resource.","parameters":[{"name":"month","in":"query","description":"Kalendermonat YYYY-MM (Pflicht)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (optional — sonst gesamter Marken-Scope des Aufrufers)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/workforce/payroll-export/file":{"get":{"operationId":"workforce_payroll_export_file","tags":["WorkforcePayrollExport"],"responses":{"204":{"description":"WorkforcePayrollExport resource"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a WorkforcePayrollExport resource.","description":"Retrieves a WorkforcePayrollExport resource.","parameters":[{"name":"month","in":"query","description":"Kalendermonat YYYY-MM (Pflicht)","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID (optional)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"format","in":"query","description":"Dateiformat: datev-lodas (Default) | csv","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true}]}},"/api/v1/workforce/period-locks":{"get":{"operationId":"api_v1workforceperiod-locks_get_collection","tags":["WorkforcePeriodLock"],"responses":{"200":{"description":"WorkforcePeriodLock collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkforcePeriodLock-workforce_period_lock.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkforcePeriodLock.jsonld-workforce_period_lock.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkforcePeriodLock.jsonld-workforce_period_lock.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkforcePeriodLock resources.","description":"Retrieves the collection of WorkforcePeriodLock resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"brandId","in":"query","description":"Marken-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"from","in":"query","description":"Sperren, deren Ende >= from liegt","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Sperren, deren Beginn <= to liegt","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]},"post":{"operationId":"api_v1workforceperiod-locks_post","tags":["WorkforcePeriodLock"],"responses":{"201":{"description":"WorkforcePeriodLock resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforcePeriodLock-workforce_period_lock.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforcePeriodLock.jsonld-workforce_period_lock.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkforcePeriodLock resource.","description":"Creates a WorkforcePeriodLock resource.","parameters":[],"requestBody":{"description":"The new WorkforcePeriodLock resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforcePeriodLock-workforce_period_lock.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforcePeriodLock-workforce_period_lock.write"}}},"required":true}}},"/api/v1/workforce/period-locks/{ulid}":{"delete":{"operationId":"api_v1workforceperiod-locks_ulid_delete","tags":["WorkforcePeriodLock"],"responses":{"204":{"description":"WorkforcePeriodLock resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WorkforcePeriodLock resource.","description":"Removes the WorkforcePeriodLock resource.","parameters":[{"name":"ulid","in":"path","description":"WorkforcePeriodLock identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]}},"/api/v1/workforce/shifts":{"get":{"operationId":"api_v1workforceshifts_get_collection","tags":["WorkforceShift"],"responses":{"200":{"description":"WorkforceShift collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkforceShift.jsonld-workforce_shift.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceShift.jsonld-workforce_shift.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkforceShift resources.","description":"Retrieves the collection of WorkforceShift resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"employeeId","in":"query","description":"Mitarbeiter-ID","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true},{"name":"status","in":"query","description":"planned | published","required":false,"deprecated":false,"schema":{"type":"string"},"style":"form","explode":true},{"name":"from","in":"query","description":"Starttag ab (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true},{"name":"to","in":"query","description":"Starttag bis (einschließlich)","required":false,"deprecated":false,"schema":{"type":"string","format":"date"},"style":"form","explode":true}]},"post":{"operationId":"api_v1workforceshifts_post","tags":["WorkforceShift"],"responses":{"201":{"description":"WorkforceShift resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShift.jsonld-workforce_shift.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkforceShift resource.","description":"Creates a WorkforceShift resource.","parameters":[],"requestBody":{"description":"The new WorkforceShift resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.write"}}},"required":true}}},"/api/v1/workforce/shifts/publish":{"post":{"operationId":"workforce_shifts_publish","tags":["WorkforceShift"],"responses":{"201":{"description":"WorkforceShift resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShift.jsonld-workforce_shift.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkforceShift resource.","description":"Creates a WorkforceShift resource.","parameters":[],"requestBody":{"description":"The new WorkforceShift resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.write"}}},"required":true}}},"/api/v1/workforce/shifts/{ulid}":{"get":{"operationId":"api_v1workforceshifts_ulid_get","tags":["WorkforceShift"],"responses":{"200":{"description":"WorkforceShift resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShift.jsonld-workforce_shift.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a WorkforceShift resource.","description":"Retrieves a WorkforceShift resource.","parameters":[{"name":"ulid","in":"path","description":"WorkforceShift identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1workforceshifts_ulid_delete","tags":["WorkforceShift"],"responses":{"204":{"description":"WorkforceShift resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WorkforceShift resource.","description":"Removes the WorkforceShift resource.","parameters":[{"name":"ulid","in":"path","description":"WorkforceShift identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1workforceshifts_ulid_patch","tags":["WorkforceShift"],"responses":{"200":{"description":"WorkforceShift resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShift.jsonld-workforce_shift.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the WorkforceShift resource.","description":"Updates the WorkforceShift resource.","parameters":[{"name":"ulid","in":"path","description":"WorkforceShift identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated WorkforceShift resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/WorkforceShift-workforce_shift.write.jsonMergePatch"}}},"required":true}}},"/api/v1/workforce/shift-templates":{"get":{"operationId":"api_v1workforceshift-templates_get_collection","tags":["WorkforceShiftTemplate"],"responses":{"200":{"description":"WorkforceShiftTemplate collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceShiftTemplate-workforce_shift_tpl.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkforceShiftTemplate.jsonld-workforce_shift_tpl.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchema"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceShiftTemplate.jsonld-workforce_shift_tpl.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkforceShiftTemplate resources.","description":"Retrieves the collection of WorkforceShiftTemplate resources.","parameters":[{"name":"page","in":"query","description":"The collection page number","required":false,"deprecated":false,"schema":{"type":"integer","default":1},"style":"form","explode":true},{"name":"active","in":"query","description":"Nur aktive (true) bzw. inaktive (false) Vorlagen","required":false,"deprecated":false,"schema":{"type":"boolean"},"style":"form","explode":true}]},"post":{"operationId":"api_v1workforceshift-templates_post","tags":["WorkforceShiftTemplate"],"responses":{"201":{"description":"WorkforceShiftTemplate resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate-workforce_shift_tpl.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate.jsonld-workforce_shift_tpl.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkforceShiftTemplate resource.","description":"Creates a WorkforceShiftTemplate resource.","parameters":[],"requestBody":{"description":"The new WorkforceShiftTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate-workforce_shift_tpl.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate-workforce_shift_tpl.write"}}},"required":true}}},"/api/v1/workforce/shift-templates/{ulid}":{"get":{"operationId":"api_v1workforceshift-templates_ulid_get","tags":["WorkforceShiftTemplate"],"responses":{"200":{"description":"WorkforceShiftTemplate resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate-workforce_shift_tpl.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate.jsonld-workforce_shift_tpl.read"}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves a WorkforceShiftTemplate resource.","description":"Retrieves a WorkforceShiftTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"WorkforceShiftTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"delete":{"operationId":"api_v1workforceshift-templates_ulid_delete","tags":["WorkforceShiftTemplate"],"responses":{"204":{"description":"WorkforceShiftTemplate resource deleted"},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Removes the WorkforceShiftTemplate resource.","description":"Removes the WorkforceShiftTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"WorkforceShiftTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}]},"patch":{"operationId":"api_v1workforceshift-templates_ulid_patch","tags":["WorkforceShiftTemplate"],"responses":{"200":{"description":"WorkforceShiftTemplate resource updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate-workforce_shift_tpl.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate.jsonld-workforce_shift_tpl.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Updates the WorkforceShiftTemplate resource.","description":"Updates the WorkforceShiftTemplate resource.","parameters":[{"name":"ulid","in":"path","description":"WorkforceShiftTemplate identifier","required":true,"deprecated":false,"schema":{"type":"string","pattern":"^[0-9A-HJKMNP-TV-Z]{26}$"},"style":"simple","explode":false}],"requestBody":{"description":"The updated WorkforceShiftTemplate resource","content":{"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/WorkforceShiftTemplate-workforce_shift_tpl.write.jsonMergePatch"}}},"required":true}}},"/api/v1/workforce/account":{"get":{"operationId":"api_v1workforceaccount_get_collection","tags":["WorkforceWorkTimeAccount"],"responses":{"200":{"description":"WorkforceWorkTimeAccount collection","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceWorkTimeAccount-workforce_account.read"}}},"application/ld+json":{"schema":{"type":"object","description":"WorkforceWorkTimeAccount.jsonld-workforce_account.read collection.","allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","required":["hydra:member"],"properties":{"hydra:member":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceWorkTimeAccount.jsonld-workforce_account.read"}}}}]}}}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Retrieves the collection of WorkforceWorkTimeAccount resources.","description":"Retrieves the collection of WorkforceWorkTimeAccount resources.","parameters":[{"name":"employeeId","in":"query","description":"Mitarbeiter-ID — Default: eigener Mitarbeiter; fremde Konten nur mit workforce.account.view_any (sonst 403)","required":false,"deprecated":false,"schema":{"type":"integer"},"style":"form","explode":true}]}},"/api/v1/workforce/account/adjust":{"post":{"operationId":"workforce_account_adjust","tags":["WorkforceWorkTimeAccount"],"responses":{"201":{"description":"WorkforceWorkTimeAccount resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceWorkTimeAccount-workforce_account.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceWorkTimeAccount.jsonld-workforce_account.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkforceWorkTimeAccount resource.","description":"Creates a WorkforceWorkTimeAccount resource.","parameters":[],"requestBody":{"description":"The new WorkforceWorkTimeAccount resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkforceWorkTimeAccount-workforce_account.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkforceWorkTimeAccount-workforce_account.write"}}},"required":true}}},"/api/v1/planning/workload-autofix":{"post":{"operationId":"api_v1planningworkload-autofix_post","tags":["WorkloadAutofix"],"responses":{"201":{"description":"WorkloadAutofix resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadAutofix-workloadautofix.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkloadAutofix.jsonld-workloadautofix.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkloadAutofix resource.","description":"Schlägt Verschiebungen zur Entlastung überbuchter Tage vor (ändert nichts).","parameters":[],"requestBody":{"description":"The new WorkloadAutofix resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadAutofix-workloadautofix.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkloadAutofix-workloadautofix.write"}}},"required":true}}},"/api/v1/planning/workload-autofix/apply":{"post":{"operationId":"api_v1planningworkload-autofixapply_post","tags":["WorkloadAutofix"],"responses":{"201":{"description":"WorkloadAutofix resource created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadAutofix-workloadautofix.read"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkloadAutofix.jsonld-workloadautofix.read"}}},"links":{}},"400":{"description":"Invalid input","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}},"422":{"description":"An error occurred","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}},"application/json":{"schema":{"$ref":"#/components/schemas/ConstraintViolation"}}},"links":{}},"403":{"description":"Forbidden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"links":{}}},"summary":"Creates a WorkloadAutofix resource.","description":"Übernimmt die bestätigten Verschiebungen (setzt startAt/dueDate).","parameters":[],"requestBody":{"description":"The new WorkloadAutofix resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadAutofix-workloadautofix.write"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/WorkloadAutofix-workloadautofix.write"}}},"required":true}}}},"components":{"schemas":{"Affiliate-affiliate.read":{"type":"object","description":"Affiliate-Rolle am geteilten Geschäftspartner (04-24 §8) — CRUD unter `affiliates`.\n- POST löst `businessPartnerUlid` zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01); Rolle existiert bereits → 409.\n- DELETE: soft, nur ohne offene (pending/approved) Provisions-Abgrenzungen (409).\n- Partner: markenübergreifende Stammdaten, kein Brand-Scope (Muster Suppliers).\n- ULID-Format-Requirement, damit Literal-Segment `attributions` nicht als {ulid} matcht (Muster SalesOrder).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"businessPartnerId":{"description":"Partner-Master (Customer-Id, read-only — gesetzt via businessPartnerUlid).","type":["integer","null"]},"partnerName":{"description":"Anzeigename des Partners (read-only, Anreicherung aus dem Kunden-Stamm).","type":["string","null"]},"partnerNumber":{"maxLength":50,"type":["string","null"]},"partnerType":{"enum":["affiliate","reseller","internal","referrer"],"description":"affiliate | reseller | internal | referrer.","type":["string","null"]},"status":{"enum":["active","paused","blocked"],"description":"active | paused | blocked.","type":["string","null"]},"defaultTier":{"maxLength":30,"type":["string","null"]},"payoutMode":{"enum":["credit_note","self_billing","partner_invoice"],"description":"credit_note | self_billing | partner_invoice (AF3).","type":["string","null"]},"payoutMethod":{"enum":["sepa","paypal"],"description":"sepa | paypal (AF6).","type":["string","null"]},"minPayoutAmount":{"minimum":0,"description":"Mindestauszahlung in Cent (AF6).","type":["integer","null"]},"linkedEmployeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Mitarbeiter-Verknüpfung für partnerType=internal (AF4).","type":["integer","null"]}}},"Affiliate-affiliate.write":{"type":"object","description":"Affiliate-Rolle am geteilten Geschäftspartner (04-24 §8) — CRUD unter `affiliates`.\n- POST löst `businessPartnerUlid` zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01); Rolle existiert bereits → 409.\n- DELETE: soft, nur ohne offene (pending/approved) Provisions-Abgrenzungen (409).\n- Partner: markenübergreifende Stammdaten, kein Brand-Scope (Muster Suppliers).\n- ULID-Format-Requirement, damit Literal-Segment `attributions` nicht als {ulid} matcht (Muster SalesOrder).","properties":{"businessPartnerUlid":{"description":"Kunden-ULID des Partner-Stamms — Pflicht bei POST (Auflösung zum Customer).","type":["string","null"]},"partnerNumber":{"maxLength":50,"type":["string","null"]},"partnerType":{"enum":["affiliate","reseller","internal","referrer"],"description":"affiliate | reseller | internal | referrer.","type":["string","null"]},"status":{"enum":["active","paused","blocked"],"description":"active | paused | blocked.","type":["string","null"]},"defaultTier":{"maxLength":30,"type":["string","null"]},"payoutMode":{"enum":["credit_note","self_billing","partner_invoice"],"description":"credit_note | self_billing | partner_invoice (AF3).","type":["string","null"]},"payoutMethod":{"enum":["sepa","paypal"],"description":"sepa | paypal (AF6).","type":["string","null"]},"minPayoutAmount":{"minimum":0,"description":"Mindestauszahlung in Cent (AF6).","type":["integer","null"]},"linkedEmployeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Mitarbeiter-Verknüpfung für partnerType=internal (AF4).","type":["integer","null"]}}},"Affiliate-affiliate.write.jsonMergePatch":{"type":"object","description":"Affiliate-Rolle am geteilten Geschäftspartner (04-24 §8) — CRUD unter `affiliates`.\n- POST löst `businessPartnerUlid` zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01); Rolle existiert bereits → 409.\n- DELETE: soft, nur ohne offene (pending/approved) Provisions-Abgrenzungen (409).\n- Partner: markenübergreifende Stammdaten, kein Brand-Scope (Muster Suppliers).\n- ULID-Format-Requirement, damit Literal-Segment `attributions` nicht als {ulid} matcht (Muster SalesOrder).","properties":{"businessPartnerUlid":{"description":"Kunden-ULID des Partner-Stamms — Pflicht bei POST (Auflösung zum Customer).","type":["string","null"]},"partnerNumber":{"maxLength":50,"type":["string","null"]},"partnerType":{"enum":["affiliate","reseller","internal","referrer"],"description":"affiliate | reseller | internal | referrer.","type":["string","null"]},"status":{"enum":["active","paused","blocked"],"description":"active | paused | blocked.","type":["string","null"]},"defaultTier":{"maxLength":30,"type":["string","null"]},"payoutMode":{"enum":["credit_note","self_billing","partner_invoice"],"description":"credit_note | self_billing | partner_invoice (AF3).","type":["string","null"]},"payoutMethod":{"enum":["sepa","paypal"],"description":"sepa | paypal (AF6).","type":["string","null"]},"minPayoutAmount":{"minimum":0,"description":"Mindestauszahlung in Cent (AF6).","type":["integer","null"]},"linkedEmployeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Mitarbeiter-Verknüpfung für partnerType=internal (AF4).","type":["integer","null"]}}},"Affiliate.jsonld-affiliate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"businessPartnerId":{"description":"Partner-Master (Customer-Id, read-only — gesetzt via businessPartnerUlid).","type":["integer","null"]},"partnerName":{"description":"Anzeigename des Partners (read-only, Anreicherung aus dem Kunden-Stamm).","type":["string","null"]},"partnerNumber":{"maxLength":50,"type":["string","null"]},"partnerType":{"enum":["affiliate","reseller","internal","referrer"],"description":"affiliate | reseller | internal | referrer.","type":["string","null"]},"status":{"enum":["active","paused","blocked"],"description":"active | paused | blocked.","type":["string","null"]},"defaultTier":{"maxLength":30,"type":["string","null"]},"payoutMode":{"enum":["credit_note","self_billing","partner_invoice"],"description":"credit_note | self_billing | partner_invoice (AF3).","type":["string","null"]},"payoutMethod":{"enum":["sepa","paypal"],"description":"sepa | paypal (AF6).","type":["string","null"]},"minPayoutAmount":{"minimum":0,"description":"Mindestauszahlung in Cent (AF6).","type":["integer","null"]},"linkedEmployeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Mitarbeiter-Verknüpfung für partnerType=internal (AF4).","type":["integer","null"]}}}],"description":"Affiliate-Rolle am geteilten Geschäftspartner (04-24 §8) — CRUD unter `affiliates`.\n- POST löst `businessPartnerUlid` zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01); Rolle existiert bereits → 409.\n- DELETE: soft, nur ohne offene (pending/approved) Provisions-Abgrenzungen (409).\n- Partner: markenübergreifende Stammdaten, kein Brand-Scope (Muster Suppliers).\n- ULID-Format-Requirement, damit Literal-Segment `attributions` nicht als {ulid} matcht (Muster SalesOrder)."},"AffiliateAccrual-affiliate_accrual.read":{"type":"object","description":"Provisions-Abgrenzungen eines Partners (04-24 §5/§8), read-only.\n- Sub-Resource `/v1/affiliates/{ulid}/accruals` (Filter `status`).\n- Statuswechsel nie über die API — nur ereignis-/laufgetrieben (InvoicePaid/InvoiceCancelled/Abrechnungslauf).","properties":{"ulid":{"type":["string","null"]},"affiliateUlid":{"description":"ULID der Affiliate-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"partnerName":{"description":"Partner-Name (read-only, aus dem Kunden-Stamm der Affiliate-Rolle aufgelöst).","type":["string","null"]},"attributionId":{"description":"Zugehörige Umsatz-Attribution (aff_attribution.id).","type":["integer","null"]},"amountCents":{"description":"Provisionsbetrag in Cent.","type":["integer","null"]},"status":{"description":"pending | approved | reversed | settled.","type":["string","null"]},"earnedAt":{"description":"Verdienst-Zeitpunkt (ISO 8601).","type":["string","null"]},"reversedReason":{"description":"Storno-Grund bei status=reversed.","type":["string","null"]}}},"AffiliateAccrual.jsonld-affiliate_accrual.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"affiliateUlid":{"description":"ULID der Affiliate-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"partnerName":{"description":"Partner-Name (read-only, aus dem Kunden-Stamm der Affiliate-Rolle aufgelöst).","type":["string","null"]},"attributionId":{"description":"Zugehörige Umsatz-Attribution (aff_attribution.id).","type":["integer","null"]},"amountCents":{"description":"Provisionsbetrag in Cent.","type":["integer","null"]},"status":{"description":"pending | approved | reversed | settled.","type":["string","null"]},"earnedAt":{"description":"Verdienst-Zeitpunkt (ISO 8601).","type":["string","null"]},"reversedReason":{"description":"Storno-Grund bei status=reversed.","type":["string","null"]}}}],"description":"Provisions-Abgrenzungen eines Partners (04-24 §5/§8), read-only.\n- Sub-Resource `/v1/affiliates/{ulid}/accruals` (Filter `status`).\n- Statuswechsel nie über die API — nur ereignis-/laufgetrieben (InvoicePaid/InvoiceCancelled/Abrechnungslauf)."},"AffiliateAttribution-affiliate_attribution.read":{"type":"object","description":"Umsatz-Attribution (04-24 §4/§8) — `POST /v1/affiliates/attributions`.\n- Ordnet Umsatz per Referral-Code zu (404 unbekannter Code, 422 abgelaufen — AF2), stößt Provisions-Abgrenzung an.\n- Antwort trägt Accrual-Info (null, wenn keine Regel greift/Partner inaktiv).\n- Order/Invoice: optionale Umsatzquellen (ULIDs → FK-lose Ids, ENT-ERP-OPTDEP-01).\n- ULID-Requirement verhindert Kollision mit `/v1/affiliates/{ulid}`.","properties":{"ulid":{"type":["string","null"]},"referralCode":{"maxLength":50,"description":"Referral-Code der Vermittlung — Pflicht bei POST.","type":["string","null"]},"orderId":{"description":"Aufgelöste Auftrags-Id (read-only).","type":["integer","null"]},"invoiceId":{"description":"Aufgelöste Rechnungs-Id (read-only).","type":["integer","null"]},"amountCents":{"minimum":0,"description":"Attribuierter Umsatz in Cent — Pflicht bei POST (außer kind=lead: 0/weggelassen erlaubt).","type":["integer","null"]},"kind":{"enum":["sale","lead","recurring"],"description":"sale (Default) | lead (Pay-per-Lead, Betrag optional) | recurring (Abo-Folgeprovision).","type":["string","null"]},"customerId":{"description":"Aufgelöster zugerechneter Kunde (read-only, Customer-Id).","type":["integer","null"]},"model":{"enum":["last_click","first_click","manual"],"description":"last_click | first_click | manual (Default last_click, AF2).","type":["string","null"]},"at":{"description":"Attributionszeitpunkt (read-only, ISO 8601).","type":["string","null"]},"accrualUlid":{"description":"Erzeugte Provisions-Abgrenzung (read-only; null, wenn keine Regel griff).","type":["string","null"]},"accrualAmountCents":{"type":["integer","null"]},"accrualStatus":{"type":["string","null"]}}},"AffiliateAttribution-affiliate_attribution.write":{"type":"object","description":"Umsatz-Attribution (04-24 §4/§8) — `POST /v1/affiliates/attributions`.\n- Ordnet Umsatz per Referral-Code zu (404 unbekannter Code, 422 abgelaufen — AF2), stößt Provisions-Abgrenzung an.\n- Antwort trägt Accrual-Info (null, wenn keine Regel greift/Partner inaktiv).\n- Order/Invoice: optionale Umsatzquellen (ULIDs → FK-lose Ids, ENT-ERP-OPTDEP-01).\n- ULID-Requirement verhindert Kollision mit `/v1/affiliates/{ulid}`.","properties":{"referralCode":{"maxLength":50,"description":"Referral-Code der Vermittlung — Pflicht bei POST.","type":["string","null"]},"orderUlid":{"description":"Umsatzquelle Auftrag (SalesOrder-ULID, optional).","type":["string","null"]},"invoiceUlid":{"description":"Umsatzquelle Rechnung (Invoice-ULID, optional).","type":["string","null"]},"amountCents":{"minimum":0,"description":"Attribuierter Umsatz in Cent — Pflicht bei POST (außer kind=lead: 0/weggelassen erlaubt).","type":["integer","null"]},"kind":{"enum":["sale","lead","recurring"],"description":"sale (Default) | lead (Pay-per-Lead, Betrag optional) | recurring (Abo-Folgeprovision).","type":["string","null"]},"customerUlid":{"description":"Zugerechneter Kunde (Customer-ULID, optional — bei Order/Invoice-Bezug automatisch daraus gezogen).","type":["string","null"]},"model":{"enum":["last_click","first_click","manual"],"description":"last_click | first_click | manual (Default last_click, AF2).","type":["string","null"]}}},"AffiliateAttribution.jsonld-affiliate_attribution.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"referralCode":{"maxLength":50,"description":"Referral-Code der Vermittlung — Pflicht bei POST.","type":["string","null"]},"orderId":{"description":"Aufgelöste Auftrags-Id (read-only).","type":["integer","null"]},"invoiceId":{"description":"Aufgelöste Rechnungs-Id (read-only).","type":["integer","null"]},"amountCents":{"minimum":0,"description":"Attribuierter Umsatz in Cent — Pflicht bei POST (außer kind=lead: 0/weggelassen erlaubt).","type":["integer","null"]},"kind":{"enum":["sale","lead","recurring"],"description":"sale (Default) | lead (Pay-per-Lead, Betrag optional) | recurring (Abo-Folgeprovision).","type":["string","null"]},"customerId":{"description":"Aufgelöster zugerechneter Kunde (read-only, Customer-Id).","type":["integer","null"]},"model":{"enum":["last_click","first_click","manual"],"description":"last_click | first_click | manual (Default last_click, AF2).","type":["string","null"]},"at":{"description":"Attributionszeitpunkt (read-only, ISO 8601).","type":["string","null"]},"accrualUlid":{"description":"Erzeugte Provisions-Abgrenzung (read-only; null, wenn keine Regel griff).","type":["string","null"]},"accrualAmountCents":{"type":["integer","null"]},"accrualStatus":{"type":["string","null"]}}}],"description":"Umsatz-Attribution (04-24 §4/§8) — `POST /v1/affiliates/attributions`.\n- Ordnet Umsatz per Referral-Code zu (404 unbekannter Code, 422 abgelaufen — AF2), stößt Provisions-Abgrenzung an.\n- Antwort trägt Accrual-Info (null, wenn keine Regel greift/Partner inaktiv).\n- Order/Invoice: optionale Umsatzquellen (ULIDs → FK-lose Ids, ENT-ERP-OPTDEP-01).\n- ULID-Requirement verhindert Kollision mit `/v1/affiliates/{ulid}`."},"AffiliateCommissionRule-affiliate_rule.read":{"type":"object","description":"Provisionsregeln eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/rules`.\n- POST: partnerId = Partner aus Pfad, Scope-Default `partner`.\n- percent: value = Prozent×100 (500 = 5 %) · fixed: Cent.\n- Global-Regeln (`partnerId = null`) bewusst keine Sub-Resource.","properties":{"ulid":{"type":["string","null"]},"affiliateUlid":{"description":"ULID der Affiliate-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"scope":{"enum":["partner","product","category"],"description":"partner | product | category (global-Regeln sind keine Partner-Sub-Resource).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Produkt-/Kategorie-Referenz bei scope product/category.","type":["integer","null"]},"rateType":{"enum":["percent","fixed"],"description":"percent | fixed — Pflicht bei POST.","type":["string","null"]},"value":{"minimum":0,"description":"percent: Prozent×100 (500 = 5 %) · fixed: Cent — Pflicht bei POST.","type":["integer","null"]},"trigger":{"enum":["sale","lead","recurring"],"description":"sale (Pay-per-Sale, Default) | lead (Pay-per-Lead, Festbetrag) | recurring (Abo-Folgeprovision).","type":["string","null"]},"appliesTo":{"enum":["all","first_order"],"description":"all (Default) | first_order (Neukunden-Provision: nur die erste sale-Attribution des Kunden).","type":["string","null"]},"capAmount":{"minimum":0,"description":"Deckelung des Provisionsbetrags je Abgrenzung in Cent (null = ungedeckelt).","type":["integer","null"]},"tier":{"maxLength":30,"type":["string","null"]},"recurring":{"description":"Wiederkehrende Provision je bezahlter Abo-Periode (AF5).","type":["boolean","null"]},"basis":{"enum":["net","gross"],"description":"net | gross.","type":["string","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d).","type":["string","null"]},"priority":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"AffiliateCommissionRule-affiliate_rule.write":{"type":"object","description":"Provisionsregeln eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/rules`.\n- POST: partnerId = Partner aus Pfad, Scope-Default `partner`.\n- percent: value = Prozent×100 (500 = 5 %) · fixed: Cent.\n- Global-Regeln (`partnerId = null`) bewusst keine Sub-Resource.","properties":{"scope":{"enum":["partner","product","category"],"description":"partner | product | category (global-Regeln sind keine Partner-Sub-Resource).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Produkt-/Kategorie-Referenz bei scope product/category.","type":["integer","null"]},"rateType":{"enum":["percent","fixed"],"description":"percent | fixed — Pflicht bei POST.","type":["string","null"]},"value":{"minimum":0,"description":"percent: Prozent×100 (500 = 5 %) · fixed: Cent — Pflicht bei POST.","type":["integer","null"]},"trigger":{"enum":["sale","lead","recurring"],"description":"sale (Pay-per-Sale, Default) | lead (Pay-per-Lead, Festbetrag) | recurring (Abo-Folgeprovision).","type":["string","null"]},"appliesTo":{"enum":["all","first_order"],"description":"all (Default) | first_order (Neukunden-Provision: nur die erste sale-Attribution des Kunden).","type":["string","null"]},"capAmount":{"minimum":0,"description":"Deckelung des Provisionsbetrags je Abgrenzung in Cent (null = ungedeckelt).","type":["integer","null"]},"tier":{"maxLength":30,"type":["string","null"]},"recurring":{"description":"Wiederkehrende Provision je bezahlter Abo-Periode (AF5).","type":["boolean","null"]},"basis":{"enum":["net","gross"],"description":"net | gross.","type":["string","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d).","type":["string","null"]},"priority":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"AffiliateCommissionRule-affiliate_rule.write.jsonMergePatch":{"type":"object","description":"Provisionsregeln eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/rules`.\n- POST: partnerId = Partner aus Pfad, Scope-Default `partner`.\n- percent: value = Prozent×100 (500 = 5 %) · fixed: Cent.\n- Global-Regeln (`partnerId = null`) bewusst keine Sub-Resource.","properties":{"scope":{"enum":["partner","product","category"],"description":"partner | product | category (global-Regeln sind keine Partner-Sub-Resource).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Produkt-/Kategorie-Referenz bei scope product/category.","type":["integer","null"]},"rateType":{"enum":["percent","fixed"],"description":"percent | fixed — Pflicht bei POST.","type":["string","null"]},"value":{"minimum":0,"description":"percent: Prozent×100 (500 = 5 %) · fixed: Cent — Pflicht bei POST.","type":["integer","null"]},"trigger":{"enum":["sale","lead","recurring"],"description":"sale (Pay-per-Sale, Default) | lead (Pay-per-Lead, Festbetrag) | recurring (Abo-Folgeprovision).","type":["string","null"]},"appliesTo":{"enum":["all","first_order"],"description":"all (Default) | first_order (Neukunden-Provision: nur die erste sale-Attribution des Kunden).","type":["string","null"]},"capAmount":{"minimum":0,"description":"Deckelung des Provisionsbetrags je Abgrenzung in Cent (null = ungedeckelt).","type":["integer","null"]},"tier":{"maxLength":30,"type":["string","null"]},"recurring":{"description":"Wiederkehrende Provision je bezahlter Abo-Periode (AF5).","type":["boolean","null"]},"basis":{"enum":["net","gross"],"description":"net | gross.","type":["string","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d).","type":["string","null"]},"priority":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"AffiliateCommissionRule.jsonld-affiliate_rule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"affiliateUlid":{"description":"ULID der Affiliate-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"scope":{"enum":["partner","product","category"],"description":"partner | product | category (global-Regeln sind keine Partner-Sub-Resource).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Produkt-/Kategorie-Referenz bei scope product/category.","type":["integer","null"]},"rateType":{"enum":["percent","fixed"],"description":"percent | fixed — Pflicht bei POST.","type":["string","null"]},"value":{"minimum":0,"description":"percent: Prozent×100 (500 = 5 %) · fixed: Cent — Pflicht bei POST.","type":["integer","null"]},"trigger":{"enum":["sale","lead","recurring"],"description":"sale (Pay-per-Sale, Default) | lead (Pay-per-Lead, Festbetrag) | recurring (Abo-Folgeprovision).","type":["string","null"]},"appliesTo":{"enum":["all","first_order"],"description":"all (Default) | first_order (Neukunden-Provision: nur die erste sale-Attribution des Kunden).","type":["string","null"]},"capAmount":{"minimum":0,"description":"Deckelung des Provisionsbetrags je Abgrenzung in Cent (null = ungedeckelt).","type":["integer","null"]},"tier":{"maxLength":30,"type":["string","null"]},"recurring":{"description":"Wiederkehrende Provision je bezahlter Abo-Periode (AF5).","type":["boolean","null"]},"basis":{"enum":["net","gross"],"description":"net | gross.","type":["string","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d).","type":["string","null"]},"priority":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}}],"description":"Provisionsregeln eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/rules`.\n- POST: partnerId = Partner aus Pfad, Scope-Default `partner`.\n- percent: value = Prozent×100 (500 = 5 %) · fixed: Cent.\n- Global-Regeln (`partnerId = null`) bewusst keine Sub-Resource."},"AffiliateCommissionSummary-affiliate_summary.read":{"type":"object","description":"Provisions-Auswertung eines Partners (04-24 Ausbau) — read-only\n`GET /v1/affiliates/{ulid}/commission-summary`.\n- Summen je Status (offen/verdient/ausgezahlt, Cent) + Anzahl Stornierungen.\n- Aggregiert über die Accruals des Partners; unbekannte/gelöschte Rolle → 404.","properties":{"ulid":{"description":"ULID der Affiliate-Rolle (aus dem Pfad).","type":["string","null"]},"pendingAmount":{"description":"Summe offener Abgrenzungen (pending) in Cent.","default":0,"type":"integer"},"approvedAmount":{"description":"Summe verdienter, noch nicht ausgezahlter Abgrenzungen (approved) in Cent.","default":0,"type":"integer"},"settledAmount":{"description":"Summe ausgezahlter Abgrenzungen (settled) in Cent.","default":0,"type":"integer"},"reversedCount":{"description":"Anzahl stornierter Abgrenzungen (reversed).","default":0,"type":"integer"}}},"AffiliateCommissionSummary.jsonld-affiliate_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID der Affiliate-Rolle (aus dem Pfad).","type":["string","null"]},"pendingAmount":{"description":"Summe offener Abgrenzungen (pending) in Cent.","default":0,"type":"integer"},"approvedAmount":{"description":"Summe verdienter, noch nicht ausgezahlter Abgrenzungen (approved) in Cent.","default":0,"type":"integer"},"settledAmount":{"description":"Summe ausgezahlter Abgrenzungen (settled) in Cent.","default":0,"type":"integer"},"reversedCount":{"description":"Anzahl stornierter Abgrenzungen (reversed).","default":0,"type":"integer"}}}],"description":"Provisions-Auswertung eines Partners (04-24 Ausbau) — read-only\n`GET /v1/affiliates/{ulid}/commission-summary`.\n- Summen je Status (offen/verdient/ausgezahlt, Cent) + Anzahl Stornierungen.\n- Aggregiert über die Accruals des Partners; unbekannte/gelöschte Rolle → 404."},"AffiliatePartnerAssignment-affiliate_assignment.read":{"type":"object","description":"Partner-/Vertriebs-Zuordnungen (04-24 Ausbau) — flache Collection `/v1/affiliates/assignments`.\n- ULID-Requirement der {ulid}-Routen von AffiliateResource verhindert Kollision (Muster sales-orders/statuses).\n- POST ordnet Kunde+Partner als sales_rep/account_owner/reseller zu (409 bei Duplikat partner+customer+role).\n- `sharePercent`: direkter Vertriebs-Provisionssatz, ohne Regel-Engine.\n- DELETE hart (reine Zuordnungszeile).\n- Automatische Attribution: {@see \\Octi\\Plugin\\Affiliate\\EventListener\\AttributeOnInvoiceIssued}.","properties":{"ulid":{"type":["string","null"]},"affiliateUlid":{"description":"ULID der Affiliate-Rolle — Pflicht bei POST, danach unveränderlich.","type":["string","null"]},"partnerId":{"description":"Aufgelöste Affiliate-Rolle (read-only, aff_role.id).","type":["integer","null"]},"partnerName":{"description":"Anzeigename des Partners (read-only, Anreicherung aus dem Kunden-Stamm des Partners).","type":["string","null"]},"customerId":{"description":"Aufgelöster Kunde (read-only, Customer-Id).","type":["integer","null"]},"customerName":{"description":"Anzeigename des Kunden (read-only, Anreicherung aus dem Kunden-Stamm).","type":["string","null"]},"role":{"enum":["sales_rep","account_owner","reseller"],"description":"sales_rep (Default) | account_owner | reseller.","type":["string","null"]},"sharePercent":{"pattern":"^(\\d{1,3}(\\.\\d{1,2})?)$","description":"Direkter Vertriebs-Provisionssatz in % (Dezimal-String, z. B. '5.00'); null = Regel-Auflösung.","type":["string","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d).","type":["string","null"]},"active":{"type":["boolean","null"]}}},"AffiliatePartnerAssignment-affiliate_assignment.write":{"type":"object","description":"Partner-/Vertriebs-Zuordnungen (04-24 Ausbau) — flache Collection `/v1/affiliates/assignments`.\n- ULID-Requirement der {ulid}-Routen von AffiliateResource verhindert Kollision (Muster sales-orders/statuses).\n- POST ordnet Kunde+Partner als sales_rep/account_owner/reseller zu (409 bei Duplikat partner+customer+role).\n- `sharePercent`: direkter Vertriebs-Provisionssatz, ohne Regel-Engine.\n- DELETE hart (reine Zuordnungszeile).\n- Automatische Attribution: {@see \\Octi\\Plugin\\Affiliate\\EventListener\\AttributeOnInvoiceIssued}.","properties":{"affiliateUlid":{"description":"ULID der Affiliate-Rolle — Pflicht bei POST, danach unveränderlich.","type":["string","null"]},"customerUlid":{"description":"Kunden-ULID der Zuordnung — Pflicht bei POST, danach unveränderlich.","type":["string","null"]},"role":{"enum":["sales_rep","account_owner","reseller"],"description":"sales_rep (Default) | account_owner | reseller.","type":["string","null"]},"sharePercent":{"pattern":"^(\\d{1,3}(\\.\\d{1,2})?)$","description":"Direkter Vertriebs-Provisionssatz in % (Dezimal-String, z. B. '5.00'); null = Regel-Auflösung.","type":["string","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d).","type":["string","null"]},"active":{"type":["boolean","null"]}}},"AffiliatePartnerAssignment-affiliate_assignment.write.jsonMergePatch":{"type":"object","description":"Partner-/Vertriebs-Zuordnungen (04-24 Ausbau) — flache Collection `/v1/affiliates/assignments`.\n- ULID-Requirement der {ulid}-Routen von AffiliateResource verhindert Kollision (Muster sales-orders/statuses).\n- POST ordnet Kunde+Partner als sales_rep/account_owner/reseller zu (409 bei Duplikat partner+customer+role).\n- `sharePercent`: direkter Vertriebs-Provisionssatz, ohne Regel-Engine.\n- DELETE hart (reine Zuordnungszeile).\n- Automatische Attribution: {@see \\Octi\\Plugin\\Affiliate\\EventListener\\AttributeOnInvoiceIssued}.","properties":{"affiliateUlid":{"description":"ULID der Affiliate-Rolle — Pflicht bei POST, danach unveränderlich.","type":["string","null"]},"customerUlid":{"description":"Kunden-ULID der Zuordnung — Pflicht bei POST, danach unveränderlich.","type":["string","null"]},"role":{"enum":["sales_rep","account_owner","reseller"],"description":"sales_rep (Default) | account_owner | reseller.","type":["string","null"]},"sharePercent":{"pattern":"^(\\d{1,3}(\\.\\d{1,2})?)$","description":"Direkter Vertriebs-Provisionssatz in % (Dezimal-String, z. B. '5.00'); null = Regel-Auflösung.","type":["string","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d).","type":["string","null"]},"active":{"type":["boolean","null"]}}},"AffiliatePartnerAssignment.jsonld-affiliate_assignment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"affiliateUlid":{"description":"ULID der Affiliate-Rolle — Pflicht bei POST, danach unveränderlich.","type":["string","null"]},"partnerId":{"description":"Aufgelöste Affiliate-Rolle (read-only, aff_role.id).","type":["integer","null"]},"partnerName":{"description":"Anzeigename des Partners (read-only, Anreicherung aus dem Kunden-Stamm des Partners).","type":["string","null"]},"customerId":{"description":"Aufgelöster Kunde (read-only, Customer-Id).","type":["integer","null"]},"customerName":{"description":"Anzeigename des Kunden (read-only, Anreicherung aus dem Kunden-Stamm).","type":["string","null"]},"role":{"enum":["sales_rep","account_owner","reseller"],"description":"sales_rep (Default) | account_owner | reseller.","type":["string","null"]},"sharePercent":{"pattern":"^(\\d{1,3}(\\.\\d{1,2})?)$","description":"Direkter Vertriebs-Provisionssatz in % (Dezimal-String, z. B. '5.00'); null = Regel-Auflösung.","type":["string","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d).","type":["string","null"]},"active":{"type":["boolean","null"]}}}],"description":"Partner-/Vertriebs-Zuordnungen (04-24 Ausbau) — flache Collection `/v1/affiliates/assignments`.\n- ULID-Requirement der {ulid}-Routen von AffiliateResource verhindert Kollision (Muster sales-orders/statuses).\n- POST ordnet Kunde+Partner als sales_rep/account_owner/reseller zu (409 bei Duplikat partner+customer+role).\n- `sharePercent`: direkter Vertriebs-Provisionssatz, ohne Regel-Engine.\n- DELETE hart (reine Zuordnungszeile).\n- Automatische Attribution: {@see \\Octi\\Plugin\\Affiliate\\EventListener\\AttributeOnInvoiceIssued}."},"AffiliateReferral-affiliate_referral.read":{"type":"object","description":"Referral-Codes/-Links eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/referrals`.\n- POST: system-eindeutiger Code (409 bei Doppelvergabe).\n- `expiresAt` = Attributionsfenster (AF2).","properties":{"ulid":{"type":["string","null"]},"affiliateUlid":{"description":"ULID der Affiliate-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"code":{"maxLength":50,"description":"System-eindeutiger Referral-Code — Pflicht bei POST.","type":["string","null"]},"type":{"enum":["link","code","manual"],"description":"link | code | manual.","type":["string","null"]},"expiresAt":{"description":"Attributionsfenster-Ende (ISO 8601, AF2).","type":["string","null"]},"landedAt":{"description":"Erster Landing-Kontakt (read-only, Tracking).","type":["string","null"]},"attributedCustomerId":{"description":"Geworbener Kunde (read-only, Customer-Id).","type":["integer","null"]},"attributedCustomerName":{"description":"Name des geworbenen Kunden (read-only, gebatcht aus dem Kunden-Stamm aufgelöst).","type":["string","null"]}}},"AffiliateReferral-affiliate_referral.write":{"type":"object","description":"Referral-Codes/-Links eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/referrals`.\n- POST: system-eindeutiger Code (409 bei Doppelvergabe).\n- `expiresAt` = Attributionsfenster (AF2).","properties":{"code":{"maxLength":50,"description":"System-eindeutiger Referral-Code — Pflicht bei POST.","type":["string","null"]},"type":{"enum":["link","code","manual"],"description":"link | code | manual.","type":["string","null"]},"expiresAt":{"description":"Attributionsfenster-Ende (ISO 8601, AF2).","type":["string","null"]}}},"AffiliateReferral.jsonld-affiliate_referral.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"affiliateUlid":{"description":"ULID der Affiliate-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"code":{"maxLength":50,"description":"System-eindeutiger Referral-Code — Pflicht bei POST.","type":["string","null"]},"type":{"enum":["link","code","manual"],"description":"link | code | manual.","type":["string","null"]},"expiresAt":{"description":"Attributionsfenster-Ende (ISO 8601, AF2).","type":["string","null"]},"landedAt":{"description":"Erster Landing-Kontakt (read-only, Tracking).","type":["string","null"]},"attributedCustomerId":{"description":"Geworbener Kunde (read-only, Customer-Id).","type":["integer","null"]},"attributedCustomerName":{"description":"Name des geworbenen Kunden (read-only, gebatcht aus dem Kunden-Stamm aufgelöst).","type":["string","null"]}}}],"description":"Referral-Codes/-Links eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/referrals`.\n- POST: system-eindeutiger Code (409 bei Doppelvergabe).\n- `expiresAt` = Attributionsfenster (AF2)."},"AffiliateSettlementRun-affiliate_settlement.read":{"type":"object","description":"Abrechnungsläufe (04-24 §4/§8) — Segment `affiliate-settlements`.\n- POST erzeugt Lauf (draft) über approved-Accruals der Periode (Partner unter Mindestauszahlung vorgetragen, AF6).\n- `approve` (Freigabe, User-ULID) und `mark-paid` (Accruals → `settled`): diskrete POST-Ops, Status-Guards 422.\n- Detail-Antworten tragen die Auszahlungspositionen je Partner.","properties":{"ulid":{"type":["string","null"]},"periodFrom":{"description":"Periodenbeginn (Y-m-d) — Pflicht bei POST.","type":["string","null"]},"periodTo":{"description":"Periodenende (Y-m-d) — Pflicht bei POST.","type":["string","null"]},"status":{"description":"draft | approved | paid.","type":["string","null"]},"totalAmount":{"description":"Gesamtsumme aller Auszahlungspositionen in Cent.","type":["integer","null"]},"approvedBy":{"description":"User-ULID der Freigabe.","type":["string","null"]},"items":{"description":"Auszahlungspositionen je Partner (Detail-/Schreibpfade) — partnerName gebatcht aus Kunden-Stamm aufgelöst.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}},{"type":"string"},{"type":"null"}]}}}}},"AffiliateSettlementRun-affiliate_settlement.write":{"type":"object","description":"Abrechnungsläufe (04-24 §4/§8) — Segment `affiliate-settlements`.\n- POST erzeugt Lauf (draft) über approved-Accruals der Periode (Partner unter Mindestauszahlung vorgetragen, AF6).\n- `approve` (Freigabe, User-ULID) und `mark-paid` (Accruals → `settled`): diskrete POST-Ops, Status-Guards 422.\n- Detail-Antworten tragen die Auszahlungspositionen je Partner.","properties":{"periodFrom":{"description":"Periodenbeginn (Y-m-d) — Pflicht bei POST.","type":["string","null"]},"periodTo":{"description":"Periodenende (Y-m-d) — Pflicht bei POST.","type":["string","null"]}}},"AffiliateSettlementRun.jsonld-affiliate_settlement.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"periodFrom":{"description":"Periodenbeginn (Y-m-d) — Pflicht bei POST.","type":["string","null"]},"periodTo":{"description":"Periodenende (Y-m-d) — Pflicht bei POST.","type":["string","null"]},"status":{"description":"draft | approved | paid.","type":["string","null"]},"totalAmount":{"description":"Gesamtsumme aller Auszahlungspositionen in Cent.","type":["integer","null"]},"approvedBy":{"description":"User-ULID der Freigabe.","type":["string","null"]},"items":{"description":"Auszahlungspositionen je Partner (Detail-/Schreibpfade) — partnerName gebatcht aus Kunden-Stamm aufgelöst.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}},{"type":"string"},{"type":"null"}]}}}}}],"description":"Abrechnungsläufe (04-24 §4/§8) — Segment `affiliate-settlements`.\n- POST erzeugt Lauf (draft) über approved-Accruals der Periode (Partner unter Mindestauszahlung vorgetragen, AF6).\n- `approve` (Freigabe, User-ULID) und `mark-paid` (Accruals → `settled`): diskrete POST-Ops, Status-Guards 422.\n- Detail-Antworten tragen die Auszahlungspositionen je Partner."},"AiModelRoute-ai_route.read":{"type":"object","description":"Modell-Routing je KI-Aufgabe (AP-19); Use-Cases aus {@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}.\n- POST: Upsert über `useCase`.\n- PATCH: merged (nicht gesetzte Felder bleiben); `provider: null` = Reset auf Standard (wie DELETE).\n- PATCH ohne Provider auf unkonfigurierten Use-Case: bewusst No-Op (nichts zu routen).\n- DELETE: Reset auf Standard.","required":["useCase"],"properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"module":{"type":["string","null"]},"label":{"type":["string","null"]},"provider":{"description":"Gewählter Provider; null = Standard-Provider verwenden.","type":["string","null"]},"model":{"description":"Gewähltes Modell; null = Standardmodell des Providers.","type":["string","null"]},"enabled":{"default":true,"type":"boolean"},"configured":{"description":"Ob eine eigene Route existiert (sonst greift der Standard).","default":false,"type":"boolean"},"effectiveProvider":{"description":"Tatsächlich genutzter Provider nach Anwendung des Standards.","type":["string","null"]},"effectiveModel":{"description":"Tatsächlich genutztes Modell nach Anwendung des Standards.","type":["string","null"]},"modality":{"description":"Modalität des Anwendungsfalls: text oder image (steuert die Modell-Auswahl).","default":"text","type":"string"}}},"AiModelRoute-ai_route.write":{"type":"object","description":"Modell-Routing je KI-Aufgabe (AP-19); Use-Cases aus {@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}.\n- POST: Upsert über `useCase`.\n- PATCH: merged (nicht gesetzte Felder bleiben); `provider: null` = Reset auf Standard (wie DELETE).\n- PATCH ohne Provider auf unkonfigurierten Use-Case: bewusst No-Op (nichts zu routen).\n- DELETE: Reset auf Standard.","required":["useCase"],"properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"provider":{"description":"Gewählter Provider; null = Standard-Provider verwenden.","type":["string","null"]},"model":{"description":"Gewähltes Modell; null = Standardmodell des Providers.","type":["string","null"]},"enabled":{"default":true,"type":"boolean"}}},"AiModelRoute-ai_route.write.jsonMergePatch":{"type":"object","description":"Modell-Routing je KI-Aufgabe (AP-19); Use-Cases aus {@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}.\n- POST: Upsert über `useCase`.\n- PATCH: merged (nicht gesetzte Felder bleiben); `provider: null` = Reset auf Standard (wie DELETE).\n- PATCH ohne Provider auf unkonfigurierten Use-Case: bewusst No-Op (nichts zu routen).\n- DELETE: Reset auf Standard.","properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"provider":{"description":"Gewählter Provider; null = Standard-Provider verwenden.","type":["string","null"]},"model":{"description":"Gewähltes Modell; null = Standardmodell des Providers.","type":["string","null"]},"enabled":{"default":true,"type":"boolean"}}},"AiModelRoute.jsonld-ai_route.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["useCase"],"properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"module":{"type":["string","null"]},"label":{"type":["string","null"]},"provider":{"description":"Gewählter Provider; null = Standard-Provider verwenden.","type":["string","null"]},"model":{"description":"Gewähltes Modell; null = Standardmodell des Providers.","type":["string","null"]},"enabled":{"default":true,"type":"boolean"},"configured":{"description":"Ob eine eigene Route existiert (sonst greift der Standard).","default":false,"type":"boolean"},"effectiveProvider":{"description":"Tatsächlich genutzter Provider nach Anwendung des Standards.","type":["string","null"]},"effectiveModel":{"description":"Tatsächlich genutztes Modell nach Anwendung des Standards.","type":["string","null"]},"modality":{"description":"Modalität des Anwendungsfalls: text oder image (steuert die Modell-Auswahl).","default":"text","type":"string"}}}],"description":"Modell-Routing je KI-Aufgabe (AP-19); Use-Cases aus {@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}.\n- POST: Upsert über `useCase`.\n- PATCH: merged (nicht gesetzte Felder bleiben); `provider: null` = Reset auf Standard (wie DELETE).\n- PATCH ohne Provider auf unkonfigurierten Use-Case: bewusst No-Op (nichts zu routen).\n- DELETE: Reset auf Standard."},"AiProvider-ai_provider.read":{"type":"object","description":"KI-Provider-Zugang (AP-19): API-Key-Status/Aktivierung/Standard-Provider/Standardmodell je Provider.\nKey verschlüsselt als Integrations-Credential gespeichert, nie zurückgegeben (write-only).\n\n`availableModels` ist der bei der Anbieter-API abgefragte Stand ({@see \\App\\Platform\\LlmGateway\\Service\\ModelCatalog}),\nnicht eine im Code gepflegte Liste — `modelsSource`/`modelsFetchedAt`/`modelsError` machen Herkunft\nund Alter des Standes sichtbar, damit „keine Modelle\" erklärbar bleibt.","properties":{"provider":{"default":"","type":"string"},"brandId":{"description":"Marke, fuer die dieser Datensatz gilt; `null` = markenuebergreifend (R43-58).","type":["integer","null"]},"brandSpecific":{"description":"Fuehrt diese Marke einen EIGENEN Zugang, oder erbt sie den markenlosen?","default":false,"type":"boolean"},"label":{"default":"","type":"string"},"kind":{"description":"Bauart des Anbieters ({@see \\App\\Platform\\LlmGateway\\AiProviderCatalog} KIND_*); null bei Plugin-Providern.","type":["string","null"]},"configured":{"description":"Key vorhanden (DB oder Umgebung).","default":false,"type":"boolean"},"keySource":{"description":"Herkunft des Keys: 'db' | 'env' | 'none'.","default":"none","type":"string"},"keyEnv":{"description":"Name der Umgebungsvariable, aus der ersatzweise gelesen wird (Betriebs-Hinweis in der UI).","type":["string","null"]},"hasStoredKey":{"description":"Ob ein Key in der DB (über die Oberfläche) hinterlegt wurde.","default":false,"type":"boolean"},"active":{"default":false,"type":"boolean"},"isDefault":{"default":false,"type":"boolean"},"defaultModel":{"description":"Standardmodell DIESES Anbieters (je Anbieter gepflegt, nicht nur für den Standard-Anbieter).","type":["string","null"]},"baseUrl":{"description":"Optionale Basis-URL für self-hosted/kompatible Endpunkte.","type":["string","null"]},"requiresBaseUrl":{"description":"Basis-URL ist bei diesem Anbieter mandanteneigen und damit Pflicht (Azure OpenAI).","default":false,"type":"boolean"},"docsUrl":{"description":"Wo der Betreiber seinen Zugangsschlüssel erzeugt (Direktlink in der Oberfläche).","type":["string","null"]},"availableModels":{"type":"array","items":{"type":"string"}},"modelsSource":{"description":"Herkunft der Modell-Liste: 'live' (bei der Anbieter-API abgefragt) | 'fallback' (Notnagel im Code).","default":"fallback","type":"string"},"availableImageModels":{"description":"BILD-Modelle dieses Anbieters (Programm 46 C1) — leer bei Anbietern ohne Bild-Erzeugung.","type":"array","items":{"type":"string"}},"modelsFetchedAt":{"description":"Zeitpunkt der letzten Abfrage; null = noch nie abgefragt.","type":["string","null"],"format":"date-time"},"modelsError":{"description":"Grund, warum die letzte Abfrage nichts lieferte (z.B. „Kein Zugangsschlüssel hinterlegt\").","type":["string","null"]}}},"AiProvider-ai_provider.write":{"type":"object","description":"KI-Provider-Zugang (AP-19): API-Key-Status/Aktivierung/Standard-Provider/Standardmodell je Provider.\nKey verschlüsselt als Integrations-Credential gespeichert, nie zurückgegeben (write-only).\n\n`availableModels` ist der bei der Anbieter-API abgefragte Stand ({@see \\App\\Platform\\LlmGateway\\Service\\ModelCatalog}),\nnicht eine im Code gepflegte Liste — `modelsSource`/`modelsFetchedAt`/`modelsError` machen Herkunft\nund Alter des Standes sichtbar, damit „keine Modelle\" erklärbar bleibt.","properties":{"brandId":{"description":"Marke, fuer die dieser Datensatz gilt; `null` = markenuebergreifend (R43-58).","type":["integer","null"]},"active":{"default":false,"type":"boolean"},"isDefault":{"default":false,"type":"boolean"},"defaultModel":{"description":"Standardmodell DIESES Anbieters (je Anbieter gepflegt, nicht nur für den Standard-Anbieter).","type":["string","null"]},"baseUrl":{"description":"Optionale Basis-URL für self-hosted/kompatible Endpunkte.","type":["string","null"]},"apiKey":{"description":"Write-only: neuer/zu ersetzender API-Key. Wird nie ausgelesen.","type":["string","null"]}}},"AiProvider-ai_provider.write.jsonMergePatch":{"type":"object","description":"KI-Provider-Zugang (AP-19): API-Key-Status/Aktivierung/Standard-Provider/Standardmodell je Provider.\nKey verschlüsselt als Integrations-Credential gespeichert, nie zurückgegeben (write-only).\n\n`availableModels` ist der bei der Anbieter-API abgefragte Stand ({@see \\App\\Platform\\LlmGateway\\Service\\ModelCatalog}),\nnicht eine im Code gepflegte Liste — `modelsSource`/`modelsFetchedAt`/`modelsError` machen Herkunft\nund Alter des Standes sichtbar, damit „keine Modelle\" erklärbar bleibt.","properties":{"brandId":{"description":"Marke, fuer die dieser Datensatz gilt; `null` = markenuebergreifend (R43-58).","type":["integer","null"]},"active":{"default":false,"type":"boolean"},"isDefault":{"default":false,"type":"boolean"},"defaultModel":{"description":"Standardmodell DIESES Anbieters (je Anbieter gepflegt, nicht nur für den Standard-Anbieter).","type":["string","null"]},"baseUrl":{"description":"Optionale Basis-URL für self-hosted/kompatible Endpunkte.","type":["string","null"]},"apiKey":{"description":"Write-only: neuer/zu ersetzender API-Key. Wird nie ausgelesen.","type":["string","null"]}}},"AiProvider.jsonld-ai_provider.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"provider":{"default":"","type":"string"},"brandId":{"description":"Marke, fuer die dieser Datensatz gilt; `null` = markenuebergreifend (R43-58).","type":["integer","null"]},"brandSpecific":{"description":"Fuehrt diese Marke einen EIGENEN Zugang, oder erbt sie den markenlosen?","default":false,"type":"boolean"},"label":{"default":"","type":"string"},"kind":{"description":"Bauart des Anbieters ({@see \\App\\Platform\\LlmGateway\\AiProviderCatalog} KIND_*); null bei Plugin-Providern.","type":["string","null"]},"configured":{"description":"Key vorhanden (DB oder Umgebung).","default":false,"type":"boolean"},"keySource":{"description":"Herkunft des Keys: 'db' | 'env' | 'none'.","default":"none","type":"string"},"keyEnv":{"description":"Name der Umgebungsvariable, aus der ersatzweise gelesen wird (Betriebs-Hinweis in der UI).","type":["string","null"]},"hasStoredKey":{"description":"Ob ein Key in der DB (über die Oberfläche) hinterlegt wurde.","default":false,"type":"boolean"},"active":{"default":false,"type":"boolean"},"isDefault":{"default":false,"type":"boolean"},"defaultModel":{"description":"Standardmodell DIESES Anbieters (je Anbieter gepflegt, nicht nur für den Standard-Anbieter).","type":["string","null"]},"baseUrl":{"description":"Optionale Basis-URL für self-hosted/kompatible Endpunkte.","type":["string","null"]},"requiresBaseUrl":{"description":"Basis-URL ist bei diesem Anbieter mandanteneigen und damit Pflicht (Azure OpenAI).","default":false,"type":"boolean"},"docsUrl":{"description":"Wo der Betreiber seinen Zugangsschlüssel erzeugt (Direktlink in der Oberfläche).","type":["string","null"]},"availableModels":{"type":"array","items":{"type":"string"}},"modelsSource":{"description":"Herkunft der Modell-Liste: 'live' (bei der Anbieter-API abgefragt) | 'fallback' (Notnagel im Code).","default":"fallback","type":"string"},"availableImageModels":{"description":"BILD-Modelle dieses Anbieters (Programm 46 C1) — leer bei Anbietern ohne Bild-Erzeugung.","type":"array","items":{"type":"string"}},"modelsFetchedAt":{"description":"Zeitpunkt der letzten Abfrage; null = noch nie abgefragt.","type":["string","null"],"format":"date-time"},"modelsError":{"description":"Grund, warum die letzte Abfrage nichts lieferte (z.B. „Kein Zugangsschlüssel hinterlegt\").","type":["string","null"]}}}],"description":"KI-Provider-Zugang (AP-19): API-Key-Status/Aktivierung/Standard-Provider/Standardmodell je Provider.\nKey verschlüsselt als Integrations-Credential gespeichert, nie zurückgegeben (write-only).\n\n`availableModels` ist der bei der Anbieter-API abgefragte Stand ({@see \\App\\Platform\\LlmGateway\\Service\\ModelCatalog}),\nnicht eine im Code gepflegte Liste — `modelsSource`/`modelsFetchedAt`/`modelsError` machen Herkunft\nund Alter des Standes sichtbar, damit „keine Modelle\" erklärbar bleibt."},"AiProviderEndpoint-ai_endpoint.read":{"type":"object","description":"BYOM/lokaler LLM-Endpoint (Doc 30 Stufe 6, ENT-AIW-05). Governance-verwaltet\n(`platform.assistant.manage`); `baseUrl` wird SSRF-geprüft, `credential` wird verschlüsselt gespeichert\nund NIE zurückgegeben (nur `hasCredential`).","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":100,"default":"","type":"string"},"type":{"enum":["openai_compatible","ollama","openrouter"],"default":"openai_compatible","type":"string"},"baseUrl":{"format":"uri","maxLength":255,"externalDocs":{"url":"https://schema.org/url"},"default":"","type":"string"},"brandId":{"type":["integer","null"]},"allowedUseCases":{"type":["array","null"],"items":{"type":"string"}},"models":{"type":"array","items":{"type":"string"}},"enabled":{"default":false,"type":"boolean"},"allowPrivateHost":{"description":"Ausdrückliche Freigabe eines Ziels im EIGENEN Netz (Loopback/RFC1918/ULA) — nötig, um ein\nlokales Modell anzubinden, und nur für genau diesen Endpoint gültig. Cloud-Metadaten,\nMulticast und reservierte Bereiche bleiben auch damit gesperrt, ebenso alle Deny-Regeln\naus Plugins.","default":false,"type":"boolean"},"hasCredential":{"default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name","baseUrl"]},"AiProviderEndpoint-ai_endpoint.write":{"type":"object","description":"BYOM/lokaler LLM-Endpoint (Doc 30 Stufe 6, ENT-AIW-05). Governance-verwaltet\n(`platform.assistant.manage`); `baseUrl` wird SSRF-geprüft, `credential` wird verschlüsselt gespeichert\nund NIE zurückgegeben (nur `hasCredential`).","required":["name","baseUrl"],"properties":{"name":{"maxLength":100,"default":"","type":"string"},"type":{"enum":["openai_compatible","ollama","openrouter"],"default":"openai_compatible","type":"string"},"baseUrl":{"format":"uri","maxLength":255,"externalDocs":{"url":"https://schema.org/url"},"default":"","type":"string"},"credential":{"description":"Nur schreibbar (Klartext-Eingabe → verschlüsselt gespeichert); wird nie zurückgegeben.","type":["string","null"]},"brandId":{"type":["integer","null"]},"allowedUseCases":{"type":["array","null"],"items":{"type":"string"}},"models":{"type":"array","items":{"type":"string"}},"enabled":{"default":false,"type":"boolean"},"allowPrivateHost":{"description":"Ausdrückliche Freigabe eines Ziels im EIGENEN Netz (Loopback/RFC1918/ULA) — nötig, um ein\nlokales Modell anzubinden, und nur für genau diesen Endpoint gültig. Cloud-Metadaten,\nMulticast und reservierte Bereiche bleiben auch damit gesperrt, ebenso alle Deny-Regeln\naus Plugins.","default":false,"type":"boolean"}}},"AiProviderEndpoint-ai_endpoint.write.jsonMergePatch":{"type":"object","description":"BYOM/lokaler LLM-Endpoint (Doc 30 Stufe 6, ENT-AIW-05). Governance-verwaltet\n(`platform.assistant.manage`); `baseUrl` wird SSRF-geprüft, `credential` wird verschlüsselt gespeichert\nund NIE zurückgegeben (nur `hasCredential`).","properties":{"name":{"maxLength":100,"default":"","type":"string"},"type":{"enum":["openai_compatible","ollama","openrouter"],"default":"openai_compatible","type":"string"},"baseUrl":{"format":"uri","maxLength":255,"externalDocs":{"url":"https://schema.org/url"},"default":"","type":"string"},"credential":{"description":"Nur schreibbar (Klartext-Eingabe → verschlüsselt gespeichert); wird nie zurückgegeben.","type":["string","null"]},"brandId":{"type":["integer","null"]},"allowedUseCases":{"type":["array","null"],"items":{"type":"string"}},"models":{"type":"array","items":{"type":"string"}},"enabled":{"default":false,"type":"boolean"},"allowPrivateHost":{"description":"Ausdrückliche Freigabe eines Ziels im EIGENEN Netz (Loopback/RFC1918/ULA) — nötig, um ein\nlokales Modell anzubinden, und nur für genau diesen Endpoint gültig. Cloud-Metadaten,\nMulticast und reservierte Bereiche bleiben auch damit gesperrt, ebenso alle Deny-Regeln\naus Plugins.","default":false,"type":"boolean"}}},"AiProviderEndpoint.jsonld-ai_endpoint.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":100,"default":"","type":"string"},"type":{"enum":["openai_compatible","ollama","openrouter"],"default":"openai_compatible","type":"string"},"baseUrl":{"format":"uri","maxLength":255,"externalDocs":{"url":"https://schema.org/url"},"default":"","type":"string"},"brandId":{"type":["integer","null"]},"allowedUseCases":{"type":["array","null"],"items":{"type":"string"}},"models":{"type":"array","items":{"type":"string"}},"enabled":{"default":false,"type":"boolean"},"allowPrivateHost":{"description":"Ausdrückliche Freigabe eines Ziels im EIGENEN Netz (Loopback/RFC1918/ULA) — nötig, um ein\nlokales Modell anzubinden, und nur für genau diesen Endpoint gültig. Cloud-Metadaten,\nMulticast und reservierte Bereiche bleiben auch damit gesperrt, ebenso alle Deny-Regeln\naus Plugins.","default":false,"type":"boolean"},"hasCredential":{"default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name","baseUrl"]}],"description":"BYOM/lokaler LLM-Endpoint (Doc 30 Stufe 6, ENT-AIW-05). Governance-verwaltet\n(`platform.assistant.manage`); `baseUrl` wird SSRF-geprüft, `credential` wird verschlüsselt gespeichert\nund NIE zurückgegeben (nur `hasCredential`)."},"Allocation-allocation.read":{"type":"object","description":"Allocation-Resource (04-09 §4.2). CRUD Person→Projekt-Zuordnung + Vorbelegung aus Projekt-Mitgliedern.\nbrandId serverseitig vom Projekt abgeleitet, read-only.","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"periodStart":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"plannedHours":{"minimum":0,"description":"Soll-Stunden über den Zeitraum.","type":["number","null"]},"distribution":{"enum":["even","weekly"],"description":"even | weekly.","type":["string","null"]},"confidence":{"enum":["planned","committed","tentative"],"description":"planned | committed | tentative.","type":["string","null"]},"roleHint":{"type":["string","null"]},"note":{"type":["string","null"]},"source":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"convertedTaskUlid":{"description":"Antwort von convert-to-task: ULID der erzeugten (oder bereits vorhandenen) Aufgabe.","type":["string","null"]}}},"Allocation-allocation.update.jsonMergePatch":{"type":"object","description":"Allocation-Resource (04-09 §4.2). CRUD Person→Projekt-Zuordnung + Vorbelegung aus Projekt-Mitgliedern.\nbrandId serverseitig vom Projekt abgeleitet, read-only.","properties":{"periodStart":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"plannedHours":{"minimum":0,"description":"Soll-Stunden über den Zeitraum.","type":["number","null"]},"distribution":{"enum":["even","weekly"],"description":"even | weekly.","type":["string","null"]},"confidence":{"enum":["planned","committed","tentative"],"description":"planned | committed | tentative.","type":["string","null"]},"roleHint":{"type":["string","null"]},"note":{"type":["string","null"]}}},"Allocation-allocation.write":{"type":"object","description":"Allocation-Resource (04-09 §4.2). CRUD Person→Projekt-Zuordnung + Vorbelegung aus Projekt-Mitgliedern.\nbrandId serverseitig vom Projekt abgeleitet, read-only.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"periodStart":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"plannedHours":{"minimum":0,"description":"Soll-Stunden über den Zeitraum.","type":["number","null"]},"distribution":{"enum":["even","weekly"],"description":"even | weekly.","type":["string","null"]},"confidence":{"enum":["planned","committed","tentative"],"description":"planned | committed | tentative.","type":["string","null"]},"roleHint":{"type":["string","null"]},"note":{"type":["string","null"]},"taskTitle":{"maxLength":1000,"description":"Nur für convert-to-task (Doc 27 4.5): optionaler Titel der erzeugten Aufgabe.","type":["string","null"]}}},"Allocation.jsonld-allocation.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"periodStart":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"plannedHours":{"minimum":0,"description":"Soll-Stunden über den Zeitraum.","type":["number","null"]},"distribution":{"enum":["even","weekly"],"description":"even | weekly.","type":["string","null"]},"confidence":{"enum":["planned","committed","tentative"],"description":"planned | committed | tentative.","type":["string","null"]},"roleHint":{"type":["string","null"]},"note":{"type":["string","null"]},"source":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"convertedTaskUlid":{"description":"Antwort von convert-to-task: ULID der erzeugten (oder bereits vorhandenen) Aufgabe.","type":["string","null"]}}}],"description":"Allocation-Resource (04-09 §4.2). CRUD Person→Projekt-Zuordnung + Vorbelegung aus Projekt-Mitgliedern.\nbrandId serverseitig vom Projekt abgeleitet, read-only."},"ApiToken-api_token.read":{"type":"object","description":"API-/MCP-Zugriffstoken (PAT). Verwaltung nur `platform.api_token.manage`.\n- plainToken nur in POST-Antwort (Gruppe api_token:secret), nie in Liste/Item\n- Identifier: ULID (Enumerationsschutz)\n- /revoke deaktiviert (Zeile bleibt) vs. Delete entfernt endgültig.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"default":"","type":"string"},"userUlid":{"description":"Rechteinhaber des Tokens — Pflicht bei Erstellung, danach fix.","type":["string","null"]},"userDisplayName":{"type":["string","null"]},"userEmail":{"type":["string","null"]},"actorType":{"description":"'human' (persönliches API-Token) oder 'ai' (MCP-/KI-Identität) — steuert die Audit-Zuordnung.","default":"human","type":"string"},"scopes":{"description":"Rechte-Teilmenge (Permission-Namen); null = keine Einschränkung (volle Rechte des Users).","type":["array","null"],"items":{"type":"string"}},"expiresAt":{"description":"Ablauf (ISO 8601); null = unbegrenzt (sofern das Setting security.api_token.max_ttl_days es zulässt).","type":["string","null"],"format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"status":{"description":"'active' | 'revoked' | 'expired'.","type":["string","null"]},"tokenPreview":{"description":"Nicht-geheimes Wiedererkennungs-Präfix (z. B. `octi_ab12cd`).","type":["string","null"]}},"required":["name"]},"ApiToken-api_token.read_api_token.secret":{"type":"object","description":"API-/MCP-Zugriffstoken (PAT). Verwaltung nur `platform.api_token.manage`.\n- plainToken nur in POST-Antwort (Gruppe api_token:secret), nie in Liste/Item\n- Identifier: ULID (Enumerationsschutz)\n- /revoke deaktiviert (Zeile bleibt) vs. Delete entfernt endgültig.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"default":"","type":"string"},"userUlid":{"description":"Rechteinhaber des Tokens — Pflicht bei Erstellung, danach fix.","type":["string","null"]},"userDisplayName":{"type":["string","null"]},"userEmail":{"type":["string","null"]},"actorType":{"description":"'human' (persönliches API-Token) oder 'ai' (MCP-/KI-Identität) — steuert die Audit-Zuordnung.","default":"human","type":"string"},"scopes":{"description":"Rechte-Teilmenge (Permission-Namen); null = keine Einschränkung (volle Rechte des Users).","type":["array","null"],"items":{"type":"string"}},"expiresAt":{"description":"Ablauf (ISO 8601); null = unbegrenzt (sofern das Setting security.api_token.max_ttl_days es zulässt).","type":["string","null"],"format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"status":{"description":"'active' | 'revoked' | 'expired'.","type":["string","null"]},"tokenPreview":{"description":"Nicht-geheimes Wiedererkennungs-Präfix (z. B. `octi_ab12cd`).","type":["string","null"]},"plainToken":{"description":"Das opake Klartext-Secret — NUR in der Erstellungs-Antwort (Gruppe api_token:secret).","type":["string","null"]}},"required":["name"]},"ApiToken-api_token.write":{"type":"object","description":"API-/MCP-Zugriffstoken (PAT). Verwaltung nur `platform.api_token.manage`.\n- plainToken nur in POST-Antwort (Gruppe api_token:secret), nie in Liste/Item\n- Identifier: ULID (Enumerationsschutz)\n- /revoke deaktiviert (Zeile bleibt) vs. Delete entfernt endgültig.","required":["name"],"properties":{"name":{"maxLength":120,"default":"","type":"string"},"userUlid":{"description":"Rechteinhaber des Tokens — Pflicht bei Erstellung, danach fix.","type":["string","null"]},"actorType":{"description":"'human' (persönliches API-Token) oder 'ai' (MCP-/KI-Identität) — steuert die Audit-Zuordnung.","default":"human","type":"string"},"scopes":{"description":"Rechte-Teilmenge (Permission-Namen); null = keine Einschränkung (volle Rechte des Users).","type":["array","null"],"items":{"type":"string"}},"expiresAt":{"description":"Ablauf (ISO 8601); null = unbegrenzt (sofern das Setting security.api_token.max_ttl_days es zulässt).","type":["string","null"],"format":"date-time"}}},"ApiToken-api_token.write.jsonMergePatch":{"type":"object","description":"API-/MCP-Zugriffstoken (PAT). Verwaltung nur `platform.api_token.manage`.\n- plainToken nur in POST-Antwort (Gruppe api_token:secret), nie in Liste/Item\n- Identifier: ULID (Enumerationsschutz)\n- /revoke deaktiviert (Zeile bleibt) vs. Delete entfernt endgültig.","properties":{"name":{"maxLength":120,"default":"","type":"string"},"userUlid":{"description":"Rechteinhaber des Tokens — Pflicht bei Erstellung, danach fix.","type":["string","null"]},"actorType":{"description":"'human' (persönliches API-Token) oder 'ai' (MCP-/KI-Identität) — steuert die Audit-Zuordnung.","default":"human","type":"string"},"scopes":{"description":"Rechte-Teilmenge (Permission-Namen); null = keine Einschränkung (volle Rechte des Users).","type":["array","null"],"items":{"type":"string"}},"expiresAt":{"description":"Ablauf (ISO 8601); null = unbegrenzt (sofern das Setting security.api_token.max_ttl_days es zulässt).","type":["string","null"],"format":"date-time"}}},"ApiToken.jsonld-api_token.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"default":"","type":"string"},"userUlid":{"description":"Rechteinhaber des Tokens — Pflicht bei Erstellung, danach fix.","type":["string","null"]},"userDisplayName":{"type":["string","null"]},"userEmail":{"type":["string","null"]},"actorType":{"description":"'human' (persönliches API-Token) oder 'ai' (MCP-/KI-Identität) — steuert die Audit-Zuordnung.","default":"human","type":"string"},"scopes":{"description":"Rechte-Teilmenge (Permission-Namen); null = keine Einschränkung (volle Rechte des Users).","type":["array","null"],"items":{"type":"string"}},"expiresAt":{"description":"Ablauf (ISO 8601); null = unbegrenzt (sofern das Setting security.api_token.max_ttl_days es zulässt).","type":["string","null"],"format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"status":{"description":"'active' | 'revoked' | 'expired'.","type":["string","null"]},"tokenPreview":{"description":"Nicht-geheimes Wiedererkennungs-Präfix (z. B. `octi_ab12cd`).","type":["string","null"]}},"required":["name"]}],"description":"API-/MCP-Zugriffstoken (PAT). Verwaltung nur `platform.api_token.manage`.\n- plainToken nur in POST-Antwort (Gruppe api_token:secret), nie in Liste/Item\n- Identifier: ULID (Enumerationsschutz)\n- /revoke deaktiviert (Zeile bleibt) vs. Delete entfernt endgültig."},"ApiToken.jsonld-api_token.read_api_token.secret":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"default":"","type":"string"},"userUlid":{"description":"Rechteinhaber des Tokens — Pflicht bei Erstellung, danach fix.","type":["string","null"]},"userDisplayName":{"type":["string","null"]},"userEmail":{"type":["string","null"]},"actorType":{"description":"'human' (persönliches API-Token) oder 'ai' (MCP-/KI-Identität) — steuert die Audit-Zuordnung.","default":"human","type":"string"},"scopes":{"description":"Rechte-Teilmenge (Permission-Namen); null = keine Einschränkung (volle Rechte des Users).","type":["array","null"],"items":{"type":"string"}},"expiresAt":{"description":"Ablauf (ISO 8601); null = unbegrenzt (sofern das Setting security.api_token.max_ttl_days es zulässt).","type":["string","null"],"format":"date-time"},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"status":{"description":"'active' | 'revoked' | 'expired'.","type":["string","null"]},"tokenPreview":{"description":"Nicht-geheimes Wiedererkennungs-Präfix (z. B. `octi_ab12cd`).","type":["string","null"]},"plainToken":{"description":"Das opake Klartext-Secret — NUR in der Erstellungs-Antwort (Gruppe api_token:secret).","type":["string","null"]}},"required":["name"]}],"description":"API-/MCP-Zugriffstoken (PAT). Verwaltung nur `platform.api_token.manage`.\n- plainToken nur in POST-Antwort (Gruppe api_token:secret), nie in Liste/Item\n- Identifier: ULID (Enumerationsschutz)\n- /revoke deaktiviert (Zeile bleibt) vs. Delete entfernt endgültig."},"AssetAi-asset_ai.read":{"type":"object","description":"KI-Kostenoptimierung (04-15 §13 S15-1).\n- erkennt ungenutzte/überbuchte Seats\n- mit `ai.gateway`: Optimierungs-Einschätzung, sonst nur heuristische Hinweise\n- read-only, markenscope-gefiltert.","properties":{"id":{"type":["string","null"]},"findings":{"type":["array","null"],"items":{"type":"string"}},"narrative":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]}}},"AssetAi.jsonld-asset_ai.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"findings":{"type":["array","null"],"items":{"type":"string"}},"narrative":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]}}}],"description":"KI-Kostenoptimierung (04-15 §13 S15-1).\n- erkennt ungenutzte/überbuchte Seats\n- mit `ai.gateway`: Optimierungs-Einschätzung, sonst nur heuristische Hinweise\n- read-only, markenscope-gefiltert."},"AssetAssignment-asset_assignment.read":{"type":"object","description":"Zuweisungs-Historie von Assets/Seats (04-15 §4/§5).\n- read-only Liste/Detail + `/acknowledge` (Übernahme-Quittung)\n- Mitarbeitende: nur eigene Zuweisungen (Voter `assignment.view`); `assets.assignment.manage`: alle\n- Collection-Filter: employeeId/targetType/targetId/open.","properties":{"ulid":{"type":["string","null"]},"targetType":{"type":["string","null"]},"targetId":{"type":["integer","null"]},"targetName":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"assignedAt":{"type":["string","null"]},"returnedAt":{"type":["string","null"]},"condition":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"]},"acknowledgedBy":{"type":["string","null"]},"note":{"type":["string","null"]}}},"AssetAssignment-asset_assignment.write":{"type":"object","description":"Zuweisungs-Historie von Assets/Seats (04-15 §4/§5).\n- read-only Liste/Detail + `/acknowledge` (Übernahme-Quittung)\n- Mitarbeitende: nur eigene Zuweisungen (Voter `assignment.view`); `assets.assignment.manage`: alle\n- Collection-Filter: employeeId/targetType/targetId/open.","properties":{"note":{"type":["string","null"]}}},"AssetAssignment.jsonld-asset_assignment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"targetType":{"type":["string","null"]},"targetId":{"type":["integer","null"]},"targetName":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"assignedAt":{"type":["string","null"]},"returnedAt":{"type":["string","null"]},"condition":{"type":["string","null"]},"acknowledgedAt":{"type":["string","null"]},"acknowledgedBy":{"type":["string","null"]},"note":{"type":["string","null"]}}}],"description":"Zuweisungs-Historie von Assets/Seats (04-15 §4/§5).\n- read-only Liste/Detail + `/acknowledge` (Übernahme-Quittung)\n- Mitarbeitende: nur eigene Zuweisungen (Voter `assignment.view`); `assets.assignment.manage`: alle\n- Collection-Filter: employeeId/targetType/targetId/open."},"AssetCostCenter-asset_cc.read":{"type":"object","description":"Kostenstelle als Reporting-Schnitt (04-15 §3, Q3).\n- Schlüssel = `code`\n- Lesen: `assets.asset.view`, Pflege: `assets.cost.manage`.","properties":{"code":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"AssetCostCenter-asset_cc.write":{"type":"object","description":"Kostenstelle als Reporting-Schnitt (04-15 §3, Q3).\n- Schlüssel = `code`\n- Lesen: `assets.asset.view`, Pflege: `assets.cost.manage`.","properties":{"code":{"type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"AssetCostCenter-asset_cc.write.jsonMergePatch":{"type":"object","description":"Kostenstelle als Reporting-Schnitt (04-15 §3, Q3).\n- Schlüssel = `code`\n- Lesen: `assets.asset.view`, Pflege: `assets.cost.manage`.","properties":{"code":{"type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"AssetCostCenter.jsonld-asset_cc.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"code":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}}],"description":"Kostenstelle als Reporting-Schnitt (04-15 §3, Q3).\n- Schlüssel = `code`\n- Lesen: `assets.asset.view`, Pflege: `assets.cost.manage`."},"AssetCostRecord-asset_cost.read":{"type":"object","description":"Wiederkehrende/einmalige Kostenposition je Asset/Lizenz (04-15 §4.3).\n- `monthlyAmount`: normalisierter Monatsanteil, read-only\n- Filter targetType/targetId/interval/brandId, Sortierung order[label|validFrom|amount]\n- Beträge in Cent.","properties":{"ulid":{"type":["string","null"]},"targetType":{"enum":["asset","license"],"type":["string","null"]},"targetId":{"type":["integer","null"]},"targetName":{"description":"Name des Zielobjekts, read-only, serverseitig je Seite gebatcht aufgelöst.","type":["string","null"]},"label":{"maxLength":200,"type":["string","null"]},"amount":{"minimum":0,"type":["integer","null"]},"interval":{"enum":["one_off","monthly","quarterly","yearly"],"type":["string","null"]},"monthlyAmount":{"type":["integer","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"taxRate":{"type":["string","null"]},"supplierRef":{"type":["string","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"AssetCostRecord-asset_cost.write":{"type":"object","description":"Wiederkehrende/einmalige Kostenposition je Asset/Lizenz (04-15 §4.3).\n- `monthlyAmount`: normalisierter Monatsanteil, read-only\n- Filter targetType/targetId/interval/brandId, Sortierung order[label|validFrom|amount]\n- Beträge in Cent.","properties":{"targetType":{"enum":["asset","license"],"type":["string","null"]},"targetId":{"type":["integer","null"]},"label":{"maxLength":200,"type":["string","null"]},"amount":{"minimum":0,"type":["integer","null"]},"interval":{"enum":["one_off","monthly","quarterly","yearly"],"type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"taxRate":{"type":["string","null"]},"supplierRef":{"type":["string","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"note":{"type":["string","null"]}}},"AssetCostRecord-asset_cost.write.jsonMergePatch":{"type":"object","description":"Wiederkehrende/einmalige Kostenposition je Asset/Lizenz (04-15 §4.3).\n- `monthlyAmount`: normalisierter Monatsanteil, read-only\n- Filter targetType/targetId/interval/brandId, Sortierung order[label|validFrom|amount]\n- Beträge in Cent.","properties":{"targetType":{"enum":["asset","license"],"type":["string","null"]},"targetId":{"type":["integer","null"]},"label":{"maxLength":200,"type":["string","null"]},"amount":{"minimum":0,"type":["integer","null"]},"interval":{"enum":["one_off","monthly","quarterly","yearly"],"type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"taxRate":{"type":["string","null"]},"supplierRef":{"type":["string","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"note":{"type":["string","null"]}}},"AssetCostRecord.jsonld-asset_cost.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"targetType":{"enum":["asset","license"],"type":["string","null"]},"targetId":{"type":["integer","null"]},"targetName":{"description":"Name des Zielobjekts, read-only, serverseitig je Seite gebatcht aufgelöst.","type":["string","null"]},"label":{"maxLength":200,"type":["string","null"]},"amount":{"minimum":0,"type":["integer","null"]},"interval":{"enum":["one_off","monthly","quarterly","yearly"],"type":["string","null"]},"monthlyAmount":{"type":["integer","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"taxRate":{"type":["string","null"]},"supplierRef":{"type":["string","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Wiederkehrende/einmalige Kostenposition je Asset/Lizenz (04-15 §4.3).\n- `monthlyAmount`: normalisierter Monatsanteil, read-only\n- Filter targetType/targetId/interval/brandId, Sortierung order[label|validFrom|amount]\n- Beträge in Cent."},"AssetCostRecordSummary-asset_cost_summary.read":{"type":"object","description":"Kosten-Kennzahl-Aggregat der Kosten-Liste (Audit R18 Perf, Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}).\n- laufende Fixkosten monatlich/jährlich (CostNormalizer: Einmalbeträge zählen nicht) + Gesamtzahl\n- stets über GESAMTbestand, nicht die frühere clientseitige listAll-Reduktion (stille 5000er-Truncation)\n- Filter targetType/brandId; read-only, markenscope-gefiltert, Ein-Element-Collection.","properties":{"id":{"type":["string","null"]},"monthlyTotalAmount":{"description":"Laufende Fixkosten pro Monat in Cent (monthly ×1, quarterly ÷ 3, yearly ÷ 12; one_off = 0).","type":["integer","null"]},"yearlyTotalAmount":{"description":"Laufende Fixkosten pro Jahr in Cent (= monatlich × 12).","type":["integer","null"]},"totalCount":{"description":"Gesamtzahl der Kostensätze (inkl. Einmalkosten, nicht gelöscht) im Filter-/Marken-Scope.","type":["integer","null"]}}},"AssetCostRecordSummary.jsonld-asset_cost_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"monthlyTotalAmount":{"description":"Laufende Fixkosten pro Monat in Cent (monthly ×1, quarterly ÷ 3, yearly ÷ 12; one_off = 0).","type":["integer","null"]},"yearlyTotalAmount":{"description":"Laufende Fixkosten pro Jahr in Cent (= monatlich × 12).","type":["integer","null"]},"totalCount":{"description":"Gesamtzahl der Kostensätze (inkl. Einmalkosten, nicht gelöscht) im Filter-/Marken-Scope.","type":["integer","null"]}}}],"description":"Kosten-Kennzahl-Aggregat der Kosten-Liste (Audit R18 Perf, Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}).\n- laufende Fixkosten monatlich/jährlich (CostNormalizer: Einmalbeträge zählen nicht) + Gesamtzahl\n- stets über GESAMTbestand, nicht die frühere clientseitige listAll-Reduktion (stille 5000er-Truncation)\n- Filter targetType/brandId; read-only, markenscope-gefiltert, Ein-Element-Collection."},"AssetInternalAsset-asset.read":{"type":"object","description":"Eigenes Betriebsmittel/Inventarobjekt (04-15 §4.1/§5).\n- Lebenszyklus-Aktionen /receive, /repair, /to-stock, /retire; Zuweisung /assign, Rücknahme /return\n- Markenscope über asset.view/asset.manage.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische Id (für targetId-Verknüpfung von Kosten/Zuweisungen/Fristen).","type":["integer","null"]},"assetTag":{"maxLength":60,"type":["string","null"]},"type":{"enum":["hardware","domain","hosting","server","other"],"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"category":{"maxLength":60,"type":["string","null"]},"serialNumber":{"maxLength":120,"type":["string","null"]},"manufacturer":{"maxLength":120,"type":["string","null"]},"model":{"maxLength":120,"type":["string","null"]},"status":{"type":["string","null"]},"purchasedAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"purchasePriceAmount":{"minimum":0,"type":["integer","null"]},"warrantyUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"location":{"maxLength":120,"type":["string","null"]},"supplierRef":{"maxLength":60,"type":["string","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"contractId":{"description":"Verknüpfter Kundenvertrag (Modul 05) für Domain-/Hosting-Assets (S15-2).","type":["integer","null"]},"notes":{"type":["string","null"]},"assignedEmployeeId":{"description":"Aktuelle aktive Zuweisung (Mitarbeiter-Id), falls vorhanden.","type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"AssetInternalAsset-asset.write":{"type":"object","description":"Eigenes Betriebsmittel/Inventarobjekt (04-15 §4.1/§5).\n- Lebenszyklus-Aktionen /receive, /repair, /to-stock, /retire; Zuweisung /assign, Rücknahme /return\n- Markenscope über asset.view/asset.manage.","properties":{"assetTag":{"maxLength":60,"type":["string","null"]},"type":{"enum":["hardware","domain","hosting","server","other"],"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"category":{"maxLength":60,"type":["string","null"]},"serialNumber":{"maxLength":120,"type":["string","null"]},"manufacturer":{"maxLength":120,"type":["string","null"]},"model":{"maxLength":120,"type":["string","null"]},"purchasedAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"purchasePriceAmount":{"minimum":0,"type":["integer","null"]},"warrantyUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"location":{"maxLength":120,"type":["string","null"]},"supplierRef":{"maxLength":60,"type":["string","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"contractId":{"description":"Verknüpfter Kundenvertrag (Modul 05) für Domain-/Hosting-Assets (S15-2).","type":["integer","null"]},"notes":{"type":["string","null"]},"employeeId":{"description":"Nur für `/assign`: Ziel-Mitarbeiter.","type":["integer","null"]},"condition":{"enum":["new","used","defective"],"description":"Nur für `/assign`: Zustand (new/used/defective).","type":["string","null"]},"note":{"description":"Nur für `/assign` und `/return`: Notiz.","type":["string","null"]}}},"AssetInternalAsset-asset.write.jsonMergePatch":{"type":"object","description":"Eigenes Betriebsmittel/Inventarobjekt (04-15 §4.1/§5).\n- Lebenszyklus-Aktionen /receive, /repair, /to-stock, /retire; Zuweisung /assign, Rücknahme /return\n- Markenscope über asset.view/asset.manage.","properties":{"assetTag":{"maxLength":60,"type":["string","null"]},"type":{"enum":["hardware","domain","hosting","server","other"],"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"category":{"maxLength":60,"type":["string","null"]},"serialNumber":{"maxLength":120,"type":["string","null"]},"manufacturer":{"maxLength":120,"type":["string","null"]},"model":{"maxLength":120,"type":["string","null"]},"purchasedAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"purchasePriceAmount":{"minimum":0,"type":["integer","null"]},"warrantyUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"location":{"maxLength":120,"type":["string","null"]},"supplierRef":{"maxLength":60,"type":["string","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"contractId":{"description":"Verknüpfter Kundenvertrag (Modul 05) für Domain-/Hosting-Assets (S15-2).","type":["integer","null"]},"notes":{"type":["string","null"]},"employeeId":{"description":"Nur für `/assign`: Ziel-Mitarbeiter.","type":["integer","null"]},"condition":{"enum":["new","used","defective"],"description":"Nur für `/assign`: Zustand (new/used/defective).","type":["string","null"]},"note":{"description":"Nur für `/assign` und `/return`: Notiz.","type":["string","null"]}}},"AssetInternalAsset.jsonld-asset.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische Id (für targetId-Verknüpfung von Kosten/Zuweisungen/Fristen).","type":["integer","null"]},"assetTag":{"maxLength":60,"type":["string","null"]},"type":{"enum":["hardware","domain","hosting","server","other"],"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"category":{"maxLength":60,"type":["string","null"]},"serialNumber":{"maxLength":120,"type":["string","null"]},"manufacturer":{"maxLength":120,"type":["string","null"]},"model":{"maxLength":120,"type":["string","null"]},"status":{"type":["string","null"]},"purchasedAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"purchasePriceAmount":{"minimum":0,"type":["integer","null"]},"warrantyUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"location":{"maxLength":120,"type":["string","null"]},"supplierRef":{"maxLength":60,"type":["string","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"contractId":{"description":"Verknüpfter Kundenvertrag (Modul 05) für Domain-/Hosting-Assets (S15-2).","type":["integer","null"]},"notes":{"type":["string","null"]},"assignedEmployeeId":{"description":"Aktuelle aktive Zuweisung (Mitarbeiter-Id), falls vorhanden.","type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Eigenes Betriebsmittel/Inventarobjekt (04-15 §4.1/§5).\n- Lebenszyklus-Aktionen /receive, /repair, /to-stock, /retire; Zuweisung /assign, Rücknahme /return\n- Markenscope über asset.view/asset.manage."},"AssetInternalLicense-asset_license.read":{"type":"object","description":"Selbst genutztes Software-Abo/Tool (04-15 §4.2/§5).\n- Status-Aktionen /cancel, /pause, /reactivate, /expire; Laufzeit /renew; Seat-Zuteilung /assign-seat, /remove-seat\n- `cancelBy`/`seatsUsed`: abgeleitet, read-only\n- Markenscope über asset.view/asset.manage.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische Id (für targetId-Verknüpfung von Kosten/Seats/Fristen).","type":["integer","null"]},"name":{"maxLength":200,"type":["string","null"]},"vendor":{"maxLength":120,"type":["string","null"]},"type":{"enum":["saas","perpetual","open_source"],"type":["string","null"]},"seatsTotal":{"minimum":0,"type":["integer","null"]},"seatsUsed":{"type":["integer","null"]},"plan":{"maxLength":100,"type":["string","null"]},"loginRef":{"maxLength":255,"type":["string","null"]},"term":{"enum":["monthly","yearly","perpetual"],"type":["string","null"]},"startsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"endsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"renewsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"autoRenew":{"type":["boolean","null"]},"cancellationNoticeDays":{"minimum":0,"type":["integer","null"]},"cancelBy":{"type":["string","null"]},"status":{"type":["string","null"]},"overused":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"contractId":{"type":["integer","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"notes":{"type":["string","null"]},"seats":{"description":"Aktive Seat-Zuweisungen (eingebettet, read-only).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"]}}},"AssetInternalLicense-asset_license.write":{"type":"object","description":"Selbst genutztes Software-Abo/Tool (04-15 §4.2/§5).\n- Status-Aktionen /cancel, /pause, /reactivate, /expire; Laufzeit /renew; Seat-Zuteilung /assign-seat, /remove-seat\n- `cancelBy`/`seatsUsed`: abgeleitet, read-only\n- Markenscope über asset.view/asset.manage.","properties":{"name":{"maxLength":200,"type":["string","null"]},"vendor":{"maxLength":120,"type":["string","null"]},"type":{"enum":["saas","perpetual","open_source"],"type":["string","null"]},"seatsTotal":{"minimum":0,"type":["integer","null"]},"plan":{"maxLength":100,"type":["string","null"]},"loginRef":{"maxLength":255,"type":["string","null"]},"term":{"enum":["monthly","yearly","perpetual"],"type":["string","null"]},"startsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"endsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"renewsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"autoRenew":{"type":["boolean","null"]},"cancellationNoticeDays":{"minimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"contractId":{"type":["integer","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"notes":{"type":["string","null"]},"employeeId":{"description":"Nur für `/assign-seat` und `/remove-seat`: Ziel-Mitarbeiter.","type":["integer","null"]},"note":{"description":"Nur für `/assign-seat`: Notiz.","type":["string","null"]}}},"AssetInternalLicense-asset_license.write.jsonMergePatch":{"type":"object","description":"Selbst genutztes Software-Abo/Tool (04-15 §4.2/§5).\n- Status-Aktionen /cancel, /pause, /reactivate, /expire; Laufzeit /renew; Seat-Zuteilung /assign-seat, /remove-seat\n- `cancelBy`/`seatsUsed`: abgeleitet, read-only\n- Markenscope über asset.view/asset.manage.","properties":{"name":{"maxLength":200,"type":["string","null"]},"vendor":{"maxLength":120,"type":["string","null"]},"type":{"enum":["saas","perpetual","open_source"],"type":["string","null"]},"seatsTotal":{"minimum":0,"type":["integer","null"]},"plan":{"maxLength":100,"type":["string","null"]},"loginRef":{"maxLength":255,"type":["string","null"]},"term":{"enum":["monthly","yearly","perpetual"],"type":["string","null"]},"startsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"endsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"renewsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"autoRenew":{"type":["boolean","null"]},"cancellationNoticeDays":{"minimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"contractId":{"type":["integer","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"notes":{"type":["string","null"]},"employeeId":{"description":"Nur für `/assign-seat` und `/remove-seat`: Ziel-Mitarbeiter.","type":["integer","null"]},"note":{"description":"Nur für `/assign-seat`: Notiz.","type":["string","null"]}}},"AssetInternalLicense.jsonld-asset_license.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische Id (für targetId-Verknüpfung von Kosten/Seats/Fristen).","type":["integer","null"]},"name":{"maxLength":200,"type":["string","null"]},"vendor":{"maxLength":120,"type":["string","null"]},"type":{"enum":["saas","perpetual","open_source"],"type":["string","null"]},"seatsTotal":{"minimum":0,"type":["integer","null"]},"seatsUsed":{"type":["integer","null"]},"plan":{"maxLength":100,"type":["string","null"]},"loginRef":{"maxLength":255,"type":["string","null"]},"term":{"enum":["monthly","yearly","perpetual"],"type":["string","null"]},"startsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"endsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"renewsAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"autoRenew":{"type":["boolean","null"]},"cancellationNoticeDays":{"minimum":0,"type":["integer","null"]},"cancelBy":{"type":["string","null"]},"status":{"type":["string","null"]},"overused":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]},"costCenterId":{"type":["integer","null"]},"contractId":{"type":["integer","null"]},"expenseRef":{"maxLength":100,"type":["string","null"]},"notes":{"type":["string","null"]},"seats":{"description":"Aktive Seat-Zuweisungen (eingebettet, read-only).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"]}}}],"description":"Selbst genutztes Software-Abo/Tool (04-15 §4.2/§5).\n- Status-Aktionen /cancel, /pause, /reactivate, /expire; Laufzeit /renew; Seat-Zuteilung /assign-seat, /remove-seat\n- `cancelBy`/`seatsUsed`: abgeleitet, read-only\n- Markenscope über asset.view/asset.manage."},"AssetLicenseStatus-asset_license_status.read":{"type":"object","description":"Status interner Software-Lizenzen als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalLicense::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"AssetLicenseStatus-asset_license_status.update.jsonMergePatch":{"type":"object","description":"Status interner Software-Lizenzen als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalLicense::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"AssetLicenseStatus-asset_license_status.write":{"type":"object","description":"Status interner Software-Lizenzen als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalLicense::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"AssetLicenseStatus.jsonld-asset_license_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Status interner Software-Lizenzen als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalLicense::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig."},"AssetRenewalReminder-asset_reminder.read":{"type":"object","description":"Fristen-Cockpit (04-15 §5): Verlängerungs-/Kündigungs-/Garantie-/Laufzeitende-Reminder, sortiert nach Fälligkeit.\n- read-only Liste/Detail + Aktionen /acknowledge (gesehen), /done (erledigt)\n- Filter status/kind/targetType/targetId.","properties":{"ulid":{"type":["string","null"]},"targetType":{"type":["string","null"]},"targetId":{"type":["integer","null"]},"targetName":{"type":["string","null"]},"targetUlid":{"description":"ULID des Zielobjekts für den Detail-Link, serverseitig je Seite gebatcht aufgelöst.","type":["string","null"]},"kind":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"leadDays":{"type":["integer","null"]},"notifyFrom":{"type":["string","null"]},"status":{"type":["string","null"]},"recipientRole":{"type":["string","null"]},"lastNotifiedAt":{"type":["string","null"]},"due":{"description":"True, wenn die Fälligkeit innerhalb des Vorlaufs liegt (für die rote Markierung).","type":["boolean","null"]}}},"AssetRenewalReminder-asset_reminder.write":{"type":"object","description":"Fristen-Cockpit (04-15 §5): Verlängerungs-/Kündigungs-/Garantie-/Laufzeitende-Reminder, sortiert nach Fälligkeit.\n- read-only Liste/Detail + Aktionen /acknowledge (gesehen), /done (erledigt)\n- Filter status/kind/targetType/targetId."},"AssetRenewalReminder.jsonld-asset_reminder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"targetType":{"type":["string","null"]},"targetId":{"type":["integer","null"]},"targetName":{"type":["string","null"]},"targetUlid":{"description":"ULID des Zielobjekts für den Detail-Link, serverseitig je Seite gebatcht aufgelöst.","type":["string","null"]},"kind":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"leadDays":{"type":["integer","null"]},"notifyFrom":{"type":["string","null"]},"status":{"type":["string","null"]},"recipientRole":{"type":["string","null"]},"lastNotifiedAt":{"type":["string","null"]},"due":{"description":"True, wenn die Fälligkeit innerhalb des Vorlaufs liegt (für die rote Markierung).","type":["boolean","null"]}}}],"description":"Fristen-Cockpit (04-15 §5): Verlängerungs-/Kündigungs-/Garantie-/Laufzeitende-Reminder, sortiert nach Fälligkeit.\n- read-only Liste/Detail + Aktionen /acknowledge (gesehen), /done (erledigt)\n- Filter status/kind/targetType/targetId."},"AssetReport-asset_report.read":{"type":"object","description":"Controlling-Auswertung Asset-/Lizenzverwaltung (04-15 §4/§5/§6).\n- Fixkostenblock (monatlich/jährlich) je Marke/Kostenstelle/Kategorie\n- ungenutzte/überbuchte Seats\n- read-only, markenscope-gefiltert, Beträge in Cent.","properties":{"id":{"type":["string","null"]},"totalMonthly":{"type":["integer","null"]},"totalYearly":{"type":["integer","null"]},"byBrand":{"type":["array","null"],"items":{"type":"integer"}},"byCostCenter":{"type":["array","null"],"items":{"type":"integer"}},"byCategory":{"type":["array","null"],"items":{"type":"integer"}},"unusedSeats":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"overusedSeats":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"assetCount":{"type":["integer","null"]},"licenseCount":{"type":["integer","null"]}}},"AssetReport.jsonld-asset_report.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"totalMonthly":{"type":["integer","null"]},"totalYearly":{"type":["integer","null"]},"byBrand":{"type":["array","null"],"items":{"type":"integer"}},"byCostCenter":{"type":["array","null"],"items":{"type":"integer"}},"byCategory":{"type":["array","null"],"items":{"type":"integer"}},"unusedSeats":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"overusedSeats":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"assetCount":{"type":["integer","null"]},"licenseCount":{"type":["integer","null"]}}}],"description":"Controlling-Auswertung Asset-/Lizenzverwaltung (04-15 §4/§5/§6).\n- Fixkostenblock (monatlich/jährlich) je Marke/Kostenstelle/Kategorie\n- ungenutzte/überbuchte Seats\n- read-only, markenscope-gefiltert, Beträge in Cent."},"AssetStatus-asset_status.read":{"type":"object","description":"Betriebsmittel-Status als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalAsset::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"AssetStatus-asset_status.update.jsonMergePatch":{"type":"object","description":"Betriebsmittel-Status als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalAsset::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"AssetStatus-asset_status.write":{"type":"object","description":"Betriebsmittel-Status als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalAsset::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"AssetStatus.jsonld-asset_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Betriebsmittel-Status als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalAsset::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig."},"AssistantAgent-assistant_agent.read":{"type":"object","description":"AI-Workspace-Agent (Doc 30 W5): user-baubare Konfiguration. Nutzer-eigen (Ownership im Provider/\nProcessor); Teilen über `visibility`. `platform.assistant.manage` regelt Governance (Approval,\n`whitelisted`-Autonomie), nicht das bloße Anlegen eigener Agenten.","properties":{"ulid":{"type":["string","null"]},"agentKey":{"type":["string","null"]},"name":{"maxLength":150,"default":"","type":"string"},"description":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"instructionUseCase":{"maxLength":100,"type":["string","null"]},"instructionInline":{"type":["string","null"]},"allowedTools":{"type":"array","items":{"type":"string"}},"allowedAgents":{"maxItems":8,"description":"Multi-Agent (Doc 30 W12): ULIDs der Agenten, an die dieser Agent Teil-Aufträge delegieren darf.","type":"array","items":{"type":"string"}},"brainPolicyUseCase":{"maxLength":100,"type":["string","null"]},"modelRoute":{"maxLength":100,"type":["string","null"]},"autonomy":{"enum":["advisory","confirm","whitelisted"],"default":"advisory","type":"string"},"status":{"enum":["draft","published","archived"],"default":"draft","type":"string"},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"},"approvalState":{"type":["string","null"]},"providerKey":{"type":["string","null"]},"mine":{"default":false,"type":"boolean"},"editable":{"description":"Darf der aufrufende Nutzer diese Zeile ändern? Eigene Agenten immer; mitgelieferte\n(`providerKey`, ownerId=NULL) mit `platform.assistant.manage`; fremde nie.","default":false,"type":"boolean"},"customized":{"description":"Mitgelieferter Agent mit eigener Änderung — Voraussetzung für das Zurücksetzen.","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"AssistantAgent-assistant_agent.write":{"type":"object","description":"AI-Workspace-Agent (Doc 30 W5): user-baubare Konfiguration. Nutzer-eigen (Ownership im Provider/\nProcessor); Teilen über `visibility`. `platform.assistant.manage` regelt Governance (Approval,\n`whitelisted`-Autonomie), nicht das bloße Anlegen eigener Agenten.","required":["name"],"properties":{"name":{"maxLength":150,"default":"","type":"string"},"description":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"instructionUseCase":{"maxLength":100,"type":["string","null"]},"instructionInline":{"type":["string","null"]},"allowedTools":{"type":"array","items":{"type":"string"}},"allowedAgents":{"maxItems":8,"description":"Multi-Agent (Doc 30 W12): ULIDs der Agenten, an die dieser Agent Teil-Aufträge delegieren darf.","type":"array","items":{"type":"string"}},"brainPolicyUseCase":{"maxLength":100,"type":["string","null"]},"modelRoute":{"maxLength":100,"type":["string","null"]},"autonomy":{"enum":["advisory","confirm","whitelisted"],"default":"advisory","type":"string"},"status":{"enum":["draft","published","archived"],"default":"draft","type":"string"},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"}}},"AssistantAgent-assistant_agent.write.jsonMergePatch":{"type":"object","description":"AI-Workspace-Agent (Doc 30 W5): user-baubare Konfiguration. Nutzer-eigen (Ownership im Provider/\nProcessor); Teilen über `visibility`. `platform.assistant.manage` regelt Governance (Approval,\n`whitelisted`-Autonomie), nicht das bloße Anlegen eigener Agenten.","properties":{"name":{"maxLength":150,"default":"","type":"string"},"description":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"instructionUseCase":{"maxLength":100,"type":["string","null"]},"instructionInline":{"type":["string","null"]},"allowedTools":{"type":"array","items":{"type":"string"}},"allowedAgents":{"maxItems":8,"description":"Multi-Agent (Doc 30 W12): ULIDs der Agenten, an die dieser Agent Teil-Aufträge delegieren darf.","type":"array","items":{"type":"string"}},"brainPolicyUseCase":{"maxLength":100,"type":["string","null"]},"modelRoute":{"maxLength":100,"type":["string","null"]},"autonomy":{"enum":["advisory","confirm","whitelisted"],"default":"advisory","type":"string"},"status":{"enum":["draft","published","archived"],"default":"draft","type":"string"},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"}}},"AssistantAgent.jsonld-assistant_agent.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"agentKey":{"type":["string","null"]},"name":{"maxLength":150,"default":"","type":"string"},"description":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"instructionUseCase":{"maxLength":100,"type":["string","null"]},"instructionInline":{"type":["string","null"]},"allowedTools":{"type":"array","items":{"type":"string"}},"allowedAgents":{"maxItems":8,"description":"Multi-Agent (Doc 30 W12): ULIDs der Agenten, an die dieser Agent Teil-Aufträge delegieren darf.","type":"array","items":{"type":"string"}},"brainPolicyUseCase":{"maxLength":100,"type":["string","null"]},"modelRoute":{"maxLength":100,"type":["string","null"]},"autonomy":{"enum":["advisory","confirm","whitelisted"],"default":"advisory","type":"string"},"status":{"enum":["draft","published","archived"],"default":"draft","type":"string"},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"},"approvalState":{"type":["string","null"]},"providerKey":{"type":["string","null"]},"mine":{"default":false,"type":"boolean"},"editable":{"description":"Darf der aufrufende Nutzer diese Zeile ändern? Eigene Agenten immer; mitgelieferte\n(`providerKey`, ownerId=NULL) mit `platform.assistant.manage`; fremde nie.","default":false,"type":"boolean"},"customized":{"description":"Mitgelieferter Agent mit eigener Änderung — Voraussetzung für das Zurücksetzen.","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}],"description":"AI-Workspace-Agent (Doc 30 W5): user-baubare Konfiguration. Nutzer-eigen (Ownership im Provider/\nProcessor); Teilen über `visibility`. `platform.assistant.manage` regelt Governance (Approval,\n`whitelisted`-Autonomie), nicht das bloße Anlegen eigener Agenten."},"AssistantAgentRun-assistant_run.read":{"type":"object","description":"Agenten-Lauf (Doc 30 W7): startet einen Agenten in einem Thread bzw. löst ein Schreib-Confirm ein.\nAntwort ist die (finale) Assistenten-Nachricht ODER — bei einer schreibenden Aktion — eine Vorschau\nmit signiertem Confirm-Token (`needsConfirm=true`), das über `/run-confirm` eingelöst wird.","required":["threadUlid"],"properties":{"threadUlid":{"type":["string","null"]},"id":{"description":"Kein echter Identifier (Action-DTO ohne Persistenz) — ohne `identifier: false` erzwingt API Platform eine IRI → 400.","type":["string","null"]},"messageUlid":{"type":["string","null"]},"role":{"default":"assistant","type":"string"},"answer":{"default":"","type":"string"},"model":{"type":["string","null"]},"tokenCount":{"type":["integer","null"]},"costCents":{"type":["integer","null"]},"needsConfirm":{"default":false,"type":"boolean"},"confirmToken":{"type":["string","null"]},"confirmTool":{"type":["string","null"]},"confirmPreview":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}},"AssistantAgentRun-assistant_run.write":{"type":"object","description":"Agenten-Lauf (Doc 30 W7): startet einen Agenten in einem Thread bzw. löst ein Schreib-Confirm ein.\nAntwort ist die (finale) Assistenten-Nachricht ODER — bei einer schreibenden Aktion — eine Vorschau\nmit signiertem Confirm-Token (`needsConfirm=true`), das über `/run-confirm` eingelöst wird.","required":["threadUlid"],"properties":{"threadUlid":{"type":["string","null"]},"content":{"description":"Nur für /run: die Nutzer-Eingabe.","type":["string","null"]},"agentUlid":{"description":"Nur für /run-confirm: Agent + signiertes Token.","type":["string","null"]},"token":{"type":["string","null"]}}},"AssistantAgentRun.jsonld-assistant_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["threadUlid"],"properties":{"threadUlid":{"type":["string","null"]},"id":{"description":"Kein echter Identifier (Action-DTO ohne Persistenz) — ohne `identifier: false` erzwingt API Platform eine IRI → 400.","type":["string","null"]},"messageUlid":{"type":["string","null"]},"role":{"default":"assistant","type":"string"},"answer":{"default":"","type":"string"},"model":{"type":["string","null"]},"tokenCount":{"type":["integer","null"]},"costCents":{"type":["integer","null"]},"needsConfirm":{"default":false,"type":"boolean"},"confirmToken":{"type":["string","null"]},"confirmTool":{"type":["string","null"]},"confirmPreview":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}}],"description":"Agenten-Lauf (Doc 30 W7): startet einen Agenten in einem Thread bzw. löst ein Schreib-Confirm ein.\nAntwort ist die (finale) Assistenten-Nachricht ODER — bei einer schreibenden Aktion — eine Vorschau\nmit signiertem Confirm-Token (`needsConfirm=true`), das über `/run-confirm` eingelöst wird."},"AssistantMessage-assistant_message.read":{"type":"object","description":"AI-Workspace-Nachricht (Doc 30 W1). POST = Chat-Senden: erzeugt die Nutzer-Nachricht, ruft das\nGateway (Budget/Audit automatisch) und gibt die Assistenten-Antwort zurück. Zugriff strikt über den\nbesitzenden Thread (IDOR-Schutz im Provider/Processor).","properties":{"ulid":{"type":["string","null"]},"threadUlid":{"description":"Ziel-Thread (Pflicht beim Senden).","type":["string","null"]},"role":{"default":"assistant","type":"string"},"content":{"maxLength":20000,"default":"","type":"string"},"citations":{"type":["array","null"],"items":{"type":["string","null"]}},"toolCalls":{"description":"Werkzeug-Aufrufe dieses Schritts (Doc 41 B-05): `[{tool, args}]` bzw. `[{agent, task}]` bei\neiner Delegation, `pendingConfirm` bei einer wartenden Schreib-Bestätigung. Die Entität hielt\ndas längst — nur ausgeliefert wurde es nie, weshalb die Oberfläche eine Werkzeug-Zeile wie eine\nnormale Antwort darstellte.","type":["array","null"],"items":{"type":["string","null"]}},"rationale":{"description":"Begründung des Modells zu diesem Schritt (Doc 41 B-03/ENT-KIH-03); null bei Altbestand.","type":["string","null"]},"runUlid":{"description":"ULID des Agenten-Laufs, zu dem dieser Schritt gehört (Doc 41 B-05); null außerhalb eines Laufs.","type":["string","null"]},"model":{"type":["string","null"]},"tokenCount":{"type":["integer","null"]},"costCents":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["threadUlid","content"]},"AssistantMessage-assistant_message.write":{"type":"object","description":"AI-Workspace-Nachricht (Doc 30 W1). POST = Chat-Senden: erzeugt die Nutzer-Nachricht, ruft das\nGateway (Budget/Audit automatisch) und gibt die Assistenten-Antwort zurück. Zugriff strikt über den\nbesitzenden Thread (IDOR-Schutz im Provider/Processor).","required":["threadUlid","content"],"properties":{"threadUlid":{"description":"Ziel-Thread (Pflicht beim Senden).","type":["string","null"]},"content":{"maxLength":20000,"default":"","type":"string"}}},"AssistantMessage.jsonld-assistant_message.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"threadUlid":{"description":"Ziel-Thread (Pflicht beim Senden).","type":["string","null"]},"role":{"default":"assistant","type":"string"},"content":{"maxLength":20000,"default":"","type":"string"},"citations":{"type":["array","null"],"items":{"type":["string","null"]}},"toolCalls":{"description":"Werkzeug-Aufrufe dieses Schritts (Doc 41 B-05): `[{tool, args}]` bzw. `[{agent, task}]` bei\neiner Delegation, `pendingConfirm` bei einer wartenden Schreib-Bestätigung. Die Entität hielt\ndas längst — nur ausgeliefert wurde es nie, weshalb die Oberfläche eine Werkzeug-Zeile wie eine\nnormale Antwort darstellte.","type":["array","null"],"items":{"type":["string","null"]}},"rationale":{"description":"Begründung des Modells zu diesem Schritt (Doc 41 B-03/ENT-KIH-03); null bei Altbestand.","type":["string","null"]},"runUlid":{"description":"ULID des Agenten-Laufs, zu dem dieser Schritt gehört (Doc 41 B-05); null außerhalb eines Laufs.","type":["string","null"]},"model":{"type":["string","null"]},"tokenCount":{"type":["integer","null"]},"costCents":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["threadUlid","content"]}],"description":"AI-Workspace-Nachricht (Doc 30 W1). POST = Chat-Senden: erzeugt die Nutzer-Nachricht, ruft das\nGateway (Budget/Audit automatisch) und gibt die Assistenten-Antwort zurück. Zugriff strikt über den\nbesitzenden Thread (IDOR-Schutz im Provider/Processor)."},"AssistantModel-assistant_model.read":{"type":"object","description":"Wählbares Chat-Modell (Doc 30 W3). Read-only Katalog aus {@see \\App\\Platform\\LlmGateway\\AiProviderCatalog}\n(+ „Automatisch\"). `key` = \"provider:model\" bzw. \"auto\"; wird als AssistantThread.modelRoute gespeichert.","properties":{"key":{"default":"","type":"string"},"label":{"default":"","type":"string"},"provider":{"type":["string","null"]},"model":{"type":["string","null"]},"isAuto":{"default":false,"type":"boolean"}}},"AssistantModel.jsonld-assistant_model.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"default":"","type":"string"},"label":{"default":"","type":"string"},"provider":{"type":["string","null"]},"model":{"type":["string","null"]},"isAuto":{"default":false,"type":"boolean"}}}],"description":"Wählbares Chat-Modell (Doc 30 W3). Read-only Katalog aus {@see \\App\\Platform\\LlmGateway\\AiProviderCatalog}\n(+ „Automatisch\"). `key` = \"provider:model\" bzw. \"auto\"; wird als AssistantThread.modelRoute gespeichert."},"AssistantRun-assistant_run_view.read":{"type":"object","description":"LAUF-EINSICHT eines Agenten-Laufs (Doc 41 B-04/ENT-KIH-03): Schritt-für-Schritt-Aufriss mit\nWerkzeugname, Argumenten, Begründung, Dauer und Kosten — plus der Sub-Läufe, an die delegiert wurde.\n\nDER BEFUND: das Datenmodell trug all das längst (`parentRunId`, `depth`, `status`, `stepCount`,\n`costCents`, Zeitstempel), die Ressource deklarierte aber NUR zwei POST-Operationen. Ein Lauf war\nüber die API nicht abrufbar — „warum hat der Agent das getan\" damit auch nicht beantwortbar.\n\nSichtbarkeit: strikt der eigene Lauf (über den besitzenden Staff-Thread). Ein fremder Lauf\nantwortet 403, ein unbekannter 404.","properties":{"ulid":{"type":["string","null"]},"agentUlid":{"type":["string","null"]},"agentName":{"type":["string","null"]},"threadUlid":{"type":["string","null"]},"parentRunUlid":{"description":"Eltern-Lauf bei Delegation; null = Wurzel-Lauf.","type":["string","null"]},"depth":{"default":0,"type":"integer"},"status":{"default":"","type":"string"},"stepCount":{"default":0,"type":"integer"},"costCents":{"default":0,"type":"integer"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"durationMs":{"description":"Laufzeit in Millisekunden; null solange der Lauf nicht abgeschlossen ist.","type":["integer","null"]},"steps":{"description":"Schritte des Laufs (nur Einzel-Abruf), chronologisch: role, content, rationale, toolCalls,\nmodel, tokenCount, costCents, createdAt.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"children":{"type":"array","items":{"$ref":"#/components/schemas/AssistantRun-assistant_run_view.read"}}}},"AssistantRun.jsonld-assistant_run_view.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"agentUlid":{"type":["string","null"]},"agentName":{"type":["string","null"]},"threadUlid":{"type":["string","null"]},"parentRunUlid":{"description":"Eltern-Lauf bei Delegation; null = Wurzel-Lauf.","type":["string","null"]},"depth":{"default":0,"type":"integer"},"status":{"default":"","type":"string"},"stepCount":{"default":0,"type":"integer"},"costCents":{"default":0,"type":"integer"},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"durationMs":{"description":"Laufzeit in Millisekunden; null solange der Lauf nicht abgeschlossen ist.","type":["integer","null"]},"steps":{"description":"Schritte des Laufs (nur Einzel-Abruf), chronologisch: role, content, rationale, toolCalls,\nmodel, tokenCount, costCents, createdAt.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"LAUF-EINSICHT eines Agenten-Laufs (Doc 41 B-04/ENT-KIH-03): Schritt-für-Schritt-Aufriss mit\nWerkzeugname, Argumenten, Begründung, Dauer und Kosten — plus der Sub-Läufe, an die delegiert wurde.\n\nDER BEFUND: das Datenmodell trug all das längst (`parentRunId`, `depth`, `status`, `stepCount`,\n`costCents`, Zeitstempel), die Ressource deklarierte aber NUR zwei POST-Operationen. Ein Lauf war\nüber die API nicht abrufbar — „warum hat der Agent das getan\" damit auch nicht beantwortbar.\n\nSichtbarkeit: strikt der eigene Lauf (über den besitzenden Staff-Thread). Ein fremder Lauf\nantwortet 403, ein unbekannter 404.","properties":{"children":{"type":"array","items":{"$ref":"#/components/schemas/AssistantRun.jsonld-assistant_run_view.read"}}}},"AssistantSkill-assistant_skill.read":{"type":"object","description":"AI-Workspace-Skill/-Prompt (Doc 30 W6). Bibliotheks-Baustein: system/provider-geseedet (create-only\ngesynct, mit `platform.assistant.manage` änderbar und über `reset` zurückdrehbar) ODER user-angelegt\n(nutzer-eigen, teilbar über `visibility`).","properties":{"ulid":{"type":["string","null"]},"skillKey":{"type":["string","null"]},"type":{"enum":["skill","prompt"],"default":"prompt","type":"string"},"name":{"maxLength":150,"default":"","type":"string"},"body":{"default":"","type":"string"},"allowedTools":{"type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"},"providerKey":{"type":["string","null"]},"mine":{"default":false,"type":"boolean"},"editable":{"description":"Darf der aufrufende Nutzer diese Zeile ändern? Eigene Bausteine immer; mitgelieferte\n(`providerKey`, ownerId=NULL) mit `platform.assistant.manage`; fremde nie.","default":false,"type":"boolean"},"customized":{"description":"Mitgelieferter Baustein mit eigener Änderung — Voraussetzung für das Zurücksetzen.","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name","body"]},"AssistantSkill-assistant_skill.write":{"type":"object","description":"AI-Workspace-Skill/-Prompt (Doc 30 W6). Bibliotheks-Baustein: system/provider-geseedet (create-only\ngesynct, mit `platform.assistant.manage` änderbar und über `reset` zurückdrehbar) ODER user-angelegt\n(nutzer-eigen, teilbar über `visibility`).","properties":{"type":{"enum":["skill","prompt"],"default":"prompt","type":"string"},"name":{"maxLength":150,"default":"","type":"string"},"body":{"default":"","type":"string"},"allowedTools":{"type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"}},"required":["name","body"]},"AssistantSkill-assistant_skill.write.jsonMergePatch":{"type":"object","description":"AI-Workspace-Skill/-Prompt (Doc 30 W6). Bibliotheks-Baustein: system/provider-geseedet (create-only\ngesynct, mit `platform.assistant.manage` änderbar und über `reset` zurückdrehbar) ODER user-angelegt\n(nutzer-eigen, teilbar über `visibility`).","properties":{"type":{"enum":["skill","prompt"],"default":"prompt","type":"string"},"name":{"maxLength":150,"default":"","type":"string"},"body":{"default":"","type":"string"},"allowedTools":{"type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"}}},"AssistantSkill.jsonld-assistant_skill.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"skillKey":{"type":["string","null"]},"type":{"enum":["skill","prompt"],"default":"prompt","type":"string"},"name":{"maxLength":150,"default":"","type":"string"},"body":{"default":"","type":"string"},"allowedTools":{"type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"},"providerKey":{"type":["string","null"]},"mine":{"default":false,"type":"boolean"},"editable":{"description":"Darf der aufrufende Nutzer diese Zeile ändern? Eigene Bausteine immer; mitgelieferte\n(`providerKey`, ownerId=NULL) mit `platform.assistant.manage`; fremde nie.","default":false,"type":"boolean"},"customized":{"description":"Mitgelieferter Baustein mit eigener Änderung — Voraussetzung für das Zurücksetzen.","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name","body"]}],"description":"AI-Workspace-Skill/-Prompt (Doc 30 W6). Bibliotheks-Baustein: system/provider-geseedet (create-only\ngesynct, mit `platform.assistant.manage` änderbar und über `reset` zurückdrehbar) ODER user-angelegt\n(nutzer-eigen, teilbar über `visibility`)."},"AssistantSpace-assistant_space.read":{"type":"object","description":"AI-Workspace-Space (Doc 30 W2). Nutzer-eigen; Sichtbarkeit über Provider/Processor-Ownership erzwungen\n(kein `platform.assistant.manage` — das ist Governance für Agenten/Skills, Stufe 4+).","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":150,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"},"entityClass":{"maxLength":255,"type":["string","null"]},"entityId":{"type":["integer","null"]},"icon":{"maxLength":50,"type":["string","null"]},"color":{"maxLength":20,"type":["string","null"]},"mine":{"description":"True, wenn der aktuelle Nutzer Eigentümer ist.","default":false,"type":"boolean"},"defaultAgentUlid":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"AssistantSpace-assistant_space.write":{"type":"object","description":"AI-Workspace-Space (Doc 30 W2). Nutzer-eigen; Sichtbarkeit über Provider/Processor-Ownership erzwungen\n(kein `platform.assistant.manage` — das ist Governance für Agenten/Skills, Stufe 4+).","required":["name"],"properties":{"name":{"maxLength":150,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"},"entityClass":{"maxLength":255,"type":["string","null"]},"entityId":{"type":["integer","null"]},"icon":{"maxLength":50,"type":["string","null"]},"color":{"maxLength":20,"type":["string","null"]}}},"AssistantSpace-assistant_space.write.jsonMergePatch":{"type":"object","description":"AI-Workspace-Space (Doc 30 W2). Nutzer-eigen; Sichtbarkeit über Provider/Processor-Ownership erzwungen\n(kein `platform.assistant.manage` — das ist Governance für Agenten/Skills, Stufe 4+).","properties":{"name":{"maxLength":150,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"},"entityClass":{"maxLength":255,"type":["string","null"]},"entityId":{"type":["integer","null"]},"icon":{"maxLength":50,"type":["string","null"]},"color":{"maxLength":20,"type":["string","null"]}}},"AssistantSpace.jsonld-assistant_space.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":150,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"visibility":{"enum":["private","team","brand"],"default":"private","type":"string"},"entityClass":{"maxLength":255,"type":["string","null"]},"entityId":{"type":["integer","null"]},"icon":{"maxLength":50,"type":["string","null"]},"color":{"maxLength":20,"type":["string","null"]},"mine":{"description":"True, wenn der aktuelle Nutzer Eigentümer ist.","default":false,"type":"boolean"},"defaultAgentUlid":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}],"description":"AI-Workspace-Space (Doc 30 W2). Nutzer-eigen; Sichtbarkeit über Provider/Processor-Ownership erzwungen\n(kein `platform.assistant.manage` — das ist Governance für Agenten/Skills, Stufe 4+)."},"AssistantThread-assistant_thread.read":{"type":"object","description":"AI-Workspace-Thread (Doc 30 W1). Strikt nutzer-eigen (IDOR-Schutz im Provider/Processor).\nItem-GET liefert den Verlauf (`messages`) mit (Gruppe assistant_thread:item).","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":255,"default":"","type":"string"},"spaceUlid":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"modelRoute":{"maxLength":100,"description":"Explizite Modell-/Route-Wahl; NULL = Auto-Select (Stufe 2).","type":["string","null"]},"messageCount":{"default":0,"type":"integer"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}}},"AssistantThread-assistant_thread.read_assistant_thread.item":{"type":"object","description":"AI-Workspace-Thread (Doc 30 W1). Strikt nutzer-eigen (IDOR-Schutz im Provider/Processor).\nItem-GET liefert den Verlauf (`messages`) mit (Gruppe assistant_thread:item).","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":255,"default":"","type":"string"},"spaceUlid":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"modelRoute":{"maxLength":100,"description":"Explizite Modell-/Route-Wahl; NULL = Auto-Select (Stufe 2).","type":["string","null"]},"messageCount":{"default":0,"type":"integer"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"messages":{"description":"Verlauf (nur Item-GET) — die JÜNGSTE Seite, chronologisch aufsteigend. Jede Zeile:\n{ulid, role, content, model, tokenCount, costCents, citations, createdAt}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"hasMoreMessages":{"description":"Ob vor {@see $messages} noch ältere Nachrichten liegen — der Client weiß damit, ob sich\nNachladen lohnt, ohne selbst gegen {@see $messageCount} rechnen zu müssen.","default":false,"type":"boolean"}}},"AssistantThread-assistant_thread.write":{"type":"object","description":"AI-Workspace-Thread (Doc 30 W1). Strikt nutzer-eigen (IDOR-Schutz im Provider/Processor).\nItem-GET liefert den Verlauf (`messages`) mit (Gruppe assistant_thread:item).","properties":{"title":{"maxLength":255,"default":"","type":"string"},"spaceUlid":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"modelRoute":{"maxLength":100,"description":"Explizite Modell-/Route-Wahl; NULL = Auto-Select (Stufe 2).","type":["string","null"]}}},"AssistantThread-assistant_thread.write.jsonMergePatch":{"type":"object","description":"AI-Workspace-Thread (Doc 30 W1). Strikt nutzer-eigen (IDOR-Schutz im Provider/Processor).\nItem-GET liefert den Verlauf (`messages`) mit (Gruppe assistant_thread:item).","properties":{"title":{"maxLength":255,"default":"","type":"string"},"spaceUlid":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"modelRoute":{"maxLength":100,"description":"Explizite Modell-/Route-Wahl; NULL = Auto-Select (Stufe 2).","type":["string","null"]}}},"AssistantThread.jsonld-assistant_thread.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":255,"default":"","type":"string"},"spaceUlid":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"modelRoute":{"maxLength":100,"description":"Explizite Modell-/Route-Wahl; NULL = Auto-Select (Stufe 2).","type":["string","null"]},"messageCount":{"default":0,"type":"integer"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}],"description":"AI-Workspace-Thread (Doc 30 W1). Strikt nutzer-eigen (IDOR-Schutz im Provider/Processor).\nItem-GET liefert den Verlauf (`messages`) mit (Gruppe assistant_thread:item)."},"AssistantThread.jsonld-assistant_thread.read_assistant_thread.item":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":255,"default":"","type":"string"},"spaceUlid":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"modelRoute":{"maxLength":100,"description":"Explizite Modell-/Route-Wahl; NULL = Auto-Select (Stufe 2).","type":["string","null"]},"messageCount":{"default":0,"type":"integer"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"messages":{"description":"Verlauf (nur Item-GET) — die JÜNGSTE Seite, chronologisch aufsteigend. Jede Zeile:\n{ulid, role, content, model, tokenCount, costCents, citations, createdAt}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"hasMoreMessages":{"description":"Ob vor {@see $messages} noch ältere Nachrichten liegen — der Client weiß damit, ob sich\nNachladen lohnt, ohne selbst gegen {@see $messageCount} rechnen zu müssen.","default":false,"type":"boolean"}}}],"description":"AI-Workspace-Thread (Doc 30 W1). Strikt nutzer-eigen (IDOR-Schutz im Provider/Processor).\nItem-GET liefert den Verlauf (`messages`) mit (Gruppe assistant_thread:item)."},"AssistantTool-assistant_tool.read":{"type":"object","description":"Verfügbares Agenten-Werkzeug (Doc 30 W5/W7): read-only Katalog der kuratierten MCP-Commands für den\nAgent-Builder (Whitelist-Auswahl). `key` = Werkzeug-Schlüssel; `mode` = read/write.","properties":{"key":{"default":"","type":"string"},"mode":{"default":"read","type":"string"},"description":{"default":"","type":"string"},"args":{"default":"","type":"string"}}},"AssistantTool.jsonld-assistant_tool.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"default":"","type":"string"},"mode":{"default":"read","type":"string"},"description":{"default":"","type":"string"},"args":{"default":"","type":"string"}}}],"description":"Verfügbares Agenten-Werkzeug (Doc 30 W5/W7): read-only Katalog der kuratierten MCP-Commands für den\nAgent-Builder (Whitelist-Auswahl). `key` = Werkzeug-Schlüssel; `mode` = read/write."},"AssistantUsage-assistant_usage.read":{"type":"object","description":"Nutzungs-/Kontingent-Ansicht (Doc 30 W10). Read-only: KI-Verbrauch (heute/Monat, global + eigener)\ngegen die Budget-Limits `ai.budget.*`. Aus den vorhandenen Audit-Kosten (kein zweiter Zählpfad).","properties":{"id":{"default":"usage","type":["string","null"]},"dailyCents":{"default":0,"type":"integer"},"monthlyCents":{"default":0,"type":"integer"},"dailyLimitCents":{"type":["integer","null"]},"monthlyLimitCents":{"type":["integer","null"]},"myDailyCents":{"default":0,"type":"integer"},"myMonthlyCents":{"default":0,"type":"integer"}}},"AssistantUsage.jsonld-assistant_usage.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"default":"usage","type":["string","null"]},"dailyCents":{"default":0,"type":"integer"},"monthlyCents":{"default":0,"type":"integer"},"dailyLimitCents":{"type":["integer","null"]},"monthlyLimitCents":{"type":["integer","null"]},"myDailyCents":{"default":0,"type":"integer"},"myMonthlyCents":{"default":0,"type":"integer"}}}],"description":"Nutzungs-/Kontingent-Ansicht (Doc 30 W10). Read-only: KI-Verbrauch (heute/Monat, global + eigener)\ngegen die Budget-Limits `ai.budget.*`. Aus den vorhandenen Audit-Kosten (kein zweiter Zählpfad)."},"AuditLogEntry-audit_log.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"entityClass":{"type":["string","null"]},"entityId":{"type":["string","null"]},"action":{"type":["string","null"]},"actorType":{"type":["string","null"]},"actorId":{"type":["string","null"]},"requestId":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}},"AuditLogEntry-audit_log.read_audit_log.item":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"entityClass":{"type":["string","null"]},"entityId":{"type":["string","null"]},"action":{"type":["string","null"]},"actorType":{"type":["string","null"]},"actorId":{"type":["string","null"]},"requestId":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"before":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"after":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"AuditLogEntry.jsonld-audit_log.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"entityClass":{"type":["string","null"]},"entityId":{"type":["string","null"]},"action":{"type":["string","null"]},"actorType":{"type":["string","null"]},"actorId":{"type":["string","null"]},"requestId":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}}]},"AuditLogEntry.jsonld-audit_log.read_audit_log.item":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"entityClass":{"type":["string","null"]},"entityId":{"type":["string","null"]},"action":{"type":["string","null"]},"actorType":{"type":["string","null"]},"actorId":{"type":["string","null"]},"requestId":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"before":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"after":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}]},"AutomationCatalog-automation_catalog.read":{"type":"object","description":"Read-only Katalog des Automation-Authorings (P-3): welche Trigger-Schlüssel\n({@see \\App\\Platform\\Automation\\Engine\\TriggerCatalogProviderInterface}), Action-Typen\n({@see \\App\\Platform\\Automation\\Action\\AutomationActionInterface}) und Bedingungs-Operatoren\n({@see \\App\\Platform\\Automation\\Engine\\ConditionOperatorInterface}) aktuell wählbar sind —\naggregiert aus getaggten Providern (Core + aktive Plugins), plus KI-Use-Case-Vorschläge für\n`run_ai` ({@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}).\n\nMacht Authoring-Dropdowns backend-getrieben: Plugin-Trigger/-Actions erscheinen ohne Core-Edit,\ndeaktivierte Plugins verschwinden. Labels liefert NICHT das Backend — SPA übersetzt per\nKonvention `automation.<trigger|action|aiUseCase>.<lowerCamelCase(key)>` (unbekannte Schlüssel\nzeigen Roh-Key). Wertebereich für API-/MCP-Clients discoverbar (P-1/P-2).","properties":{"id":{"description":"Singleton-Pseudo-Identifier (es gibt genau eine Katalog-Zeile).","default":"default","type":"string"},"triggers":{"description":"Wählbare `triggerEvent`-Schlüssel (Core + aktive Plugins), sortiert.","type":"array","items":{"type":"string"}},"actions":{"description":"Ausführbare `actionType`-Schlüssel (Core + aktive Plugins), aufsteigend sortiert.","type":"array","items":{"type":"string"}},"operators":{"description":"Bedingungs-Operatoren (Core + aktive Plugins), aufsteigend sortiert.","type":"array","items":{"type":"string"}},"aiUseCases":{"description":"KI-Use-Case-Vorschläge für `run_ai` (Katalog-Reihenfolge, `automation.run_ai` zuerst —\nCore-Katalog {@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}, ungefiltert).","type":"array","items":{"type":"string"}},"relativeAnchors":{"description":"Wählbare Relativ-Trigger-Anker (W4, Programm 28 §4 — `relativeConfig.anchorKey`), aggregiert\naus {@see \\App\\Platform\\Automation\\Contract\\RelativeTriggerAnchorProviderInterface}-Anbietern\n(Core + aktive Plugins), sortiert nach `key`. `fields`: Kontext-Schlüssel je Kandidat\n({{…}}-Platzhalter-Angebot).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]}}},"triggerFields":{"description":"Je Trigger-Schlüssel die verfügbaren Feld-Namen (Programm 21, AP 5.6/DIII-5) — Datengrundlage\nfür Bedingungs-Feld-Dropdown und `{{ … }}`-Platzhalter-Picker. Reflektiv aus der Event-Klasse\nerhoben ({@see \\App\\Platform\\Automation\\Engine\\AutomationTriggerFieldCatalog}).","type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}},"templates":{"description":"Vorlagen-Galerie (Doc 26 0.2): vorgefertigte Automation-Blaupausen, enablement-gefiltert\n({@see \\App\\Platform\\Automation\\Catalog\\AutomationTemplateResolver}). „Aus Vorlage anlegen\"\nvia `POST /v1/automations/from-template`. Labels übersetzt die SPA\n(`automation.templates.<key>.title|summary`); Roh-Key bei unbekanntem Schlüssel.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"AutomationCatalog.jsonld-automation_catalog.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Singleton-Pseudo-Identifier (es gibt genau eine Katalog-Zeile).","default":"default","type":"string"},"triggers":{"description":"Wählbare `triggerEvent`-Schlüssel (Core + aktive Plugins), sortiert.","type":"array","items":{"type":"string"}},"actions":{"description":"Ausführbare `actionType`-Schlüssel (Core + aktive Plugins), aufsteigend sortiert.","type":"array","items":{"type":"string"}},"operators":{"description":"Bedingungs-Operatoren (Core + aktive Plugins), aufsteigend sortiert.","type":"array","items":{"type":"string"}},"aiUseCases":{"description":"KI-Use-Case-Vorschläge für `run_ai` (Katalog-Reihenfolge, `automation.run_ai` zuerst —\nCore-Katalog {@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}, ungefiltert).","type":"array","items":{"type":"string"}},"relativeAnchors":{"description":"Wählbare Relativ-Trigger-Anker (W4, Programm 28 §4 — `relativeConfig.anchorKey`), aggregiert\naus {@see \\App\\Platform\\Automation\\Contract\\RelativeTriggerAnchorProviderInterface}-Anbietern\n(Core + aktive Plugins), sortiert nach `key`. `fields`: Kontext-Schlüssel je Kandidat\n({{…}}-Platzhalter-Angebot).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]}}},"triggerFields":{"description":"Je Trigger-Schlüssel die verfügbaren Feld-Namen (Programm 21, AP 5.6/DIII-5) — Datengrundlage\nfür Bedingungs-Feld-Dropdown und `{{ … }}`-Platzhalter-Picker. Reflektiv aus der Event-Klasse\nerhoben ({@see \\App\\Platform\\Automation\\Engine\\AutomationTriggerFieldCatalog}).","type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}},"templates":{"description":"Vorlagen-Galerie (Doc 26 0.2): vorgefertigte Automation-Blaupausen, enablement-gefiltert\n({@see \\App\\Platform\\Automation\\Catalog\\AutomationTemplateResolver}). „Aus Vorlage anlegen\"\nvia `POST /v1/automations/from-template`. Labels übersetzt die SPA\n(`automation.templates.<key>.title|summary`); Roh-Key bei unbekanntem Schlüssel.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Read-only Katalog des Automation-Authorings (P-3): welche Trigger-Schlüssel\n({@see \\App\\Platform\\Automation\\Engine\\TriggerCatalogProviderInterface}), Action-Typen\n({@see \\App\\Platform\\Automation\\Action\\AutomationActionInterface}) und Bedingungs-Operatoren\n({@see \\App\\Platform\\Automation\\Engine\\ConditionOperatorInterface}) aktuell wählbar sind —\naggregiert aus getaggten Providern (Core + aktive Plugins), plus KI-Use-Case-Vorschläge für\n`run_ai` ({@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}).\n\nMacht Authoring-Dropdowns backend-getrieben: Plugin-Trigger/-Actions erscheinen ohne Core-Edit,\ndeaktivierte Plugins verschwinden. Labels liefert NICHT das Backend — SPA übersetzt per\nKonvention `automation.<trigger|action|aiUseCase>.<lowerCamelCase(key)>` (unbekannte Schlüssel\nzeigen Roh-Key). Wertebereich für API-/MCP-Clients discoverbar (P-1/P-2)."},"AutomationResource-automation.read":{"type":"object","description":"Authoring-Ressource der Automation-Engine (P-1/P-3): CRUD inkl. Trigger-Konfiguration\n(triggerEvent), Bedingungs-Baum (conditions), geordneter Schritte (steps).\n\nMarken-Scope (IDOR): subjektlose Katalog-Gates (read/manage) sichern Collection + Create; die\nobjektbezogene, marken-scoped Prüfung erfolgt im State-Layer gegen die geladene Entität —\nmit `hasPermission($user, PERM, $brandId)` ({@see \\App\\Platform\\Automation\\Security\\AutomationPermissions}),\nbewusst NICHT mit `isGranted()`: die affirmative Strategie ließe den BrandScopeVoter ein DENY übersteuern.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"description":{"maxLength":65535,"type":["string","null"]},"triggerEvent":{"maxLength":255,"description":"Trigger-Event-Klasse oder -Kurzname, z.B. WorkItemCreated — Pflicht bei triggerType=event,\nunzulässig bei cron/relative/manual (Prüfung in {@see AutomationProcessor}).","type":["string","null"]},"triggerType":{"enum":["event","cron","relative","manual"],"description":"Trigger-Art event|cron|relative|manual (W1/W8, Programm 28 §4).","default":"event","type":"string"},"cronExpression":{"maxLength":100,"description":"Cron-Ausdruck (5 Felder, Europe/Berlin) — nur bei triggerType=cron; minütlich ausgewertet vom\nZeit-Scanner ({@see \\App\\Platform\\Automation\\MessageHandler\\AutomationTimeScanHandler}, W4).","type":["string","null"]},"relativeConfig":{"description":"Relativ-Trigger-Konfiguration {anchorKey, offsetMinutes, direction: before|after} — nur bei\ntriggerType=relative; Anker-Katalog via `GET /v1/automation-catalog` (`relativeAnchors`),\nausgewertet vom Zeit-Scanner (W4).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"trigger":{"description":"Read-only Alias von triggerEvent (Kompatibilität mit der SPA-Liste).","type":["string","null"]},"origin":{"description":"Herkunft system|plugin|user (read-only). origin=system|plugin ⇒ strukturell read-only\n(nur `active` änderbar); Struktur-Anpassung via `POST /v1/automations/{ulid}/duplicate` (W8).","default":"user","type":"string"},"ownerPluginKey":{"description":"Besitzendes Plugin (read-only; nur origin=plugin, z. B. octi.scheduling).","type":["string","null"]},"automationKey":{"description":"Stabiler Seed-Schlüssel einer Standard-Automation (read-only) — Idempotenz-Anker des\nSeeding-Syncs ({@see \\App\\Platform\\Plugin\\Contract\\AutomationProviderInterface}, W3).","type":["string","null"]},"category":{"maxLength":50,"description":"Fachliche Kategorie für die UI-Gruppierung (W8).","type":["string","null"]},"suspended":{"description":"Computed (read-only, {@see \\App\\Platform\\Automation\\Engine\\AutomationAvailabilityGuard}):\ntrue bei Nutzung von Trigger/Actions deaktivierter Plugins — bleibt sichtbar, wird aber\nNICHT ausgeführt (\"Pausiert\"-Badge, ENT-KON-04).","default":false,"type":"boolean"},"suspendedReasons":{"description":"Computed (read-only): i18n-fähige Gründe der Suspendierung (leer, wenn nicht suspendiert).","type":"array","items":{"type":"string"}},"conditions":{"description":"Bedingungs-Baum (UND/ODER), siehe ConditionEvaluator.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/AutomationStepResource-automation.read"}},"active":{"default":true,"type":"boolean"},"brandId":{"description":"Optionaler Marken-Scope der Automation (null = markenübergreifend).","type":["integer","null"]},"stepCount":{"default":0,"type":"integer"},"lastRunStatus":{"type":["string","null"]},"lastRunAt":{"type":["string","null"],"format":"date-time"},"aiCostCents30d":{"description":"KI-Kosten dieser Automation der letzten 30 Tage in Cent (Doc 41 B-13), aus dem KI-Audit\naggregiert (kein zweiter Zählpfad). 0 = kein Modellaufruf im Fenster.","default":0,"type":"integer"},"aiRunsUnconditionally":{"description":"Hinweis auf eine mögliche Kostenstufung (Doc 41 B-14): true, wenn die Automation einen\n`run_ai`-Schritt hat, DER MODELLAUFRUF ABER NICHT AN EINER BEDINGUNG HÄNGT — weder an einer\nTop-Level-Bedingung noch an einer Schritt-Bedingung oder Verzweigung davor. Genau dann läuft\ndas Modell bei jedem Tick mit, statt nur bei Treffer.","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"AutomationResource-automation.write":{"type":"object","description":"Authoring-Ressource der Automation-Engine (P-1/P-3): CRUD inkl. Trigger-Konfiguration\n(triggerEvent), Bedingungs-Baum (conditions), geordneter Schritte (steps).\n\nMarken-Scope (IDOR): subjektlose Katalog-Gates (read/manage) sichern Collection + Create; die\nobjektbezogene, marken-scoped Prüfung erfolgt im State-Layer gegen die geladene Entität —\nmit `hasPermission($user, PERM, $brandId)` ({@see \\App\\Platform\\Automation\\Security\\AutomationPermissions}),\nbewusst NICHT mit `isGranted()`: die affirmative Strategie ließe den BrandScopeVoter ein DENY übersteuern.","required":["name"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"description":{"maxLength":65535,"type":["string","null"]},"triggerEvent":{"maxLength":255,"description":"Trigger-Event-Klasse oder -Kurzname, z.B. WorkItemCreated — Pflicht bei triggerType=event,\nunzulässig bei cron/relative/manual (Prüfung in {@see AutomationProcessor}).","type":["string","null"]},"triggerType":{"enum":["event","cron","relative","manual"],"description":"Trigger-Art event|cron|relative|manual (W1/W8, Programm 28 §4).","default":"event","type":"string"},"cronExpression":{"maxLength":100,"description":"Cron-Ausdruck (5 Felder, Europe/Berlin) — nur bei triggerType=cron; minütlich ausgewertet vom\nZeit-Scanner ({@see \\App\\Platform\\Automation\\MessageHandler\\AutomationTimeScanHandler}, W4).","type":["string","null"]},"relativeConfig":{"description":"Relativ-Trigger-Konfiguration {anchorKey, offsetMinutes, direction: before|after} — nur bei\ntriggerType=relative; Anker-Katalog via `GET /v1/automation-catalog` (`relativeAnchors`),\nausgewertet vom Zeit-Scanner (W4).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"category":{"maxLength":50,"description":"Fachliche Kategorie für die UI-Gruppierung (W8).","type":["string","null"]},"conditions":{"description":"Bedingungs-Baum (UND/ODER), siehe ConditionEvaluator.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/AutomationStepResource-automation.write"}},"active":{"default":true,"type":"boolean"},"brandId":{"description":"Optionaler Marken-Scope der Automation (null = markenübergreifend).","type":["integer","null"]}}},"AutomationResource-automation.write.jsonMergePatch":{"type":"object","description":"Authoring-Ressource der Automation-Engine (P-1/P-3): CRUD inkl. Trigger-Konfiguration\n(triggerEvent), Bedingungs-Baum (conditions), geordneter Schritte (steps).\n\nMarken-Scope (IDOR): subjektlose Katalog-Gates (read/manage) sichern Collection + Create; die\nobjektbezogene, marken-scoped Prüfung erfolgt im State-Layer gegen die geladene Entität —\nmit `hasPermission($user, PERM, $brandId)` ({@see \\App\\Platform\\Automation\\Security\\AutomationPermissions}),\nbewusst NICHT mit `isGranted()`: die affirmative Strategie ließe den BrandScopeVoter ein DENY übersteuern.","properties":{"name":{"maxLength":255,"default":"","type":"string"},"description":{"maxLength":65535,"type":["string","null"]},"triggerEvent":{"maxLength":255,"description":"Trigger-Event-Klasse oder -Kurzname, z.B. WorkItemCreated — Pflicht bei triggerType=event,\nunzulässig bei cron/relative/manual (Prüfung in {@see AutomationProcessor}).","type":["string","null"]},"triggerType":{"enum":["event","cron","relative","manual"],"description":"Trigger-Art event|cron|relative|manual (W1/W8, Programm 28 §4).","default":"event","type":"string"},"cronExpression":{"maxLength":100,"description":"Cron-Ausdruck (5 Felder, Europe/Berlin) — nur bei triggerType=cron; minütlich ausgewertet vom\nZeit-Scanner ({@see \\App\\Platform\\Automation\\MessageHandler\\AutomationTimeScanHandler}, W4).","type":["string","null"]},"relativeConfig":{"description":"Relativ-Trigger-Konfiguration {anchorKey, offsetMinutes, direction: before|after} — nur bei\ntriggerType=relative; Anker-Katalog via `GET /v1/automation-catalog` (`relativeAnchors`),\nausgewertet vom Zeit-Scanner (W4).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"category":{"maxLength":50,"description":"Fachliche Kategorie für die UI-Gruppierung (W8).","type":["string","null"]},"conditions":{"description":"Bedingungs-Baum (UND/ODER), siehe ConditionEvaluator.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/AutomationStepResource-automation.write"}},"active":{"default":true,"type":"boolean"},"brandId":{"description":"Optionaler Marken-Scope der Automation (null = markenübergreifend).","type":["integer","null"]}}},"AutomationResource.AutomationFromTemplateInput-automation.write":{"type":"object","description":"Authoring-Ressource der Automation-Engine (P-1/P-3): CRUD inkl. Trigger-Konfiguration\n(triggerEvent), Bedingungs-Baum (conditions), geordneter Schritte (steps).\n\nMarken-Scope (IDOR): subjektlose Katalog-Gates (read/manage) sichern Collection + Create; die\nobjektbezogene, marken-scoped Prüfung erfolgt im State-Layer gegen die geladene Entität —\nmit `hasPermission($user, PERM, $brandId)` ({@see \\App\\Platform\\Automation\\Security\\AutomationPermissions}),\nbewusst NICHT mit `isGranted()`: die affirmative Strategie ließe den BrandScopeVoter ein DENY übersteuern.","required":["templateKey"],"properties":{"templateKey":{"maxLength":100,"description":"Schlüssel der Vorlage aus dem Katalog (`GET /v1/automation-catalog` → `templates[].key`).","default":"","type":"string"},"name":{"maxLength":255,"description":"Optionaler Name der neuen Automation (Default: aus dem Vorlagen-Schlüssel abgeleitet).","type":["string","null"]},"brandId":{"description":"Optionaler Marken-Scope (null = markenübergreifend; erfordert markenübergreifende Rechte).","type":["integer","null"]},"active":{"description":"Sofort aktivieren? Default false — die Automation startet deaktiviert, damit der Nutzer sie\nerst vervollständigt/prüft (Templates tragen Platzhalter-Konfiguration).","default":false,"type":"boolean"}}},"AutomationResource.jsonld-automation.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"description":{"maxLength":65535,"type":["string","null"]},"triggerEvent":{"maxLength":255,"description":"Trigger-Event-Klasse oder -Kurzname, z.B. WorkItemCreated — Pflicht bei triggerType=event,\nunzulässig bei cron/relative/manual (Prüfung in {@see AutomationProcessor}).","type":["string","null"]},"triggerType":{"enum":["event","cron","relative","manual"],"description":"Trigger-Art event|cron|relative|manual (W1/W8, Programm 28 §4).","default":"event","type":"string"},"cronExpression":{"maxLength":100,"description":"Cron-Ausdruck (5 Felder, Europe/Berlin) — nur bei triggerType=cron; minütlich ausgewertet vom\nZeit-Scanner ({@see \\App\\Platform\\Automation\\MessageHandler\\AutomationTimeScanHandler}, W4).","type":["string","null"]},"relativeConfig":{"description":"Relativ-Trigger-Konfiguration {anchorKey, offsetMinutes, direction: before|after} — nur bei\ntriggerType=relative; Anker-Katalog via `GET /v1/automation-catalog` (`relativeAnchors`),\nausgewertet vom Zeit-Scanner (W4).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"trigger":{"description":"Read-only Alias von triggerEvent (Kompatibilität mit der SPA-Liste).","type":["string","null"]},"origin":{"description":"Herkunft system|plugin|user (read-only). origin=system|plugin ⇒ strukturell read-only\n(nur `active` änderbar); Struktur-Anpassung via `POST /v1/automations/{ulid}/duplicate` (W8).","default":"user","type":"string"},"ownerPluginKey":{"description":"Besitzendes Plugin (read-only; nur origin=plugin, z. B. octi.scheduling).","type":["string","null"]},"automationKey":{"description":"Stabiler Seed-Schlüssel einer Standard-Automation (read-only) — Idempotenz-Anker des\nSeeding-Syncs ({@see \\App\\Platform\\Plugin\\Contract\\AutomationProviderInterface}, W3).","type":["string","null"]},"category":{"maxLength":50,"description":"Fachliche Kategorie für die UI-Gruppierung (W8).","type":["string","null"]},"suspended":{"description":"Computed (read-only, {@see \\App\\Platform\\Automation\\Engine\\AutomationAvailabilityGuard}):\ntrue bei Nutzung von Trigger/Actions deaktivierter Plugins — bleibt sichtbar, wird aber\nNICHT ausgeführt (\"Pausiert\"-Badge, ENT-KON-04).","default":false,"type":"boolean"},"suspendedReasons":{"description":"Computed (read-only): i18n-fähige Gründe der Suspendierung (leer, wenn nicht suspendiert).","type":"array","items":{"type":"string"}},"conditions":{"description":"Bedingungs-Baum (UND/ODER), siehe ConditionEvaluator.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/AutomationStepResource.jsonld-automation.read"}},"active":{"default":true,"type":"boolean"},"brandId":{"description":"Optionaler Marken-Scope der Automation (null = markenübergreifend).","type":["integer","null"]},"stepCount":{"default":0,"type":"integer"},"lastRunStatus":{"type":["string","null"]},"lastRunAt":{"type":["string","null"],"format":"date-time"},"aiCostCents30d":{"description":"KI-Kosten dieser Automation der letzten 30 Tage in Cent (Doc 41 B-13), aus dem KI-Audit\naggregiert (kein zweiter Zählpfad). 0 = kein Modellaufruf im Fenster.","default":0,"type":"integer"},"aiRunsUnconditionally":{"description":"Hinweis auf eine mögliche Kostenstufung (Doc 41 B-14): true, wenn die Automation einen\n`run_ai`-Schritt hat, DER MODELLAUFRUF ABER NICHT AN EINER BEDINGUNG HÄNGT — weder an einer\nTop-Level-Bedingung noch an einer Schritt-Bedingung oder Verzweigung davor. Genau dann läuft\ndas Modell bei jedem Tick mit, statt nur bei Treffer.","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}],"description":"Authoring-Ressource der Automation-Engine (P-1/P-3): CRUD inkl. Trigger-Konfiguration\n(triggerEvent), Bedingungs-Baum (conditions), geordneter Schritte (steps).\n\nMarken-Scope (IDOR): subjektlose Katalog-Gates (read/manage) sichern Collection + Create; die\nobjektbezogene, marken-scoped Prüfung erfolgt im State-Layer gegen die geladene Entität —\nmit `hasPermission($user, PERM, $brandId)` ({@see \\App\\Platform\\Automation\\Security\\AutomationPermissions}),\nbewusst NICHT mit `isGranted()`: die affirmative Strategie ließe den BrandScopeVoter ein DENY übersteuern."},"AutomationRun-automation_run.read":{"type":"object","description":"LAUF-EINSICHT einer Automation (Doc 41 B-04): Status, Trigger, Kosten und das Schritt-Protokoll.\n\nDER BEFUND: `AutomationRun` führt seit jeher ein `log`-Array mit jedem Schritt und seinem Ergebnis\n— abrufbar war es über keine Ressource. Wer wissen wollte, warum ein Lauf scheiterte, brauchte\nDB-Zugriff.\n\nMarken-Schnitt hängt am RECHT `automation.read`, nicht an der bloßen Mitgliedschaft (R28-SEC-01).","properties":{"ulid":{"type":["string","null"]},"automationUlid":{"type":["string","null"]},"automationName":{"type":["string","null"]},"status":{"default":"","type":"string"},"isDryRun":{"default":false,"type":"boolean"},"triggerEventClass":{"type":["string","null"]},"triggerEntityClass":{"type":["string","null"]},"triggerEntityId":{"type":["string","null"]},"errorMessage":{"description":"Fehlergrund als stabiler SCHLUESSEL, nicht als fertiger Satz: `code` bzw. `code:detail` (z.B. `workerAbort`, `sendEmail.noSubject`, `ticketTriage.unknownStatus:kaputt`). Geschrieben wird im Hintergrund-Lauf ohne Leser und damit ohne Sprache — der Satz entsteht erst beim Lesen (SPA: `automation.runError.<code>` bzw. `automation.actionError.<code>`). Bestandszeilen tragen weiter deutschen Klartext und werden unveraendert durchgereicht.","type":["string","null"]},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"durationMs":{"type":["integer","null"]},"aiCostCents":{"description":"KI-Kosten dieses Laufs in Cent (Doc 41 B-13); 0 = kein Modellaufruf.","default":0,"type":"integer"},"aiTokens":{"description":"Verbrauchte Modell-Tokens dieses Laufs (Doc 41 B-13).","default":0,"type":"integer"}}},"AutomationRun-automation_run.read_automation_run.item":{"type":"object","description":"LAUF-EINSICHT einer Automation (Doc 41 B-04): Status, Trigger, Kosten und das Schritt-Protokoll.\n\nDER BEFUND: `AutomationRun` führt seit jeher ein `log`-Array mit jedem Schritt und seinem Ergebnis\n— abrufbar war es über keine Ressource. Wer wissen wollte, warum ein Lauf scheiterte, brauchte\nDB-Zugriff.\n\nMarken-Schnitt hängt am RECHT `automation.read`, nicht an der bloßen Mitgliedschaft (R28-SEC-01).","properties":{"ulid":{"type":["string","null"]},"automationUlid":{"type":["string","null"]},"automationName":{"type":["string","null"]},"status":{"default":"","type":"string"},"isDryRun":{"default":false,"type":"boolean"},"triggerEventClass":{"type":["string","null"]},"triggerEntityClass":{"type":["string","null"]},"triggerEntityId":{"type":["string","null"]},"errorMessage":{"description":"Fehlergrund als stabiler SCHLUESSEL, nicht als fertiger Satz: `code` bzw. `code:detail` (z.B. `workerAbort`, `sendEmail.noSubject`, `ticketTriage.unknownStatus:kaputt`). Geschrieben wird im Hintergrund-Lauf ohne Leser und damit ohne Sprache — der Satz entsteht erst beim Lesen (SPA: `automation.runError.<code>` bzw. `automation.actionError.<code>`). Bestandszeilen tragen weiter deutschen Klartext und werden unveraendert durchgereicht.","type":["string","null"]},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"durationMs":{"type":["integer","null"]},"aiCostCents":{"description":"KI-Kosten dieses Laufs in Cent (Doc 41 B-13); 0 = kein Modellaufruf.","default":0,"type":"integer"},"aiTokens":{"description":"Verbrauchte Modell-Tokens dieses Laufs (Doc 41 B-13).","default":0,"type":"integer"},"log":{"description":"Schritt-Protokoll des Laufs. Diagnose fuer Betrieb und Fehlersuche, kein Oberflaechen-Text: die Meldungen stehen in der Systemsprache und werden nicht uebersetzt.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"triggerPayload":{"description":"Feld-Map des Auslösers (bereits auf Skalare reduziert).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"AutomationRun.jsonld-automation_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"automationUlid":{"type":["string","null"]},"automationName":{"type":["string","null"]},"status":{"default":"","type":"string"},"isDryRun":{"default":false,"type":"boolean"},"triggerEventClass":{"type":["string","null"]},"triggerEntityClass":{"type":["string","null"]},"triggerEntityId":{"type":["string","null"]},"errorMessage":{"description":"Fehlergrund als stabiler SCHLUESSEL, nicht als fertiger Satz: `code` bzw. `code:detail` (z.B. `workerAbort`, `sendEmail.noSubject`, `ticketTriage.unknownStatus:kaputt`). Geschrieben wird im Hintergrund-Lauf ohne Leser und damit ohne Sprache — der Satz entsteht erst beim Lesen (SPA: `automation.runError.<code>` bzw. `automation.actionError.<code>`). Bestandszeilen tragen weiter deutschen Klartext und werden unveraendert durchgereicht.","type":["string","null"]},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"durationMs":{"type":["integer","null"]},"aiCostCents":{"description":"KI-Kosten dieses Laufs in Cent (Doc 41 B-13); 0 = kein Modellaufruf.","default":0,"type":"integer"},"aiTokens":{"description":"Verbrauchte Modell-Tokens dieses Laufs (Doc 41 B-13).","default":0,"type":"integer"}}}],"description":"LAUF-EINSICHT einer Automation (Doc 41 B-04): Status, Trigger, Kosten und das Schritt-Protokoll.\n\nDER BEFUND: `AutomationRun` führt seit jeher ein `log`-Array mit jedem Schritt und seinem Ergebnis\n— abrufbar war es über keine Ressource. Wer wissen wollte, warum ein Lauf scheiterte, brauchte\nDB-Zugriff.\n\nMarken-Schnitt hängt am RECHT `automation.read`, nicht an der bloßen Mitgliedschaft (R28-SEC-01)."},"AutomationRun.jsonld-automation_run.read_automation_run.item":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"automationUlid":{"type":["string","null"]},"automationName":{"type":["string","null"]},"status":{"default":"","type":"string"},"isDryRun":{"default":false,"type":"boolean"},"triggerEventClass":{"type":["string","null"]},"triggerEntityClass":{"type":["string","null"]},"triggerEntityId":{"type":["string","null"]},"errorMessage":{"description":"Fehlergrund als stabiler SCHLUESSEL, nicht als fertiger Satz: `code` bzw. `code:detail` (z.B. `workerAbort`, `sendEmail.noSubject`, `ticketTriage.unknownStatus:kaputt`). Geschrieben wird im Hintergrund-Lauf ohne Leser und damit ohne Sprache — der Satz entsteht erst beim Lesen (SPA: `automation.runError.<code>` bzw. `automation.actionError.<code>`). Bestandszeilen tragen weiter deutschen Klartext und werden unveraendert durchgereicht.","type":["string","null"]},"startedAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"durationMs":{"type":["integer","null"]},"aiCostCents":{"description":"KI-Kosten dieses Laufs in Cent (Doc 41 B-13); 0 = kein Modellaufruf.","default":0,"type":"integer"},"aiTokens":{"description":"Verbrauchte Modell-Tokens dieses Laufs (Doc 41 B-13).","default":0,"type":"integer"},"log":{"description":"Schritt-Protokoll des Laufs. Diagnose fuer Betrieb und Fehlersuche, kein Oberflaechen-Text: die Meldungen stehen in der Systemsprache und werden nicht uebersetzt.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"triggerPayload":{"description":"Feld-Map des Auslösers (bereits auf Skalare reduziert).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"LAUF-EINSICHT einer Automation (Doc 41 B-04): Status, Trigger, Kosten und das Schritt-Protokoll.\n\nDER BEFUND: `AutomationRun` führt seit jeher ein `log`-Array mit jedem Schritt und seinem Ergebnis\n— abrufbar war es über keine Ressource. Wer wissen wollte, warum ein Lauf scheiterte, brauchte\nDB-Zugriff.\n\nMarken-Schnitt hängt am RECHT `automation.read`, nicht an der bloßen Mitgliedschaft (R28-SEC-01)."},"AutomationStepResource-automation.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["action","branch","wait"],"description":"action | branch | wait","default":"action","type":"string"},"actionType":{"maxLength":100,"description":"z.B. create_notification, create_task, send_email, set_field, call_webhook","type":["string","null"]},"position":{"minimum":0,"default":0,"type":"integer"},"config":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"branchConditions":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"stepCondition":{"description":"Schritt-Bedingung (W5a, Programm 28 §4) auf action-Schritten: Core-Bedingungs-Baum\n(ConditionEvaluator-Format wie `conditions`) — nicht erfüllt ⇒ nur dieser Schritt wird\nübersprungen (anders als branch, das kurzschließt).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"AutomationStepResource-automation.write":{"type":"object","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["action","branch","wait"],"description":"action | branch | wait","default":"action","type":"string"},"actionType":{"maxLength":100,"description":"z.B. create_notification, create_task, send_email, set_field, call_webhook","type":["string","null"]},"position":{"minimum":0,"default":0,"type":"integer"},"config":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"branchConditions":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"stepCondition":{"description":"Schritt-Bedingung (W5a, Programm 28 §4) auf action-Schritten: Core-Bedingungs-Baum\n(ConditionEvaluator-Format wie `conditions`) — nicht erfüllt ⇒ nur dieser Schritt wird\nübersprungen (anders als branch, das kurzschließt).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"AutomationStepResource.jsonld-automation.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["action","branch","wait"],"description":"action | branch | wait","default":"action","type":"string"},"actionType":{"maxLength":100,"description":"z.B. create_notification, create_task, send_email, set_field, call_webhook","type":["string","null"]},"position":{"minimum":0,"default":0,"type":"integer"},"config":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"branchConditions":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"stepCondition":{"description":"Schritt-Bedingung (W5a, Programm 28 §4) auf action-Schritten: Core-Bedingungs-Baum\n(ConditionEvaluator-Format wie `conditions`) — nicht erfüllt ⇒ nur dieser Schritt wird\nübersprungen (anders als branch, das kurzschließt).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"AutomationTestResult-automation_test.read":{"type":"object","description":"Ergebnis eines synchronen Automation-Testlaufs (Programm 21, AP 5.6/DIII-5): führt die Automation\nsofort als Dry-Run aus (keine Seiteneffekte) und liefert das Schritt-Protokoll direkt zurück —\nstatt wie `/run` nur asynchron einzuplanen. Optional `sampleFields` für realistische Bedingungen/\nPlatzhalter. Immer Dry-Run — schreibt nie fachliche Daten.","properties":{"ulid":{"default":"","type":"string"},"status":{"description":"Endstatus des Laufs (completed|skipped|failed).","default":"","type":"string"},"log":{"description":"Schritt-Protokoll (Zeitstempel + Meldung je Zeile).","type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"errorMessage":{"description":"Fehlergrund als stabiler SCHLUESSEL, nicht als fertiger Satz: `code` bzw. `code:detail` (z.B. `workerAbort`, `sendEmail.noSubject`, `ticketTriage.unknownStatus:kaputt`). Geschrieben wird im Hintergrund-Lauf ohne Leser und damit ohne Sprache — der Satz entsteht erst beim Lesen (SPA: `automation.runError.<code>` bzw. `automation.actionError.<code>`). Bestandszeilen tragen weiter deutschen Klartext und werden unveraendert durchgereicht.","type":["string","null"]},"dryRun":{"default":true,"type":"boolean"},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"stepCount":{"default":0,"type":"integer"}}},"AutomationTestResult-automation_test.write":{"type":"object","description":"Ergebnis eines synchronen Automation-Testlaufs (Programm 21, AP 5.6/DIII-5): führt die Automation\nsofort als Dry-Run aus (keine Seiteneffekte) und liefert das Schritt-Protokoll direkt zurück —\nstatt wie `/run` nur asynchron einzuplanen. Optional `sampleFields` für realistische Bedingungen/\nPlatzhalter. Immer Dry-Run — schreibt nie fachliche Daten.","properties":{"sampleFields":{"description":"Optionale Beispiel-Feld-Map, um Bedingungen/Platzhalter realistisch zu testen (skalare Werte).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"AutomationTestResult.jsonld-automation_test.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"default":"","type":"string"},"status":{"description":"Endstatus des Laufs (completed|skipped|failed).","default":"","type":"string"},"log":{"description":"Schritt-Protokoll (Zeitstempel + Meldung je Zeile).","type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"errorMessage":{"description":"Fehlergrund als stabiler SCHLUESSEL, nicht als fertiger Satz: `code` bzw. `code:detail` (z.B. `workerAbort`, `sendEmail.noSubject`, `ticketTriage.unknownStatus:kaputt`). Geschrieben wird im Hintergrund-Lauf ohne Leser und damit ohne Sprache — der Satz entsteht erst beim Lesen (SPA: `automation.runError.<code>` bzw. `automation.actionError.<code>`). Bestandszeilen tragen weiter deutschen Klartext und werden unveraendert durchgereicht.","type":["string","null"]},"dryRun":{"default":true,"type":"boolean"},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"stepCount":{"default":0,"type":"integer"}}}],"description":"Ergebnis eines synchronen Automation-Testlaufs (Programm 21, AP 5.6/DIII-5): führt die Automation\nsofort als Dry-Run aus (keine Seiteneffekte) und liefert das Schritt-Protokoll direkt zurück —\nstatt wie `/run` nur asynchron einzuplanen. Optional `sampleFields` für realistische Bedingungen/\nPlatzhalter. Immer Dry-Run — schreibt nie fachliche Daten."},"BatchSerialBatch-batch.read":{"type":"object","description":"Chargen (Doc 25 AP 2.1, G1) — der Rückverfolgungs-Anker.\n\n**Bewusst kein POST auf die Charge selbst:** eine Charge entsteht durch einen Wareneingang,\nnicht durch einen Verwaltungsakt. Wer sie von Hand anlegen könnte, hätte Bestand ohne Bewegung\n— und genau die Lücke sucht eine Prüfung. Was hier geht, ist **Sperren und Entsperren**: die\nHandlung, die im Rückrufsfall zählt.","properties":{"ulid":{"type":["string","null"]},"productId":{"type":["integer","null"]},"batchNumber":{"type":["string","null"]},"expiresAt":{"description":"Mindesthaltbarkeitsdatum (YYYY-MM-DD); null = nicht verderblich.","type":["string","null"]},"receivedQty":{"type":["integer","null"]},"remainingQty":{"type":["integer","null"]},"receivedAt":{"type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"blocked":{"type":["boolean","null"]},"blockReason":{"type":["string","null"]},"deliverable":{"description":"Ist die Charge heute auslieferbar? (nicht gesperrt, Restmenge, Restlaufzeit erfüllt)","type":["boolean","null"]},"shelfLifeDays":{"description":"Restlaufzeit in Tagen; null ohne MHD, negativ bei abgelaufener Ware.","type":["integer","null"]}}},"BatchSerialBatch-batch.write":{"type":"object","description":"Chargen (Doc 25 AP 2.1, G1) — der Rückverfolgungs-Anker.\n\n**Bewusst kein POST auf die Charge selbst:** eine Charge entsteht durch einen Wareneingang,\nnicht durch einen Verwaltungsakt. Wer sie von Hand anlegen könnte, hätte Bestand ohne Bewegung\n— und genau die Lücke sucht eine Prüfung. Was hier geht, ist **Sperren und Entsperren**: die\nHandlung, die im Rückrufsfall zählt.","properties":{"reason":{"maxLength":200,"description":"Begründung der Sperre (Pflicht beim Sperren — eine Sperre ohne Grund ist nicht nachvollziehbar).","type":["string","null"]}}},"BatchSerialBatch.jsonld-batch.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"productId":{"type":["integer","null"]},"batchNumber":{"type":["string","null"]},"expiresAt":{"description":"Mindesthaltbarkeitsdatum (YYYY-MM-DD); null = nicht verderblich.","type":["string","null"]},"receivedQty":{"type":["integer","null"]},"remainingQty":{"type":["integer","null"]},"receivedAt":{"type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"blocked":{"type":["boolean","null"]},"blockReason":{"type":["string","null"]},"deliverable":{"description":"Ist die Charge heute auslieferbar? (nicht gesperrt, Restmenge, Restlaufzeit erfüllt)","type":["boolean","null"]},"shelfLifeDays":{"description":"Restlaufzeit in Tagen; null ohne MHD, negativ bei abgelaufener Ware.","type":["integer","null"]}}}],"description":"Chargen (Doc 25 AP 2.1, G1) — der Rückverfolgungs-Anker.\n\n**Bewusst kein POST auf die Charge selbst:** eine Charge entsteht durch einen Wareneingang,\nnicht durch einen Verwaltungsakt. Wer sie von Hand anlegen könnte, hätte Bestand ohne Bewegung\n— und genau die Lücke sucht eine Prüfung. Was hier geht, ist **Sperren und Entsperren**: die\nHandlung, die im Rückrufsfall zählt."},"BatchSerialProductTracking-product_tracking.read":{"type":"object","description":"Nachweispflicht je Artikel (Doc 25 AP 2.1/2.2): keine · Charge (optional mit MHD) · Seriennummer.\n\n**Die Umstellung ist ein Eingriff, kein Schalter.** Wer einen Artikel mit bestehendem Bestand\nauf Chargenpflicht stellt, hat ab dem nächsten Abgang Ware ohne Charge — deshalb weist der\nSchreibpfad das ab, solange Bestand ohne Nachweis existiert. Sauber ist: leer buchen, umstellen,\nmit Charge wieder einbuchen.","properties":{"ulid":{"type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"mode":{"enum":["none","batch","serial"],"description":"`none` | `batch` | `serial`.","type":["string","null"]},"expiryRequired":{"description":"MHD-Pflicht — setzt Chargenführung voraus (ein MHD hängt an der Charge, nicht am Artikel).","type":["boolean","null"]},"minShelfLifeDays":{"minimum":0,"maximum":3650,"description":"Mindest-Restlaufzeit in Tagen bei Auslieferung; 0 = keine Regel.","type":["integer","null"]}}},"BatchSerialProductTracking-product_tracking.write":{"type":"object","description":"Nachweispflicht je Artikel (Doc 25 AP 2.1/2.2): keine · Charge (optional mit MHD) · Seriennummer.\n\n**Die Umstellung ist ein Eingriff, kein Schalter.** Wer einen Artikel mit bestehendem Bestand\nauf Chargenpflicht stellt, hat ab dem nächsten Abgang Ware ohne Charge — deshalb weist der\nSchreibpfad das ab, solange Bestand ohne Nachweis existiert. Sauber ist: leer buchen, umstellen,\nmit Charge wieder einbuchen.","required":["productId"],"properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"mode":{"enum":["none","batch","serial"],"description":"`none` | `batch` | `serial`.","type":["string","null"]},"expiryRequired":{"description":"MHD-Pflicht — setzt Chargenführung voraus (ein MHD hängt an der Charge, nicht am Artikel).","type":["boolean","null"]},"minShelfLifeDays":{"minimum":0,"maximum":3650,"description":"Mindest-Restlaufzeit in Tagen bei Auslieferung; 0 = keine Regel.","type":["integer","null"]}}},"BatchSerialProductTracking-product_tracking.write.jsonMergePatch":{"type":"object","description":"Nachweispflicht je Artikel (Doc 25 AP 2.1/2.2): keine · Charge (optional mit MHD) · Seriennummer.\n\n**Die Umstellung ist ein Eingriff, kein Schalter.** Wer einen Artikel mit bestehendem Bestand\nauf Chargenpflicht stellt, hat ab dem nächsten Abgang Ware ohne Charge — deshalb weist der\nSchreibpfad das ab, solange Bestand ohne Nachweis existiert. Sauber ist: leer buchen, umstellen,\nmit Charge wieder einbuchen.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"mode":{"enum":["none","batch","serial"],"description":"`none` | `batch` | `serial`.","type":["string","null"]},"expiryRequired":{"description":"MHD-Pflicht — setzt Chargenführung voraus (ein MHD hängt an der Charge, nicht am Artikel).","type":["boolean","null"]},"minShelfLifeDays":{"minimum":0,"maximum":3650,"description":"Mindest-Restlaufzeit in Tagen bei Auslieferung; 0 = keine Regel.","type":["integer","null"]}}},"BatchSerialProductTracking.jsonld-product_tracking.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"mode":{"enum":["none","batch","serial"],"description":"`none` | `batch` | `serial`.","type":["string","null"]},"expiryRequired":{"description":"MHD-Pflicht — setzt Chargenführung voraus (ein MHD hängt an der Charge, nicht am Artikel).","type":["boolean","null"]},"minShelfLifeDays":{"minimum":0,"maximum":3650,"description":"Mindest-Restlaufzeit in Tagen bei Auslieferung; 0 = keine Regel.","type":["integer","null"]}}}],"description":"Nachweispflicht je Artikel (Doc 25 AP 2.1/2.2): keine · Charge (optional mit MHD) · Seriennummer.\n\n**Die Umstellung ist ein Eingriff, kein Schalter.** Wer einen Artikel mit bestehendem Bestand\nauf Chargenpflicht stellt, hat ab dem nächsten Abgang Ware ohne Charge — deshalb weist der\nSchreibpfad das ab, solange Bestand ohne Nachweis existiert. Sauber ist: leer buchen, umstellen,\nmit Charge wieder einbuchen."},"BatchSerialTrace-batch_trace.read":{"type":"object","description":"**Verwendungsnachweis / Rückruf-Auskunft** (Doc 25 AP 2.1, G1) — wozu Chargenführung überhaupt\nbetrieben wird.\n\nDie Frage, die im Ernstfall gestellt wird, lautet: „Charge X ist zurückzurufen — wer hat Ware\ndaraus bekommen?\" Ohne diese Auskunft ist jede Chargenerfassung Buchhaltung ohne Zweck.\n\nBeantwortet wird sie aus dem **Bewegungsjournal** (`StockMovement.batchRef`/`serialRef`), nicht\naus den Chargen selbst: die Charge weiß, wie viel noch da ist — das Journal weiß, wohin der\nRest gegangen ist.","properties":{"ulid":{"description":"Synthetische Kennung (Journal-Zeile ohne eigene öffentliche ULID).","type":["string","null"]},"productId":{"type":["integer","null"]},"movementType":{"description":"`receive` (Zugang), `ship` (Auslieferung), `adjust` (Korrektur) …","type":["string","null"]},"batchRef":{"type":["string","null"]},"serialRef":{"type":["string","null"]},"qty":{"description":"Vorzeichenbehaftete Menge der Bewegung.","type":["string","null"]},"sourceRef":{"description":"Polymorpher Belegbezug, z. B. `shipment:1234` — der Weg zum Empfänger.","type":["string","null"]},"occurredAt":{"type":["string","null"]},"customerId":{"description":"Kunde, sofern über die Serieneinheit bekannt (Chargen führen keinen Empfänger je Stück).","type":["integer","null"]}}},"BatchSerialTrace.jsonld-batch_trace.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische Kennung (Journal-Zeile ohne eigene öffentliche ULID).","type":["string","null"]},"productId":{"type":["integer","null"]},"movementType":{"description":"`receive` (Zugang), `ship` (Auslieferung), `adjust` (Korrektur) …","type":["string","null"]},"batchRef":{"type":["string","null"]},"serialRef":{"type":["string","null"]},"qty":{"description":"Vorzeichenbehaftete Menge der Bewegung.","type":["string","null"]},"sourceRef":{"description":"Polymorpher Belegbezug, z. B. `shipment:1234` — der Weg zum Empfänger.","type":["string","null"]},"occurredAt":{"type":["string","null"]},"customerId":{"description":"Kunde, sofern über die Serieneinheit bekannt (Chargen führen keinen Empfänger je Stück).","type":["integer","null"]}}}],"description":"**Verwendungsnachweis / Rückruf-Auskunft** (Doc 25 AP 2.1, G1) — wozu Chargenführung überhaupt\nbetrieben wird.\n\nDie Frage, die im Ernstfall gestellt wird, lautet: „Charge X ist zurückzurufen — wer hat Ware\ndaraus bekommen?\" Ohne diese Auskunft ist jede Chargenerfassung Buchhaltung ohne Zweck.\n\nBeantwortet wird sie aus dem **Bewegungsjournal** (`StockMovement.batchRef`/`serialRef`), nicht\naus den Chargen selbst: die Charge weiß, wie viel noch da ist — das Journal weiß, wohin der\nRest gegangen ist."},"BccAddress-bcc_address.read":{"type":"object","description":"Smart-BCC-Adresse des aktuellen Nutzers (Doc 26 1.5): die eindeutige, selbst-verifizierende Adresse\nzum BCC-Setzen im Mail-Client. `enabled=false` (Adresse null), wenn keine BCC-Domain konfiguriert ist.","properties":{"id":{"default":"me","type":"string"},"enabled":{"default":false,"type":"boolean"},"address":{"type":["string","null"]}}},"BccAddress.jsonld-bcc_address.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"default":"me","type":"string"},"enabled":{"default":false,"type":"boolean"},"address":{"type":["string","null"]}}}],"description":"Smart-BCC-Adresse des aktuellen Nutzers (Doc 26 1.5): die eindeutige, selbst-verifizierende Adresse\nzum BCC-Setzen im Mail-Client. `enabled=false` (Adresse null), wenn keine BCC-Domain konfiguriert ist."},"BillOfMaterial-bom.read":{"type":"object","description":"Fertigungs-Stücklisten (Doc 25 Stufe 12).\n\nGeändert wird ausschließlich im Entwurf. Eine freigegebene Version ist der Nachweis, woraus\ngefertigt wurde — wer etwas ändern will, erzeugt über `new-version` eine neue Fassung.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"productSku":{"type":["string","null"]},"status":{"description":"draft|active|archived (read-only — Übergänge über die Aktionen).","type":["string","null"]},"version":{"type":["integer","null"]},"name":{"type":["string","null"]},"outputQty":{"description":"Ausbringung, auf die sich die Positionsmengen beziehen (≥ 1).","type":["integer","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"activatedAt":{"type":["string","null"]},"itemCount":{"type":["integer","null"]},"items":{"description":"Positionen. Lesend: {ulid, position, componentProductId, componentName, componentSku, qty,\nscrapPercent, note}. Schreibend: {componentProductId, qty, scrapPercent?, note?}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"BillOfMaterial-bom.write":{"type":"object","description":"Fertigungs-Stücklisten (Doc 25 Stufe 12).\n\nGeändert wird ausschließlich im Entwurf. Eine freigegebene Version ist der Nachweis, woraus\ngefertigt wurde — wer etwas ändern will, erzeugt über `new-version` eine neue Fassung.","properties":{"productId":{"type":["integer","null"]},"name":{"type":["string","null"]},"outputQty":{"description":"Ausbringung, auf die sich die Positionsmengen beziehen (≥ 1).","type":["integer","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen. Lesend: {ulid, position, componentProductId, componentName, componentSku, qty,\nscrapPercent, note}. Schreibend: {componentProductId, qty, scrapPercent?, note?}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"BillOfMaterial-bom.write.jsonMergePatch":{"type":"object","description":"Fertigungs-Stücklisten (Doc 25 Stufe 12).\n\nGeändert wird ausschließlich im Entwurf. Eine freigegebene Version ist der Nachweis, woraus\ngefertigt wurde — wer etwas ändern will, erzeugt über `new-version` eine neue Fassung.","properties":{"productId":{"type":["integer","null"]},"name":{"type":["string","null"]},"outputQty":{"description":"Ausbringung, auf die sich die Positionsmengen beziehen (≥ 1).","type":["integer","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen. Lesend: {ulid, position, componentProductId, componentName, componentSku, qty,\nscrapPercent, note}. Schreibend: {componentProductId, qty, scrapPercent?, note?}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"BillOfMaterial.jsonld-bom.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"productSku":{"type":["string","null"]},"status":{"description":"draft|active|archived (read-only — Übergänge über die Aktionen).","type":["string","null"]},"version":{"type":["integer","null"]},"name":{"type":["string","null"]},"outputQty":{"description":"Ausbringung, auf die sich die Positionsmengen beziehen (≥ 1).","type":["integer","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"activatedAt":{"type":["string","null"]},"itemCount":{"type":["integer","null"]},"items":{"description":"Positionen. Lesend: {ulid, position, componentProductId, componentName, componentSku, qty,\nscrapPercent, note}. Schreibend: {componentProductId, qty, scrapPercent?, note?}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Fertigungs-Stücklisten (Doc 25 Stufe 12).\n\nGeändert wird ausschließlich im Entwurf. Eine freigegebene Version ist der Nachweis, woraus\ngefertigt wurde — wer etwas ändern will, erzeugt über `new-version` eine neue Fassung."},"BillingPreview-billing_preview.read":{"type":"object","description":"Abrechnungs-Vorschau (04-06 §13 S6-3).\n- Post: baut Vorschau aus freigegebenen Zeiten + fälligen Recurring-Plänen\n- ready: markiert geprüft; handoff: übergibt an lexoffice, setzt Zeiten auf invoiced\n- Beträge in Cent.","properties":{"ulid":{"type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"status":{"type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"handedOverAt":{"type":["string","null"]},"note":{"type":["string","null"]},"items":{"description":"Positionen (nur Item-Detail).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"BillingPreview-billing_preview.write":{"type":"object","description":"Abrechnungs-Vorschau (04-06 §13 S6-3).\n- Post: baut Vorschau aus freigegebenen Zeiten + fälligen Recurring-Plänen\n- ready: markiert geprüft; handoff: übergibt an lexoffice, setzt Zeiten auf invoiced\n- Beträge in Cent.","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"note":{"type":["string","null"]}}},"BillingPreview.jsonld-billing_preview.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"status":{"type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"handedOverAt":{"type":["string","null"]},"note":{"type":["string","null"]},"items":{"description":"Positionen (nur Item-Detail).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Abrechnungs-Vorschau (04-06 §13 S6-3).\n- Post: baut Vorschau aus freigegebenen Zeiten + fälligen Recurring-Plänen\n- ready: markiert geprüft; handoff: übergibt an lexoffice, setzt Zeiten auf invoiced\n- Beträge in Cent."},"BillingPreviewCreateInvoice-billing_preview_invoice.read":{"type":"object","description":"BillingPreview→Faktura-Brücke (Audit R18 #72): `ready`-Vorschau → Rechnungs-ENTWURF.\n- Alternative zur lexoffice-Übergabe (…/handoff), gleiche handedOver-Semantik (Doppel-Übergabe 409).\n- Lebt im Faktura-Plugin (Eigentümer Ziel-Beleg); deinstalliert → Route weg, deaktiviert → 404 (fail-closed, Processor prüft invoicing-Flag selbst).\n- Security wie lexoffice-Übergabe (04-06 §8.3); Marken-Scope (IDOR) via mayManageBrand im Processor.","properties":{"ulid":{"description":"ULID der übergebenen Abrechnungs-Vorschau.","type":["string","null"]},"invoiceUlid":{"description":"ULID des erzeugten Rechnungs-Entwurfs (Detail: `/v1/invoices/{invoiceUlid}`).","type":["string","null"]},"invoiceStatus":{"description":"Status des erzeugten Belegs — immer `draft` (kein Auto-Festschreiben, GoBD).","type":["string","null"]},"previewStatus":{"description":"Status der Vorschau nach der Übergabe (`handed_over`).","type":["string","null"]},"handedOverAt":{"type":["string","null"]}}},"BillingPreviewCreateInvoice-billing_preview_invoice.write":{"type":"object","description":"BillingPreview→Faktura-Brücke (Audit R18 #72): `ready`-Vorschau → Rechnungs-ENTWURF.\n- Alternative zur lexoffice-Übergabe (…/handoff), gleiche handedOver-Semantik (Doppel-Übergabe 409).\n- Lebt im Faktura-Plugin (Eigentümer Ziel-Beleg); deinstalliert → Route weg, deaktiviert → 404 (fail-closed, Processor prüft invoicing-Flag selbst).\n- Security wie lexoffice-Übergabe (04-06 §8.3); Marken-Scope (IDOR) via mayManageBrand im Processor."},"BillingPreviewCreateInvoice.jsonld-billing_preview_invoice.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID der übergebenen Abrechnungs-Vorschau.","type":["string","null"]},"invoiceUlid":{"description":"ULID des erzeugten Rechnungs-Entwurfs (Detail: `/v1/invoices/{invoiceUlid}`).","type":["string","null"]},"invoiceStatus":{"description":"Status des erzeugten Belegs — immer `draft` (kein Auto-Festschreiben, GoBD).","type":["string","null"]},"previewStatus":{"description":"Status der Vorschau nach der Übergabe (`handed_over`).","type":["string","null"]},"handedOverAt":{"type":["string","null"]}}}],"description":"BillingPreview→Faktura-Brücke (Audit R18 #72): `ready`-Vorschau → Rechnungs-ENTWURF.\n- Alternative zur lexoffice-Übergabe (…/handoff), gleiche handedOver-Semantik (Doppel-Übergabe 409).\n- Lebt im Faktura-Plugin (Eigentümer Ziel-Beleg); deinstalliert → Route weg, deaktiviert → 404 (fail-closed, Processor prüft invoicing-Flag selbst).\n- Security wie lexoffice-Übergabe (04-06 §8.3); Marken-Scope (IDOR) via mayManageBrand im Processor."},"BinStock-bin_stock.read":{"type":"object","description":"Was wo im Lager liegt (Doc 25 AP 4.8) — die Lese- und Buchungsfläche der Platz-Verteilung aus\nAP 4.7.\n\n**`putaway` ist EINE Aktion für zwei Wege**, weil es am Gerät derselbe Handgriff ist:\n - ohne `fromBinCode` wird bisher nicht verortete Menge auf einen Platz gelegt (Einlagerung nach\n   dem Wareneingang, mobil einstufig);\n - mit `fromBinCode` wird von Platz zu Platz umgelagert — der zweistufige Weg über den\n   Wareneingangsplatz und zugleich die freie Umlagerung, die bis hierher fehlte.\n\nBenennbar über `X-Idempotency-Key`: die Scanner-Warteschlange darf nach einem Funkloch\nwiederholen, ohne zweimal einzulagern.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"binId":{"type":["integer","null"]},"binCode":{"type":["string","null"]},"binType":{"type":["string","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"qty":{"type":["integer","null"]}}},"BinStock-bin_stock.write":{"type":"object","description":"Was wo im Lager liegt (Doc 25 AP 4.8) — die Lese- und Buchungsfläche der Platz-Verteilung aus\nAP 4.7.\n\n**`putaway` ist EINE Aktion für zwei Wege**, weil es am Gerät derselbe Handgriff ist:\n - ohne `fromBinCode` wird bisher nicht verortete Menge auf einen Platz gelegt (Einlagerung nach\n   dem Wareneingang, mobil einstufig);\n - mit `fromBinCode` wird von Platz zu Platz umgelagert — der zweistufige Weg über den\n   Wareneingangsplatz und zugleich die freie Umlagerung, die bis hierher fehlte.\n\nBenennbar über `X-Idempotency-Key`: die Scanner-Warteschlange darf nach einem Funkloch\nwiederholen, ohne zweimal einzulagern."},"BinStock.jsonld-bin_stock.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"binId":{"type":["integer","null"]},"binCode":{"type":["string","null"]},"binType":{"type":["string","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"qty":{"type":["integer","null"]}}}],"description":"Was wo im Lager liegt (Doc 25 AP 4.8) — die Lese- und Buchungsfläche der Platz-Verteilung aus\nAP 4.7.\n\n**`putaway` ist EINE Aktion für zwei Wege**, weil es am Gerät derselbe Handgriff ist:\n - ohne `fromBinCode` wird bisher nicht verortete Menge auf einen Platz gelegt (Einlagerung nach\n   dem Wareneingang, mobil einstufig);\n - mit `fromBinCode` wird von Platz zu Platz umgelagert — der zweistufige Weg über den\n   Wareneingangsplatz und zugleich die freie Umlagerung, die bis hierher fehlte.\n\nBenennbar über `X-Idempotency-Key`: die Scanner-Warteschlange darf nach einem Funkloch\nwiederholen, ohne zweimal einzulagern."},"Board-board.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"projectId":{"type":["integer","null"]},"projectUlid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"viewType":{"enum":["kanban","list","gantt"],"default":"kanban","type":"string"},"wipLimit":{"type":["integer","null"]},"columns":{"description":"TaskStatus-Keys in Spaltenreihenfolge","type":["array","null"],"items":{"type":"string"}},"isDefault":{"default":false,"type":"boolean"},"lists":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["projectId","name"]},"Board-board.update.jsonMergePatch":{"type":"object","properties":{"name":{"maxLength":255,"default":"","type":"string"},"viewType":{"enum":["kanban","list","gantt"],"default":"kanban","type":"string"},"wipLimit":{"type":["integer","null"]},"columns":{"description":"TaskStatus-Keys in Spaltenreihenfolge","type":["array","null"],"items":{"type":"string"}},"isDefault":{"default":false,"type":"boolean"}}},"Board-board.write":{"type":"object","required":["projectId","name"],"properties":{"projectId":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"viewType":{"enum":["kanban","list","gantt"],"default":"kanban","type":"string"},"wipLimit":{"type":["integer","null"]},"columns":{"description":"TaskStatus-Keys in Spaltenreihenfolge","type":["array","null"],"items":{"type":"string"}},"isDefault":{"default":false,"type":"boolean"}}},"Board.jsonld-board.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"projectId":{"type":["integer","null"]},"projectUlid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"viewType":{"enum":["kanban","list","gantt"],"default":"kanban","type":"string"},"wipLimit":{"type":["integer","null"]},"columns":{"description":"TaskStatus-Keys in Spaltenreihenfolge","type":["array","null"],"items":{"type":"string"}},"isDefault":{"default":false,"type":"boolean"},"lists":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["projectId","name"]}]},"BrainAsk-brain_ask.read":{"type":"object","description":"„Frag das Brain\" (CompanyBrain B8, Doc 29): lesende, zitierte Antwort über den einen Kontext-Pfad.\n`ROLE_USER` — die Sichtbarkeit der Quellen wird im Builder über die Permission-Tags des Nutzers\nerzwungen (kein zusätzliches Recht nötig). Automatisch MCP-erreichbar (OpenAPI → operations.json).","properties":{"id":{"type":["string","null"]},"query":{"default":"","type":"string"},"answer":{"default":"","type":"string"},"aiUsed":{"default":false,"type":"boolean"},"citations":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}]}}},"contextTokens":{"default":0,"type":"integer"}},"required":["query"]},"BrainAsk-brain_ask.write":{"type":"object","description":"„Frag das Brain\" (CompanyBrain B8, Doc 29): lesende, zitierte Antwort über den einen Kontext-Pfad.\n`ROLE_USER` — die Sichtbarkeit der Quellen wird im Builder über die Permission-Tags des Nutzers\nerzwungen (kein zusätzliches Recht nötig). Automatisch MCP-erreichbar (OpenAPI → operations.json).","required":["query"],"properties":{"query":{"default":"","type":"string"},"useCase":{"description":"Optionaler Use-Case (steuert die Policy/Quellen); Default `brain.ask`.","type":["string","null"]},"brandId":{"type":["integer","null"]},"locale":{"type":["string","null"]}}},"BrainAsk.jsonld-brain_ask.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"query":{"default":"","type":"string"},"answer":{"default":"","type":"string"},"aiUsed":{"default":false,"type":"boolean"},"citations":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}]}}},"contextTokens":{"default":0,"type":"integer"}},"required":["query"]}],"description":"„Frag das Brain\" (CompanyBrain B8, Doc 29): lesende, zitierte Antwort über den einen Kontext-Pfad.\n`ROLE_USER` — die Sichtbarkeit der Quellen wird im Builder über die Permission-Tags des Nutzers\nerzwungen (kein zusätzliches Recht nötig). Automatisch MCP-erreichbar (OpenAPI → operations.json)."},"BrainContextPreview-brain_preview.read":{"type":"object","description":"Test-Konsole des Brain-Steuerungs-Bereichs (CompanyBrain B6, Doc 29): Dry-Run des komponierten Kontexts\nje Use-Case + Beispiel-Frage — Blöcke, Scores, Token-Schätzung, OHNE LLM-Call. Gate `platform.brain.manage`.","properties":{"id":{"type":["string","null"]},"useCase":{"maxLength":100,"default":"","type":"string"},"blocks":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"citations":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}]}}},"tokenEstimate":{"default":0,"type":"integer"}},"required":["useCase"]},"BrainContextPreview-brain_preview.write":{"type":"object","description":"Test-Konsole des Brain-Steuerungs-Bereichs (CompanyBrain B6, Doc 29): Dry-Run des komponierten Kontexts\nje Use-Case + Beispiel-Frage — Blöcke, Scores, Token-Schätzung, OHNE LLM-Call. Gate `platform.brain.manage`.","required":["useCase"],"properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"query":{"default":"","type":"string"},"brandId":{"type":["integer","null"]},"locale":{"type":["string","null"]}}},"BrainContextPreview.jsonld-brain_preview.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"useCase":{"maxLength":100,"default":"","type":"string"},"blocks":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"citations":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}]}}},"tokenEstimate":{"default":0,"type":"integer"}},"required":["useCase"]}],"description":"Test-Konsole des Brain-Steuerungs-Bereichs (CompanyBrain B6, Doc 29): Dry-Run des komponierten Kontexts\nje Use-Case + Beispiel-Frage — Blöcke, Scores, Token-Schätzung, OHNE LLM-Call. Gate `platform.brain.manage`."},"BrainEmbedBackfill-brain_backfill.read":{"type":"object","description":"Nachziehen fehlender CompanyBrain-Einbettungen — API-/MCP-Pendant zu `brain:embed-backfill`\n(Audit R30, P-1/P-2).\n\nDER BEFUND, DEN DAS SCHLIESST: `/v1/brain/health` weist `chunks.pending` und `coveragePct`\nprominent aus, und der Gesundheits-Tab zeigte sie an — es gab aber unter `/api/v1` keine einzige\nOperation, die den Rückstand auflöst. Die Oberfläche zeigte ein Problem, das sie nicht beheben\nkonnte; ohne SSH blieb der Brain dauerhaft semantisch blind ({@see\n\\App\\Platform\\Brain\\Service\\BrainRetriever} degradiert still auf rein lexikalische Treffer).\n\nLauf asynchron im Worker ({@see \\App\\Platform\\Brain\\Message\\EmbedBrainChunksMessage}, Kette bis\nder Rückstand leer oder der KI-Budget-Deckel erreicht ist); POST bestätigt nur die Einreihung.","properties":{"id":{"type":["string","null"]},"batchSize":{"description":"Chunks je Batch (1…64); der Lauf reiht sich nach, bis nichts mehr aussteht.","type":["integer","null"]},"pending":{"description":"Ausstehende Chunks zum Zeitpunkt der Einreihung (Momentaufnahme).","default":0,"type":"integer"},"queued":{"description":"Bestätigt Einreihung in die Worker-Queue.","default":false,"type":"boolean"}}},"BrainEmbedBackfill-brain_backfill.write":{"type":"object","description":"Nachziehen fehlender CompanyBrain-Einbettungen — API-/MCP-Pendant zu `brain:embed-backfill`\n(Audit R30, P-1/P-2).\n\nDER BEFUND, DEN DAS SCHLIESST: `/v1/brain/health` weist `chunks.pending` und `coveragePct`\nprominent aus, und der Gesundheits-Tab zeigte sie an — es gab aber unter `/api/v1` keine einzige\nOperation, die den Rückstand auflöst. Die Oberfläche zeigte ein Problem, das sie nicht beheben\nkonnte; ohne SSH blieb der Brain dauerhaft semantisch blind ({@see\n\\App\\Platform\\Brain\\Service\\BrainRetriever} degradiert still auf rein lexikalische Treffer).\n\nLauf asynchron im Worker ({@see \\App\\Platform\\Brain\\Message\\EmbedBrainChunksMessage}, Kette bis\nder Rückstand leer oder der KI-Budget-Deckel erreicht ist); POST bestätigt nur die Einreihung.","properties":{"batchSize":{"description":"Chunks je Batch (1…64); der Lauf reiht sich nach, bis nichts mehr aussteht.","type":["integer","null"]}}},"BrainEmbedBackfill.jsonld-brain_backfill.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"batchSize":{"description":"Chunks je Batch (1…64); der Lauf reiht sich nach, bis nichts mehr aussteht.","type":["integer","null"]},"pending":{"description":"Ausstehende Chunks zum Zeitpunkt der Einreihung (Momentaufnahme).","default":0,"type":"integer"},"queued":{"description":"Bestätigt Einreihung in die Worker-Queue.","default":false,"type":"boolean"}}}],"description":"Nachziehen fehlender CompanyBrain-Einbettungen — API-/MCP-Pendant zu `brain:embed-backfill`\n(Audit R30, P-1/P-2).\n\nDER BEFUND, DEN DAS SCHLIESST: `/v1/brain/health` weist `chunks.pending` und `coveragePct`\nprominent aus, und der Gesundheits-Tab zeigte sie an — es gab aber unter `/api/v1` keine einzige\nOperation, die den Rückstand auflöst. Die Oberfläche zeigte ein Problem, das sie nicht beheben\nkonnte; ohne SSH blieb der Brain dauerhaft semantisch blind ({@see\n\\App\\Platform\\Brain\\Service\\BrainRetriever} degradiert still auf rein lexikalische Treffer).\n\nLauf asynchron im Worker ({@see \\App\\Platform\\Brain\\Message\\EmbedBrainChunksMessage}, Kette bis\nder Rückstand leer oder der KI-Budget-Deckel erreicht ist); POST bestätigt nur die Einreihung."},"BrainFact-brain_fact.read":{"type":"object","description":"Kuratierter Firmen-Fakt (CompanyBrain B1, Doc 29). Pflege durchgehend `platform.brain.manage`\n(Objekt-Voter erzwingt zusätzlich den Marken-Scope). Ein Edit an einem Provider-Default markiert die\nZeile `customized` → der Standard-Daten-Sync fasst sie nicht mehr an.","properties":{"ulid":{"type":["string","null"]},"category":{"enum":["company","glossary","tone","policy","custom"],"default":"custom","type":"string"},"factKey":{"maxLength":150,"default":"","type":"string"},"title":{"maxLength":255,"default":"","type":"string"},"content":{"default":"","type":"string"},"brandId":{"type":["integer","null"]},"locale":{"maxLength":10,"type":["string","null"]},"priority":{"default":100,"type":"integer"},"status":{"enum":["active","draft","archived"],"default":"active","type":"string"},"validFrom":{"type":["string","null"],"format":"date-time"},"validUntil":{"type":["string","null"],"format":"date-time"},"providerKey":{"description":"SPI-Provenienz (read-only).","type":["string","null"]},"customized":{"description":"true = vom Default abweichend geändert (read-only).","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["factKey","content"]},"BrainFact-brain_fact.write":{"type":"object","description":"Kuratierter Firmen-Fakt (CompanyBrain B1, Doc 29). Pflege durchgehend `platform.brain.manage`\n(Objekt-Voter erzwingt zusätzlich den Marken-Scope). Ein Edit an einem Provider-Default markiert die\nZeile `customized` → der Standard-Daten-Sync fasst sie nicht mehr an.","properties":{"category":{"enum":["company","glossary","tone","policy","custom"],"default":"custom","type":"string"},"factKey":{"maxLength":150,"default":"","type":"string"},"title":{"maxLength":255,"default":"","type":"string"},"content":{"default":"","type":"string"},"brandId":{"type":["integer","null"]},"locale":{"maxLength":10,"type":["string","null"]},"priority":{"default":100,"type":"integer"},"status":{"enum":["active","draft","archived"],"default":"active","type":"string"},"validFrom":{"type":["string","null"],"format":"date-time"},"validUntil":{"type":["string","null"],"format":"date-time"}},"required":["factKey","content"]},"BrainFact-brain_fact.write.jsonMergePatch":{"type":"object","description":"Kuratierter Firmen-Fakt (CompanyBrain B1, Doc 29). Pflege durchgehend `platform.brain.manage`\n(Objekt-Voter erzwingt zusätzlich den Marken-Scope). Ein Edit an einem Provider-Default markiert die\nZeile `customized` → der Standard-Daten-Sync fasst sie nicht mehr an.","properties":{"category":{"enum":["company","glossary","tone","policy","custom"],"default":"custom","type":"string"},"factKey":{"maxLength":150,"default":"","type":"string"},"title":{"maxLength":255,"default":"","type":"string"},"content":{"default":"","type":"string"},"brandId":{"type":["integer","null"]},"locale":{"maxLength":10,"type":["string","null"]},"priority":{"default":100,"type":"integer"},"status":{"enum":["active","draft","archived"],"default":"active","type":"string"},"validFrom":{"type":["string","null"],"format":"date-time"},"validUntil":{"type":["string","null"],"format":"date-time"}}},"BrainFact.jsonld-brain_fact.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"category":{"enum":["company","glossary","tone","policy","custom"],"default":"custom","type":"string"},"factKey":{"maxLength":150,"default":"","type":"string"},"title":{"maxLength":255,"default":"","type":"string"},"content":{"default":"","type":"string"},"brandId":{"type":["integer","null"]},"locale":{"maxLength":10,"type":["string","null"]},"priority":{"default":100,"type":"integer"},"status":{"enum":["active","draft","archived"],"default":"active","type":"string"},"validFrom":{"type":["string","null"],"format":"date-time"},"validUntil":{"type":["string","null"],"format":"date-time"},"providerKey":{"description":"SPI-Provenienz (read-only).","type":["string","null"]},"customized":{"description":"true = vom Default abweichend geändert (read-only).","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["factKey","content"]}],"description":"Kuratierter Firmen-Fakt (CompanyBrain B1, Doc 29). Pflege durchgehend `platform.brain.manage`\n(Objekt-Voter erzwingt zusätzlich den Marken-Scope). Ein Edit an einem Provider-Default markiert die\nZeile `customized` → der Standard-Daten-Sync fasst sie nicht mehr an."},"BrainFeedback-brain_feedback.read":{"type":"object","description":"Feedback an einer KI-Antwort (CompanyBrain B9, Doc 29). Erstellen darf jeder angemeldete Nutzer (er\nbewertet die eigene Antwort); Auflisten/Kuratieren (Wissenslücken) verlangt `platform.brain.manage`.","properties":{"ulid":{"type":["string","null"]},"useCase":{"maxLength":100,"default":"","type":"string"},"rating":{"enum":["up","down"],"default":"up","type":"string"},"query":{"default":"","type":"string"},"comment":{"type":["string","null"]},"contextRefs":{"type":"array","items":{"type":"string"}},"brandId":{"description":"Marke der Rückmeldung — beim Anlegen SERVERSEITIG aus der Zugehörigkeit des Aufrufers\nabgeleitet ({@see BrainFeedbackProcessor::brandOf()}); ein mitgeschickter Wert ist nicht\nmassgeblich (R42: er landete sonst ungeprüft in der Kuratierungsliste einer fremden Marke).","type":["integer","null"]},"resolvedState":{"enum":["open","dismissed","drafted"],"description":"Kuratierung (nur PATCH, manage): open|dismissed|drafted.","default":"open","type":"string"},"userId":{"type":["integer","null"]},"useCaseLabel":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["useCase"]},"BrainFeedback-brain_feedback.write":{"type":"object","description":"Feedback an einer KI-Antwort (CompanyBrain B9, Doc 29). Erstellen darf jeder angemeldete Nutzer (er\nbewertet die eigene Antwort); Auflisten/Kuratieren (Wissenslücken) verlangt `platform.brain.manage`.","required":["useCase"],"properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"rating":{"enum":["up","down"],"default":"up","type":"string"},"query":{"default":"","type":"string"},"comment":{"type":["string","null"]},"contextRefs":{"type":"array","items":{"type":"string"}},"brandId":{"description":"Marke der Rückmeldung — beim Anlegen SERVERSEITIG aus der Zugehörigkeit des Aufrufers\nabgeleitet ({@see BrainFeedbackProcessor::brandOf()}); ein mitgeschickter Wert ist nicht\nmassgeblich (R42: er landete sonst ungeprüft in der Kuratierungsliste einer fremden Marke).","type":["integer","null"]},"resolvedState":{"enum":["open","dismissed","drafted"],"description":"Kuratierung (nur PATCH, manage): open|dismissed|drafted.","default":"open","type":"string"}}},"BrainFeedback-brain_feedback.write.jsonMergePatch":{"type":"object","description":"Feedback an einer KI-Antwort (CompanyBrain B9, Doc 29). Erstellen darf jeder angemeldete Nutzer (er\nbewertet die eigene Antwort); Auflisten/Kuratieren (Wissenslücken) verlangt `platform.brain.manage`.","properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"rating":{"enum":["up","down"],"default":"up","type":"string"},"query":{"default":"","type":"string"},"comment":{"type":["string","null"]},"contextRefs":{"type":"array","items":{"type":"string"}},"brandId":{"description":"Marke der Rückmeldung — beim Anlegen SERVERSEITIG aus der Zugehörigkeit des Aufrufers\nabgeleitet ({@see BrainFeedbackProcessor::brandOf()}); ein mitgeschickter Wert ist nicht\nmassgeblich (R42: er landete sonst ungeprüft in der Kuratierungsliste einer fremden Marke).","type":["integer","null"]},"resolvedState":{"enum":["open","dismissed","drafted"],"description":"Kuratierung (nur PATCH, manage): open|dismissed|drafted.","default":"open","type":"string"}}},"BrainFeedback.jsonld-brain_feedback.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"useCase":{"maxLength":100,"default":"","type":"string"},"rating":{"enum":["up","down"],"default":"up","type":"string"},"query":{"default":"","type":"string"},"comment":{"type":["string","null"]},"contextRefs":{"type":"array","items":{"type":"string"}},"brandId":{"description":"Marke der Rückmeldung — beim Anlegen SERVERSEITIG aus der Zugehörigkeit des Aufrufers\nabgeleitet ({@see BrainFeedbackProcessor::brandOf()}); ein mitgeschickter Wert ist nicht\nmassgeblich (R42: er landete sonst ungeprüft in der Kuratierungsliste einer fremden Marke).","type":["integer","null"]},"resolvedState":{"enum":["open","dismissed","drafted"],"description":"Kuratierung (nur PATCH, manage): open|dismissed|drafted.","default":"open","type":"string"},"userId":{"type":["integer","null"]},"useCaseLabel":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["useCase"]}],"description":"Feedback an einer KI-Antwort (CompanyBrain B9, Doc 29). Erstellen darf jeder angemeldete Nutzer (er\nbewertet die eigene Antwort); Auflisten/Kuratieren (Wissenslücken) verlangt `platform.brain.manage`."},"BrainHealth-brain_health.read":{"type":"object","description":"Gesundheits-Dashboard des Brain-Steuerungs-Bereichs (CompanyBrain B6, Doc 29 Stufe 6): Chunk-Bestand je\nQuelle, Embedding-Abdeckung/-Rückstand, Quellen-Positivliste, Gate-Zustand und KI-Kosten (30 Tage).\nAls GetCollection mit genau einer Zeile (Singleton-Report); Gate `platform.brain.manage`.","properties":{"id":{"default":"brain-health","type":["string","null"]},"flags":{"default":{"brainEnabled":false,"gatewayEnabled":false},"type":"object","additionalProperties":{"type":"boolean"}},"chunks":{"default":{"total":0,"embedded":0,"pending":0,"coveragePct":0},"type":"object","additionalProperties":{"type":"integer"}},"sources":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"integer"},{"type":"string"}]}}},"cost":{"default":{"windowDays":30,"aiTotalCents":0,"embeddingCents":0},"type":"object","additionalProperties":{"type":"integer"}},"feedback":{"description":"Feedback-Quoten (Stufe 7).","default":{"total":0,"down":0,"open":0},"type":"object","additionalProperties":{"type":"integer"}}}},"BrainHealth.jsonld-brain_health.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"default":"brain-health","type":["string","null"]},"flags":{"default":{"brainEnabled":false,"gatewayEnabled":false},"type":"object","additionalProperties":{"type":"boolean"}},"chunks":{"default":{"total":0,"embedded":0,"pending":0,"coveragePct":0},"type":"object","additionalProperties":{"type":"integer"}},"sources":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"integer"},{"type":"string"}]}}},"cost":{"default":{"windowDays":30,"aiTotalCents":0,"embeddingCents":0},"type":"object","additionalProperties":{"type":"integer"}},"feedback":{"description":"Feedback-Quoten (Stufe 7).","default":{"total":0,"down":0,"open":0},"type":"object","additionalProperties":{"type":"integer"}}}}],"description":"Gesundheits-Dashboard des Brain-Steuerungs-Bereichs (CompanyBrain B6, Doc 29 Stufe 6): Chunk-Bestand je\nQuelle, Embedding-Abdeckung/-Rückstand, Quellen-Positivliste, Gate-Zustand und KI-Kosten (30 Tage).\nAls GetCollection mit genau einer Zeile (Singleton-Report); Gate `platform.brain.manage`."},"BrainInstruction-brain_instruction.read":{"type":"object","description":"System-Instruktion je KI-Use-Case (CompanyBrain B2, Doc 29). Pflege durchgehend `platform.brain.manage`.\nEin Edit an `body` setzt `customized=true` (der Composer nutzt dann den DB-Body statt des Datei-Defaults);\n`reset` stellt den Datei-Default wieder her. Eine Marken-Variante wird per Post angelegt (brandId gesetzt).","properties":{"ulid":{"type":["string","null"]},"useCase":{"maxLength":100,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"body":{"default":"","type":"string"},"defaultBody":{"description":"Kanonischer (de-)Datei-Default — read-only, für „Auf Standard zurücksetzen\".","type":["string","null"]},"enabled":{"default":true,"type":"boolean"},"customized":{"default":false,"type":"boolean"},"providerKey":{"type":["string","null"]},"useCaseLabel":{"type":["string","null"]},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["useCase"]},"BrainInstruction-brain_instruction.write":{"type":"object","description":"System-Instruktion je KI-Use-Case (CompanyBrain B2, Doc 29). Pflege durchgehend `platform.brain.manage`.\nEin Edit an `body` setzt `customized=true` (der Composer nutzt dann den DB-Body statt des Datei-Defaults);\n`reset` stellt den Datei-Default wieder her. Eine Marken-Variante wird per Post angelegt (brandId gesetzt).","required":["useCase"],"properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"body":{"default":"","type":"string"},"enabled":{"default":true,"type":"boolean"}}},"BrainInstruction-brain_instruction.write.jsonMergePatch":{"type":"object","description":"System-Instruktion je KI-Use-Case (CompanyBrain B2, Doc 29). Pflege durchgehend `platform.brain.manage`.\nEin Edit an `body` setzt `customized=true` (der Composer nutzt dann den DB-Body statt des Datei-Defaults);\n`reset` stellt den Datei-Default wieder her. Eine Marken-Variante wird per Post angelegt (brandId gesetzt).","properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"body":{"default":"","type":"string"},"enabled":{"default":true,"type":"boolean"}}},"BrainInstruction.jsonld-brain_instruction.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"useCase":{"maxLength":100,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"body":{"default":"","type":"string"},"defaultBody":{"description":"Kanonischer (de-)Datei-Default — read-only, für „Auf Standard zurücksetzen\".","type":["string","null"]},"enabled":{"default":true,"type":"boolean"},"customized":{"default":false,"type":"boolean"},"providerKey":{"type":["string","null"]},"useCaseLabel":{"type":["string","null"]},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["useCase"]}],"description":"System-Instruktion je KI-Use-Case (CompanyBrain B2, Doc 29). Pflege durchgehend `platform.brain.manage`.\nEin Edit an `body` setzt `customized=true` (der Composer nutzt dann den DB-Body statt des Datei-Defaults);\n`reset` stellt den Datei-Default wieder her. Eine Marken-Variante wird per Post angelegt (brandId gesetzt)."},"BrainKnowledgeGap-brain_gap.read":{"type":"object","description":"Wissenslücken-Cluster — API-/MCP-Pendant zu `brain:detect-gaps` (Audit R30, P-1/P-2; CompanyBrain\nB9, Doc 29 Stufe 7).\n\nDER BEFUND: die Fähigkeit existierte ausschließlich als Konsolenbefehl, und ihr Ergebnis — die\ngeclusterten offenen negativen Rückmeldungen samt KI-Entwurf — wurde ausschließlich nach stdout\ngeschrieben. Nach dem Schließen des Terminals war der Entwurf weg; eine Automation oder ein\nKI-Agent (P-2/P-3) konnte die Fähigkeit gar nicht anstoßen.\n\nNICHT Teil des Befunds und deshalb bewusst NICHT hier: das Markieren als bearbeitet. Dieselbe\nZustandsänderung gibt es rechte- und markengebunden längst als\n`PATCH /v1/brain/feedback/{ulid}` mit `resolvedState=drafted` ({@see BrainFeedbackResource}) —\nder `--mark`-Schalter des Befehls ist eine Massenanwendung davon, kein Umgehungspfad. Die\n`feedbackUlids` je Cluster benennen genau die Zeilen, die dafür zu patchen sind.\n\nLesend, `platform.brain.manage`; der KI-Entwurf entsteht bei der Abfrage (Use-Case\n`knowledge.draft`) und wird NIE automatisch veröffentlicht.","properties":{"id":{"type":["string","null"]},"useCase":{"description":"KI-Use-Case, unter dem die unbeantworteten Fragen gestellt wurden.","default":"","type":"string"},"questions":{"description":"Die wiederkehrenden Fragen dieses Clusters (dublettenfrei).","type":"array","items":{"type":"string"}},"feedbackUlids":{"description":"Die einbezogenen Rückmeldungen — genau die Zeilen, die nach dem Anlegen eines Artikels per\n`PATCH /v1/brain/feedback/{ulid}` auf `drafted` zu setzen sind.","type":"array","items":{"type":"string"}},"suggestedTitle":{"default":"","type":"string"},"suggestedDraft":{"description":"KI-Entwurf für den Wissensartikel; leer, wenn das Gateway nicht verfügbar war.","default":"","type":"string"},"aiUsed":{"description":"false = degradiert (nur die Fragen liegen vor, kein KI-Entwurf).","default":false,"type":"boolean"}}},"BrainKnowledgeGap.jsonld-brain_gap.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"useCase":{"description":"KI-Use-Case, unter dem die unbeantworteten Fragen gestellt wurden.","default":"","type":"string"},"questions":{"description":"Die wiederkehrenden Fragen dieses Clusters (dublettenfrei).","type":"array","items":{"type":"string"}},"feedbackUlids":{"description":"Die einbezogenen Rückmeldungen — genau die Zeilen, die nach dem Anlegen eines Artikels per\n`PATCH /v1/brain/feedback/{ulid}` auf `drafted` zu setzen sind.","type":"array","items":{"type":"string"}},"suggestedTitle":{"default":"","type":"string"},"suggestedDraft":{"description":"KI-Entwurf für den Wissensartikel; leer, wenn das Gateway nicht verfügbar war.","default":"","type":"string"},"aiUsed":{"description":"false = degradiert (nur die Fragen liegen vor, kein KI-Entwurf).","default":false,"type":"boolean"}}}],"description":"Wissenslücken-Cluster — API-/MCP-Pendant zu `brain:detect-gaps` (Audit R30, P-1/P-2; CompanyBrain\nB9, Doc 29 Stufe 7).\n\nDER BEFUND: die Fähigkeit existierte ausschließlich als Konsolenbefehl, und ihr Ergebnis — die\ngeclusterten offenen negativen Rückmeldungen samt KI-Entwurf — wurde ausschließlich nach stdout\ngeschrieben. Nach dem Schließen des Terminals war der Entwurf weg; eine Automation oder ein\nKI-Agent (P-2/P-3) konnte die Fähigkeit gar nicht anstoßen.\n\nNICHT Teil des Befunds und deshalb bewusst NICHT hier: das Markieren als bearbeitet. Dieselbe\nZustandsänderung gibt es rechte- und markengebunden längst als\n`PATCH /v1/brain/feedback/{ulid}` mit `resolvedState=drafted` ({@see BrainFeedbackResource}) —\nder `--mark`-Schalter des Befehls ist eine Massenanwendung davon, kein Umgehungspfad. Die\n`feedbackUlids` je Cluster benennen genau die Zeilen, die dafür zu patchen sind.\n\nLesend, `platform.brain.manage`; der KI-Entwurf entsteht bei der Abfrage (Use-Case\n`knowledge.draft`) und wird NIE automatisch veröffentlicht."},"BrainPolicy-brain_policy.read":{"type":"object","description":"KI-Steuerungsregel je Use-Case × Marke (CompanyBrain B6, Doc 29). Ohne Zeile gelten Code-Defaults\n({@see \\App\\Platform\\Brain\\Catalog\\BrainPolicyDefaults}); die Collection liefert die angelegten\nPolicy-Zeilen (die Stufe-6-Matrix ergänzt die Default-Ansicht je Use-Case). Pflege durchgehend\n`platform.brain.manage`.","properties":{"ulid":{"type":["string","null"]},"useCase":{"maxLength":100,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"enabled":{"default":true,"type":"boolean"},"sources":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"factCategories":{"type":"array","items":{"type":"string"}},"retrievalTopK":{"minimum":0,"maximum":50,"default":8,"type":"integer"},"maxContextTokens":{"minimum":0,"maximum":32000,"default":4000,"type":"integer"},"hybridWeights":{"type":["object","null"],"additionalProperties":{"type":"number"}},"rerank":{"default":false,"type":"boolean"},"useCaseLabel":{"type":["string","null"]},"isDefault":{"description":"true = transiente Code-Default-Zeile (noch nicht in der DB).","default":false,"type":"boolean"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["useCase"]},"BrainPolicy-brain_policy.write":{"type":"object","description":"KI-Steuerungsregel je Use-Case × Marke (CompanyBrain B6, Doc 29). Ohne Zeile gelten Code-Defaults\n({@see \\App\\Platform\\Brain\\Catalog\\BrainPolicyDefaults}); die Collection liefert die angelegten\nPolicy-Zeilen (die Stufe-6-Matrix ergänzt die Default-Ansicht je Use-Case). Pflege durchgehend\n`platform.brain.manage`.","required":["useCase"],"properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"enabled":{"default":true,"type":"boolean"},"sources":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"factCategories":{"type":"array","items":{"type":"string"}},"retrievalTopK":{"minimum":0,"maximum":50,"default":8,"type":"integer"},"maxContextTokens":{"minimum":0,"maximum":32000,"default":4000,"type":"integer"},"hybridWeights":{"type":["object","null"],"additionalProperties":{"type":"number"}},"rerank":{"default":false,"type":"boolean"}}},"BrainPolicy-brain_policy.write.jsonMergePatch":{"type":"object","description":"KI-Steuerungsregel je Use-Case × Marke (CompanyBrain B6, Doc 29). Ohne Zeile gelten Code-Defaults\n({@see \\App\\Platform\\Brain\\Catalog\\BrainPolicyDefaults}); die Collection liefert die angelegten\nPolicy-Zeilen (die Stufe-6-Matrix ergänzt die Default-Ansicht je Use-Case). Pflege durchgehend\n`platform.brain.manage`.","properties":{"useCase":{"maxLength":100,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"enabled":{"default":true,"type":"boolean"},"sources":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"factCategories":{"type":"array","items":{"type":"string"}},"retrievalTopK":{"minimum":0,"maximum":50,"default":8,"type":"integer"},"maxContextTokens":{"minimum":0,"maximum":32000,"default":4000,"type":"integer"},"hybridWeights":{"type":["object","null"],"additionalProperties":{"type":"number"}},"rerank":{"default":false,"type":"boolean"}}},"BrainPolicy.jsonld-brain_policy.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"useCase":{"maxLength":100,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"enabled":{"default":true,"type":"boolean"},"sources":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"factCategories":{"type":"array","items":{"type":"string"}},"retrievalTopK":{"minimum":0,"maximum":50,"default":8,"type":"integer"},"maxContextTokens":{"minimum":0,"maximum":32000,"default":4000,"type":"integer"},"hybridWeights":{"type":["object","null"],"additionalProperties":{"type":"number"}},"rerank":{"default":false,"type":"boolean"},"useCaseLabel":{"type":["string","null"]},"isDefault":{"description":"true = transiente Code-Default-Zeile (noch nicht in der DB).","default":false,"type":"boolean"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["useCase"]}],"description":"KI-Steuerungsregel je Use-Case × Marke (CompanyBrain B6, Doc 29). Ohne Zeile gelten Code-Defaults\n({@see \\App\\Platform\\Brain\\Catalog\\BrainPolicyDefaults}); die Collection liefert die angelegten\nPolicy-Zeilen (die Stufe-6-Matrix ergänzt die Default-Ansicht je Use-Case). Pflege durchgehend\n`platform.brain.manage`."},"BrainPolicyMatrix-brain_policy_matrix.read":{"type":"object","description":"Read-only Policy-Matrix (CompanyBrain B6, Doc 29 Stufe 6): je Kontext-Use-Case genau eine Zeile — die\nglobale Override-Zeile (`isDefault=false`, mit `ulid`) oder der Code-Default (`isDefault=true`, `ulid=null`).\nDie Steuerungs-UI editiert Default-Zeilen per POST auf `/v1/brain/policies` (Upsert), Override-Zeilen per\nPATCH auf `/v1/brain/policies/{ulid}`. Bewusst `identifier: false` (Default-Zeilen haben keine ULID →\nBlank-Node-IRI statt IRI-Fehler). Gate `platform.brain.manage`.","properties":{"useCase":{"default":"","type":"string"},"ulid":{"description":"ULID der Override-Zeile; null = Code-Default (Edit läuft als POST-Upsert).","type":["string","null"]},"useCaseLabel":{"type":["string","null"]},"module":{"type":["string","null"]},"isDefault":{"default":true,"type":"boolean"},"enabled":{"default":true,"type":"boolean"},"sources":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"factCategories":{"type":"array","items":{"type":"string"}},"retrievalTopK":{"default":8,"type":"integer"},"maxContextTokens":{"default":4000,"type":"integer"},"rerank":{"default":false,"type":"boolean"}}},"BrainPolicyMatrix.jsonld-brain_policy_matrix.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"useCase":{"default":"","type":"string"},"ulid":{"description":"ULID der Override-Zeile; null = Code-Default (Edit läuft als POST-Upsert).","type":["string","null"]},"useCaseLabel":{"type":["string","null"]},"module":{"type":["string","null"]},"isDefault":{"default":true,"type":"boolean"},"enabled":{"default":true,"type":"boolean"},"sources":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"factCategories":{"type":"array","items":{"type":"string"}},"retrievalTopK":{"default":8,"type":"integer"},"maxContextTokens":{"default":4000,"type":"integer"},"rerank":{"default":false,"type":"boolean"}}}],"description":"Read-only Policy-Matrix (CompanyBrain B6, Doc 29 Stufe 6): je Kontext-Use-Case genau eine Zeile — die\nglobale Override-Zeile (`isDefault=false`, mit `ulid`) oder der Code-Default (`isDefault=true`, `ulid=null`).\nDie Steuerungs-UI editiert Default-Zeilen per POST auf `/v1/brain/policies` (Upsert), Override-Zeilen per\nPATCH auf `/v1/brain/policies/{ulid}`. Bewusst `identifier: false` (Default-Zeilen haben keine ULID →\nBlank-Node-IRI statt IRI-Fehler). Gate `platform.brain.manage`."},"BrainReindex-brain_reindex.read":{"type":"object","description":"Neuaufbau des CompanyBrain-Chunk-Sidecars — API-/MCP-Pendant zu `brain:reindex` (Audit R30,\nP-1/P-2; Muster {@see \\App\\Platform\\Search\\ApiResource\\SearchReindexResource}).\n- Lauf asynchron im Worker ({@see \\App\\Platform\\Brain\\Message\\ReindexBrainChunksMessage}); POST\n  bestätigt nur die Einreihung (202).\n- `types` grenzt auf Quell-Klassen (FQCN) ein; leer/fehlend = die Positivliste `brain.sources`.\n- Der Lauf endet mit einem Embedding-Auftrag, sonst stünden die neuen Chunks ohne Vektor da.","properties":{"id":{"type":["string","null"]},"types":{"description":"Auf diese Quell-Klassen begrenzen (FQCN); leer = Positivliste `brain.sources`.","type":"array","items":{"type":"string"}},"queued":{"description":"Bestätigt Einreihung in die Worker-Queue.","default":false,"type":"boolean"}}},"BrainReindex-brain_reindex.write":{"type":"object","description":"Neuaufbau des CompanyBrain-Chunk-Sidecars — API-/MCP-Pendant zu `brain:reindex` (Audit R30,\nP-1/P-2; Muster {@see \\App\\Platform\\Search\\ApiResource\\SearchReindexResource}).\n- Lauf asynchron im Worker ({@see \\App\\Platform\\Brain\\Message\\ReindexBrainChunksMessage}); POST\n  bestätigt nur die Einreihung (202).\n- `types` grenzt auf Quell-Klassen (FQCN) ein; leer/fehlend = die Positivliste `brain.sources`.\n- Der Lauf endet mit einem Embedding-Auftrag, sonst stünden die neuen Chunks ohne Vektor da.","properties":{"types":{"description":"Auf diese Quell-Klassen begrenzen (FQCN); leer = Positivliste `brain.sources`.","type":"array","items":{"type":"string"}}}},"BrainReindex.jsonld-brain_reindex.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"types":{"description":"Auf diese Quell-Klassen begrenzen (FQCN); leer = Positivliste `brain.sources`.","type":"array","items":{"type":"string"}},"queued":{"description":"Bestätigt Einreihung in die Worker-Queue.","default":false,"type":"boolean"}}}],"description":"Neuaufbau des CompanyBrain-Chunk-Sidecars — API-/MCP-Pendant zu `brain:reindex` (Audit R30,\nP-1/P-2; Muster {@see \\App\\Platform\\Search\\ApiResource\\SearchReindexResource}).\n- Lauf asynchron im Worker ({@see \\App\\Platform\\Brain\\Message\\ReindexBrainChunksMessage}); POST\n  bestätigt nur die Einreihung (202).\n- `types` grenzt auf Quell-Klassen (FQCN) ein; leer/fehlend = die Positivliste `brain.sources`.\n- Der Lauf endet mit einem Embedding-Auftrag, sonst stünden die neuen Chunks ohne Vektor da."},"BrainSource-brain_source.read":{"type":"object","description":"Inhalts-Quellen des CompanyBrain (Doc 29 B3) als schaltbare Fläche — die Positivliste\n`brain.sources` war zuvor NUR als roher JSON-Wert unter „Einstellungen → System\" erreichbar, damit\nblieb die automatische Hälfte des Brains auf jeder Installation stehen.\n\n- Collection: jede chunkbare Klasse mit Bestand (Suchindex/Chunks) und Schaltzustand.\n- `PATCH {active}`: schaltet genau eine Quelle; Ausschalten räumt deren Chunks\n  ({@see \\App\\Platform\\Brain\\Service\\BrainSourceCatalog::setActive()}).\n- Einschalten füllt NICHTS rückwirkend — der Bestandsaufbau läuft über `POST /v1/brain/reindex`.\n- Gate durchgehend `platform.brain.manage`; die Umschaltung wirkt systemweit und verlangt deshalb\n  den markenübergreifenden Verwalter ({@see BrainSourceProcessor}).","properties":{"id":{"description":"Kleingeschriebener FQCN mit `-` statt `\\` (Punkte brechen die IRI-Erzeugung).","type":["string","null"]},"entityClass":{"default":"","type":"string"},"label":{"description":"Klassen-Kurzname.","default":"","type":"string"},"module":{"description":"Herkunft (Plugin- bzw. Platform-Bereich) für die Gruppierung.","default":"","type":"string"},"active":{"description":"Steht auf der Positivliste `brain.sources` — einziges schreibbares Feld.","default":false,"type":"boolean"},"indexedCount":{"description":"Zeilen im Suchindex = Obergrenze dessen, was ein Neuaufbau erfassen kann.","default":0,"type":"integer"},"chunkCount":{"description":"Bereits abgeleitete `brain_chunk`-Zeilen.","default":0,"type":"integer"},"pluginEnabled":{"description":"Modul-Flag des besitzenden Plugins aktiv.","default":true,"type":"boolean"},"providerKnown":{"description":"Ein Such-Beiträger (SPI) liefert die Klasse; false = Eigen-Indexer.","default":false,"type":"boolean"},"core":{"description":"Kein Plugin besitzt die Klasse — `module` ist dann der Platform-Bereich, kein Plugin-Name.","default":false,"type":"boolean"},"removedChunks":{"description":"Beim Ausschalten entfernte Chunks (nur in der PATCH-Antwort belegt).","default":0,"type":"integer"}}},"BrainSource-brain_source.write.jsonMergePatch":{"type":"object","description":"Inhalts-Quellen des CompanyBrain (Doc 29 B3) als schaltbare Fläche — die Positivliste\n`brain.sources` war zuvor NUR als roher JSON-Wert unter „Einstellungen → System\" erreichbar, damit\nblieb die automatische Hälfte des Brains auf jeder Installation stehen.\n\n- Collection: jede chunkbare Klasse mit Bestand (Suchindex/Chunks) und Schaltzustand.\n- `PATCH {active}`: schaltet genau eine Quelle; Ausschalten räumt deren Chunks\n  ({@see \\App\\Platform\\Brain\\Service\\BrainSourceCatalog::setActive()}).\n- Einschalten füllt NICHTS rückwirkend — der Bestandsaufbau läuft über `POST /v1/brain/reindex`.\n- Gate durchgehend `platform.brain.manage`; die Umschaltung wirkt systemweit und verlangt deshalb\n  den markenübergreifenden Verwalter ({@see BrainSourceProcessor}).","properties":{"active":{"description":"Steht auf der Positivliste `brain.sources` — einziges schreibbares Feld.","default":false,"type":"boolean"}}},"BrainSource.jsonld-brain_source.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Kleingeschriebener FQCN mit `-` statt `\\` (Punkte brechen die IRI-Erzeugung).","type":["string","null"]},"entityClass":{"default":"","type":"string"},"label":{"description":"Klassen-Kurzname.","default":"","type":"string"},"module":{"description":"Herkunft (Plugin- bzw. Platform-Bereich) für die Gruppierung.","default":"","type":"string"},"active":{"description":"Steht auf der Positivliste `brain.sources` — einziges schreibbares Feld.","default":false,"type":"boolean"},"indexedCount":{"description":"Zeilen im Suchindex = Obergrenze dessen, was ein Neuaufbau erfassen kann.","default":0,"type":"integer"},"chunkCount":{"description":"Bereits abgeleitete `brain_chunk`-Zeilen.","default":0,"type":"integer"},"pluginEnabled":{"description":"Modul-Flag des besitzenden Plugins aktiv.","default":true,"type":"boolean"},"providerKnown":{"description":"Ein Such-Beiträger (SPI) liefert die Klasse; false = Eigen-Indexer.","default":false,"type":"boolean"},"core":{"description":"Kein Plugin besitzt die Klasse — `module` ist dann der Platform-Bereich, kein Plugin-Name.","default":false,"type":"boolean"},"removedChunks":{"description":"Beim Ausschalten entfernte Chunks (nur in der PATCH-Antwort belegt).","default":0,"type":"integer"}}}],"description":"Inhalts-Quellen des CompanyBrain (Doc 29 B3) als schaltbare Fläche — die Positivliste\n`brain.sources` war zuvor NUR als roher JSON-Wert unter „Einstellungen → System\" erreichbar, damit\nblieb die automatische Hälfte des Brains auf jeder Installation stehen.\n\n- Collection: jede chunkbare Klasse mit Bestand (Suchindex/Chunks) und Schaltzustand.\n- `PATCH {active}`: schaltet genau eine Quelle; Ausschalten räumt deren Chunks\n  ({@see \\App\\Platform\\Brain\\Service\\BrainSourceCatalog::setActive()}).\n- Einschalten füllt NICHTS rückwirkend — der Bestandsaufbau läuft über `POST /v1/brain/reindex`.\n- Gate durchgehend `platform.brain.manage`; die Umschaltung wirkt systemweit und verlangt deshalb\n  den markenübergreifenden Verwalter ({@see BrainSourceProcessor})."},"Brand-brand.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"slug":{"maxLength":100,"default":"","type":"string"},"slugLocked":{"readOnly":true,"description":"True sobald Belegnummern vergeben — Slug dann GoBD-bedingt fix. Nur lesbar (UI: Feld sperren).","default":false,"type":"boolean"},"name":{"maxLength":255,"default":"","type":"string"},"legalName":{"maxLength":255,"description":"Vollständiger Rechtsname (Impressum/Footer-Platzhalter {{ brand_legal_name }}).","type":["string","null"]},"email":{"format":"email","maxLength":255,"description":"Marken-Kontaktadresse — Platzhalter {{ brand_email }}; auch Quelle für das Versand-Routing.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"website":{"maxLength":255,"description":"Webseite — Platzhalter {{ brand_website }}.","type":["string","null"]},"phone":{"maxLength":50,"description":"Telefon — Platzhalter {{ brand_phone }}.","type":["string","null"]},"bankName":{"maxLength":255,"description":"Bankverbindung: Kontoinhaber/Bank — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"bankIban":{"maxLength":50,"description":"Bankverbindung: IBAN — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"bankBic":{"maxLength":100,"description":"Bankverbindung: BIC — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"defaultLocale":{"maxLength":5,"description":"Standard-Sprache der Marke für die Auflösung mehrsprachiger Mail-/Belegvorlagen.","type":["string","null"]},"primaryColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","description":"Hex-Farbe (#rgb … #rrggbbaa) oder leer. Identische Validierung wie das gesamte Farbschema.","type":["string","null"]},"secondaryColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"accentColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"textColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"backgroundColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"logoPath":{"description":"Wort-Bild-Logo (helle Hintergründe). Nur lesbar — gepflegt über den Upload-Endpunkt /brands/{ulid}/assets.","type":["string","null"]},"iconPath":{"description":"Quadratisches Icon/Bildmarke. Nur lesbar — gepflegt über den Upload-Endpunkt /brands/{ulid}/assets.","type":["string","null"]},"logoInversePath":{"description":"Invers-Logo (dunkle Hintergründe). Nur lesbar — gepflegt über den Upload-Endpunkt.","type":["string","null"]},"emailLogoPath":{"description":"Separates E-Mail-Logo. Nur lesbar — gepflegt über den Upload-Endpunkt.","type":["string","null"]},"active":{"default":true,"type":"boolean"},"isDefault":{"description":"Stamm-/Default-Marke: Fallback-Marke für sonst markenlose Vorgänge (Vorbelegung im Ticket-Anlegen).","default":false,"type":"boolean"}},"required":["slug","name"]},"Brand-brand.write":{"type":"object","required":["slug","name"],"properties":{"slug":{"maxLength":100,"default":"","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"legalName":{"maxLength":255,"description":"Vollständiger Rechtsname (Impressum/Footer-Platzhalter {{ brand_legal_name }}).","type":["string","null"]},"email":{"format":"email","maxLength":255,"description":"Marken-Kontaktadresse — Platzhalter {{ brand_email }}; auch Quelle für das Versand-Routing.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"website":{"maxLength":255,"description":"Webseite — Platzhalter {{ brand_website }}.","type":["string","null"]},"phone":{"maxLength":50,"description":"Telefon — Platzhalter {{ brand_phone }}.","type":["string","null"]},"bankName":{"maxLength":255,"description":"Bankverbindung: Kontoinhaber/Bank — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"bankIban":{"maxLength":50,"description":"Bankverbindung: IBAN — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"bankBic":{"maxLength":100,"description":"Bankverbindung: BIC — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"defaultLocale":{"maxLength":5,"description":"Standard-Sprache der Marke für die Auflösung mehrsprachiger Mail-/Belegvorlagen.","type":["string","null"]},"primaryColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","description":"Hex-Farbe (#rgb … #rrggbbaa) oder leer. Identische Validierung wie das gesamte Farbschema.","type":["string","null"]},"secondaryColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"accentColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"textColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"backgroundColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"active":{"default":true,"type":"boolean"},"isDefault":{"description":"Stamm-/Default-Marke: Fallback-Marke für sonst markenlose Vorgänge (Vorbelegung im Ticket-Anlegen).","default":false,"type":"boolean"}}},"Brand-brand.write.jsonMergePatch":{"type":"object","properties":{"slug":{"maxLength":100,"default":"","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"legalName":{"maxLength":255,"description":"Vollständiger Rechtsname (Impressum/Footer-Platzhalter {{ brand_legal_name }}).","type":["string","null"]},"email":{"format":"email","maxLength":255,"description":"Marken-Kontaktadresse — Platzhalter {{ brand_email }}; auch Quelle für das Versand-Routing.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"website":{"maxLength":255,"description":"Webseite — Platzhalter {{ brand_website }}.","type":["string","null"]},"phone":{"maxLength":50,"description":"Telefon — Platzhalter {{ brand_phone }}.","type":["string","null"]},"bankName":{"maxLength":255,"description":"Bankverbindung: Kontoinhaber/Bank — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"bankIban":{"maxLength":50,"description":"Bankverbindung: IBAN — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"bankBic":{"maxLength":100,"description":"Bankverbindung: BIC — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"defaultLocale":{"maxLength":5,"description":"Standard-Sprache der Marke für die Auflösung mehrsprachiger Mail-/Belegvorlagen.","type":["string","null"]},"primaryColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","description":"Hex-Farbe (#rgb … #rrggbbaa) oder leer. Identische Validierung wie das gesamte Farbschema.","type":["string","null"]},"secondaryColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"accentColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"textColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"backgroundColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"active":{"default":true,"type":"boolean"},"isDefault":{"description":"Stamm-/Default-Marke: Fallback-Marke für sonst markenlose Vorgänge (Vorbelegung im Ticket-Anlegen).","default":false,"type":"boolean"}}},"Brand.jsonld-brand.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"slug":{"maxLength":100,"default":"","type":"string"},"slugLocked":{"readOnly":true,"description":"True sobald Belegnummern vergeben — Slug dann GoBD-bedingt fix. Nur lesbar (UI: Feld sperren).","default":false,"type":"boolean"},"name":{"maxLength":255,"default":"","type":"string"},"legalName":{"maxLength":255,"description":"Vollständiger Rechtsname (Impressum/Footer-Platzhalter {{ brand_legal_name }}).","type":["string","null"]},"email":{"format":"email","maxLength":255,"description":"Marken-Kontaktadresse — Platzhalter {{ brand_email }}; auch Quelle für das Versand-Routing.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"website":{"maxLength":255,"description":"Webseite — Platzhalter {{ brand_website }}.","type":["string","null"]},"phone":{"maxLength":50,"description":"Telefon — Platzhalter {{ brand_phone }}.","type":["string","null"]},"bankName":{"maxLength":255,"description":"Bankverbindung: Kontoinhaber/Bank — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"bankIban":{"maxLength":50,"description":"Bankverbindung: IBAN — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"bankBic":{"maxLength":100,"description":"Bankverbindung: BIC — Zahlungshinweis auf Belegen und im Kundenportal (AP 5.8).","type":["string","null"]},"defaultLocale":{"maxLength":5,"description":"Standard-Sprache der Marke für die Auflösung mehrsprachiger Mail-/Belegvorlagen.","type":["string","null"]},"primaryColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","description":"Hex-Farbe (#rgb … #rrggbbaa) oder leer. Identische Validierung wie das gesamte Farbschema.","type":["string","null"]},"secondaryColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"accentColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"textColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"backgroundColor":{"pattern":"^((#[0-9a-fA-F]{3,8})?)$","type":["string","null"]},"logoPath":{"description":"Wort-Bild-Logo (helle Hintergründe). Nur lesbar — gepflegt über den Upload-Endpunkt /brands/{ulid}/assets.","type":["string","null"]},"iconPath":{"description":"Quadratisches Icon/Bildmarke. Nur lesbar — gepflegt über den Upload-Endpunkt /brands/{ulid}/assets.","type":["string","null"]},"logoInversePath":{"description":"Invers-Logo (dunkle Hintergründe). Nur lesbar — gepflegt über den Upload-Endpunkt.","type":["string","null"]},"emailLogoPath":{"description":"Separates E-Mail-Logo. Nur lesbar — gepflegt über den Upload-Endpunkt.","type":["string","null"]},"active":{"default":true,"type":"boolean"},"isDefault":{"description":"Stamm-/Default-Marke: Fallback-Marke für sonst markenlose Vorgänge (Vorbelegung im Ticket-Anlegen).","default":false,"type":"boolean"}},"required":["slug","name"]}]},"BrandAsset-brand_asset.read":{"type":"object","description":"Upload/Entfernen für Marken-CI-Bildmarken — bewusst getrennt von der Brand-Hauptressource.\n- Bild als Base64-JSON (konsistent zum DMS-Upload), Slot per Whitelist.\n- Validierung/Ablage: {@see \\App\\Platform\\Brand\\Service\\BrandAssetStorage}.\n- Entfernen als eigene Operation (POST …/assets/remove) statt DELETE mit zwei Pfadvariablen.","properties":{"ulid":{"description":"ULID der Zielmarke (aus dem Pfad).","type":["string","null"]},"slot":{"enum":["icon","logo","logoInverse","emailLogo"],"description":"Asset-Slot: icon | logo | logoInverse | emailLogo.","default":"","type":"string"},"path":{"description":"Resultierender öffentlicher Pfad nach Upload (null nach Entfernen).","type":["string","null"]}},"required":["slot"]},"BrandAsset-brand_asset.write":{"type":"object","description":"Upload/Entfernen für Marken-CI-Bildmarken — bewusst getrennt von der Brand-Hauptressource.\n- Bild als Base64-JSON (konsistent zum DMS-Upload), Slot per Whitelist.\n- Validierung/Ablage: {@see \\App\\Platform\\Brand\\Service\\BrandAssetStorage}.\n- Entfernen als eigene Operation (POST …/assets/remove) statt DELETE mit zwei Pfadvariablen.","required":["slot"],"properties":{"slot":{"enum":["icon","logo","logoInverse","emailLogo"],"description":"Asset-Slot: icon | logo | logoInverse | emailLogo.","default":"","type":"string"},"contentBase64":{"description":"Bildinhalt als Base64 (nur beim Upload). MIME/Größe/Maße prüft die BrandAssetStorage.","type":["string","null"]},"filename":{"maxLength":255,"description":"Optionaler Originaldateiname (nur für Diagnose/Logs; der Ablagename wird vom System vergeben).","type":["string","null"]}}},"BrandAsset.jsonld-brand_asset.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID der Zielmarke (aus dem Pfad).","type":["string","null"]},"slot":{"enum":["icon","logo","logoInverse","emailLogo"],"description":"Asset-Slot: icon | logo | logoInverse | emailLogo.","default":"","type":"string"},"path":{"description":"Resultierender öffentlicher Pfad nach Upload (null nach Entfernen).","type":["string","null"]}},"required":["slot"]}],"description":"Upload/Entfernen für Marken-CI-Bildmarken — bewusst getrennt von der Brand-Hauptressource.\n- Bild als Base64-JSON (konsistent zum DMS-Upload), Slot per Whitelist.\n- Validierung/Ablage: {@see \\App\\Platform\\Brand\\Service\\BrandAssetStorage}.\n- Entfernen als eigene Operation (POST …/assets/remove) statt DELETE mit zwei Pfadvariablen."},"Budget-budget.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"default":"","type":"string"},"level":{"enum":["customer","project","workitem","contract"],"default":"project","type":"string"},"targetId":{"type":["integer","null"]},"unit":{"enum":["hours","money"],"default":"hours","type":"string"},"period":{"enum":["once","monthly","quarter","year"],"default":"once","type":"string"},"capMode":{"enum":["hard_cap","warn","soft"],"default":"warn","type":"string"},"amount":{"minimum":0,"description":"Limit in Cent (unit=money).","type":["integer","null"]},"hours":{"minimum":0,"description":"Limit in Stunden (unit=hours).","type":["integer","null"]},"parentBudgetId":{"type":["integer","null"]},"warnThresholds":{"type":["array","null"],"items":{"type":"integer"}},"warnRemaining":{"minimum":0,"description":"Restmengen-Vorwarnung: melden, sobald WENIGER als dieser Rest offen ist — in **Minuten**\n(unit=hours) bzw. **Cent** (unit=money). `null` = keine.","type":["integer","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"consumed":{"default":0,"type":"number"},"consumedPercent":{"default":0,"type":"integer"},"reachedThreshold":{"type":["integer","null"]},"overCap":{"default":false,"type":"boolean"},"remaining":{"description":"Rest bis zum Limit in der Budget-Einheit (Stunden bzw. Cent); negativ = ueberschritten.","default":0,"type":"number"},"remainingLow":{"description":"Restmengen-Vorwarnung erreicht (weniger uebrig als `warnRemaining`).","default":false,"type":"boolean"}},"required":["name","targetId"]},"Budget-budget.write":{"type":"object","required":["name","targetId"],"properties":{"name":{"default":"","type":"string"},"level":{"enum":["customer","project","workitem","contract"],"default":"project","type":"string"},"targetId":{"type":["integer","null"]},"unit":{"enum":["hours","money"],"default":"hours","type":"string"},"period":{"enum":["once","monthly","quarter","year"],"default":"once","type":"string"},"capMode":{"enum":["hard_cap","warn","soft"],"default":"warn","type":"string"},"amount":{"minimum":0,"description":"Limit in Cent (unit=money).","type":["integer","null"]},"hours":{"minimum":0,"description":"Limit in Stunden (unit=hours).","type":["integer","null"]},"parentBudgetId":{"type":["integer","null"]},"warnThresholds":{"type":["array","null"],"items":{"type":"integer"}},"warnRemaining":{"minimum":0,"description":"Restmengen-Vorwarnung: melden, sobald WENIGER als dieser Rest offen ist — in **Minuten**\n(unit=hours) bzw. **Cent** (unit=money). `null` = keine.","type":["integer","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"}}},"Budget-budget.write.jsonMergePatch":{"type":"object","properties":{"name":{"default":"","type":"string"},"level":{"enum":["customer","project","workitem","contract"],"default":"project","type":"string"},"targetId":{"type":["integer","null"]},"unit":{"enum":["hours","money"],"default":"hours","type":"string"},"period":{"enum":["once","monthly","quarter","year"],"default":"once","type":"string"},"capMode":{"enum":["hard_cap","warn","soft"],"default":"warn","type":"string"},"amount":{"minimum":0,"description":"Limit in Cent (unit=money).","type":["integer","null"]},"hours":{"minimum":0,"description":"Limit in Stunden (unit=hours).","type":["integer","null"]},"parentBudgetId":{"type":["integer","null"]},"warnThresholds":{"type":["array","null"],"items":{"type":"integer"}},"warnRemaining":{"minimum":0,"description":"Restmengen-Vorwarnung: melden, sobald WENIGER als dieser Rest offen ist — in **Minuten**\n(unit=hours) bzw. **Cent** (unit=money). `null` = keine.","type":["integer","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"}}},"Budget.jsonld-budget.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"default":"","type":"string"},"level":{"enum":["customer","project","workitem","contract"],"default":"project","type":"string"},"targetId":{"type":["integer","null"]},"unit":{"enum":["hours","money"],"default":"hours","type":"string"},"period":{"enum":["once","monthly","quarter","year"],"default":"once","type":"string"},"capMode":{"enum":["hard_cap","warn","soft"],"default":"warn","type":"string"},"amount":{"minimum":0,"description":"Limit in Cent (unit=money).","type":["integer","null"]},"hours":{"minimum":0,"description":"Limit in Stunden (unit=hours).","type":["integer","null"]},"parentBudgetId":{"type":["integer","null"]},"warnThresholds":{"type":["array","null"],"items":{"type":"integer"}},"warnRemaining":{"minimum":0,"description":"Restmengen-Vorwarnung: melden, sobald WENIGER als dieser Rest offen ist — in **Minuten**\n(unit=hours) bzw. **Cent** (unit=money). `null` = keine.","type":["integer","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"consumed":{"default":0,"type":"number"},"consumedPercent":{"default":0,"type":"integer"},"reachedThreshold":{"type":["integer","null"]},"overCap":{"default":false,"type":"boolean"},"remaining":{"description":"Rest bis zum Limit in der Budget-Einheit (Stunden bzw. Cent); negativ = ueberschritten.","default":0,"type":"number"},"remainingLow":{"description":"Restmengen-Vorwarnung erreicht (weniger uebrig als `warnRemaining`).","default":false,"type":"boolean"}},"required":["name","targetId"]}]},"BudgetSummary-budget_summary.read":{"type":"object","description":"Budget-KPI-Aggregat für die Übersicht (Perf, Audit R20 PERF-3; Muster\n{@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteSummaryResource}).\n- Summiert Geld-Budget/Verbrauch/Rest/Cap-Überschreitungen über den GESAMTEN gescopten Bestand, nicht nur die Seite.\n- Ersetzt frühere clientseitige listAll-Reduktion (bis zu 50 Requests/Ansicht).\n- Verbrauch via BudgetGuardService-Logik, gepuffert im KpiCache.\n- Read-only, markenscope-gefiltert, Ein-Element-Collection.","properties":{"id":{"type":["string","null"]},"totalBudgetAmount":{"description":"Summe der Geld-Budgets in Cent (Unit money) im gescopten Bestand.","type":["integer","null"]},"spentAmount":{"description":"Summe des verbrauchten Betrags in Cent (gerundeter consumed je Geld-Budget).","type":["integer","null"]},"remainingAmount":{"description":"Rest in Cent (totalBudgetAmount − spentAmount; kann negativ sein).","type":["integer","null"]},"overCapCount":{"description":"Anzahl Budgets mit Cap-Überschreitung (Geld UND Stunden).","type":["integer","null"]},"budgetCount":{"description":"Gesamtzahl der Budgets im gescopten Bestand (für den Zähler der Übersicht).","type":["integer","null"]}}},"BudgetSummary.jsonld-budget_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"totalBudgetAmount":{"description":"Summe der Geld-Budgets in Cent (Unit money) im gescopten Bestand.","type":["integer","null"]},"spentAmount":{"description":"Summe des verbrauchten Betrags in Cent (gerundeter consumed je Geld-Budget).","type":["integer","null"]},"remainingAmount":{"description":"Rest in Cent (totalBudgetAmount − spentAmount; kann negativ sein).","type":["integer","null"]},"overCapCount":{"description":"Anzahl Budgets mit Cap-Überschreitung (Geld UND Stunden).","type":["integer","null"]},"budgetCount":{"description":"Gesamtzahl der Budgets im gescopten Bestand (für den Zähler der Übersicht).","type":["integer","null"]}}}],"description":"Budget-KPI-Aggregat für die Übersicht (Perf, Audit R20 PERF-3; Muster\n{@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteSummaryResource}).\n- Summiert Geld-Budget/Verbrauch/Rest/Cap-Überschreitungen über den GESAMTEN gescopten Bestand, nicht nur die Seite.\n- Ersetzt frühere clientseitige listAll-Reduktion (bis zu 50 Requests/Ansicht).\n- Verbrauch via BudgetGuardService-Logik, gepuffert im KpiCache.\n- Read-only, markenscope-gefiltert, Ein-Element-Collection."},"BuilderBlockType-builder.read":{"type":"object","description":"Baustein-Katalog (ENT-BUILDER-04): serialisierbare Sicht auf die BlockTypeRegistry —\nnur Typen MIT settingsSchema; der Editor kennt keinen Typ namentlich. Kein Brand-Scope\n(Katalog = Programm, keine Daten).","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"type":["string","null"]},"repeats":{"description":"Wiederholender Baustein (ENT-BUILDER-19): seine Kinder sind eine Vorlage, kein Inhalt.","default":false,"type":"boolean"},"deprecated":{"description":"Aus der Palette genommen — Bestand rendert weiter (kein Daten-Umbau).","default":false,"type":"boolean"},"icon":{"type":["string","null"]},"supportsChildren":{"type":["boolean","null"]},"settingsSchema":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"styleCapabilities":{"type":["array","null"],"items":{"type":"string"}},"editorExtension":{"type":["string","null"]},"provider":{"description":"Provider-Key des registrierenden Plugins.","type":["string","null"]}}},"BuilderBlockType.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"type":["string","null"]},"repeats":{"description":"Wiederholender Baustein (ENT-BUILDER-19): seine Kinder sind eine Vorlage, kein Inhalt.","default":false,"type":"boolean"},"deprecated":{"description":"Aus der Palette genommen — Bestand rendert weiter (kein Daten-Umbau).","default":false,"type":"boolean"},"icon":{"type":["string","null"]},"supportsChildren":{"type":["boolean","null"]},"settingsSchema":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"styleCapabilities":{"type":["array","null"],"items":{"type":"string"}},"editorExtension":{"type":["string","null"]},"provider":{"description":"Provider-Key des registrierenden Plugins.","type":["string","null"]}}}],"description":"Baustein-Katalog (ENT-BUILDER-04): serialisierbare Sicht auf die BlockTypeRegistry —\nnur Typen MIT settingsSchema; der Editor kennt keinen Typ namentlich. Kein Brand-Scope\n(Katalog = Programm, keine Daten)."},"BuilderCanvas":{"type":"object","description":"Live-Canvas des Editors (ENT-BUILDER-16): der uebergebene ENTWURFS-Baum durch die echte\n{@see \\Octi\\Plugin\\Builder\\Render\\BuilderPageRenderer}-Pipeline — Rumpf-HTML + Basis-CSS je\nbenutztem Baustein-Typ + Theme-CSS. Nichts wird persistiert.\n\nAbgrenzung zu `/preview`: dort ein komplettes Dokument aus dem GESPEICHERTEN Entwurf, hier\nein Fragment aus dem ungespeicherten Baum des Editors. Element-CSS liefert der Server bewusst\nNICHT — das kompiliert der Editor lokal (TS-Port, Paritaet ueber Golden-Fixtures).","properties":{"ulid":{"description":"Die Flaeche, deren Entwurf gerendert wurde.","type":["string","null"]},"html":{"description":"Rumpf-HTML (Fragment, kein Dokument).","type":["string","null"]},"baseCss":{"description":"Basis-CSS der benutzten Baustein-Typen.","type":["string","null"]},"classCss":{"description":"CSS der referenzierten Stil-Klassen inkl. Layer-Ordnung (ENT-BUILDER-17).","type":["string","null"]},"refCss":{"description":"Server-kompilierte Element-Regeln — noetig fuer REFERENZIERTE Baeume (globale Elemente,\nKomponenten-Definitionen), deren Knoten NICHT im Editor-Baum stehen und die der TS-Compiler\ndeshalb nie sieht (Befund SESS-BUILDER-CANVASREFCSS-01). Der Canvas legt sie VOR das\nDraft-CSS in dieselbe Layer: fuer Seiten-Knoten gewinnt weiterhin die Client-Fassung.","type":["string","null"]},"themeCss":{"description":"Theme-Variablen + Grundstile (`--ob-*`, `.ob-page`).","type":["string","null"]},"breakpoints":{"description":"Bruchpunkte des Themes — der Editor kompiliert damit dieselben Media-Queries wie der Server.","anyOf":[{"type":"object","additionalProperties":{"type":"integer"}},{"type":"array","items":{"type":["string","null"]}}]},"islands":{"description":"deklarierte Nachlade-Quellen (ENT-BUILDER-10)","type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"usedBlockTypes":{"type":"array","items":{"type":"string"}}}},"BuilderCanvas-builder.read":{"type":"object","description":"Live-Canvas des Editors (ENT-BUILDER-16): der uebergebene ENTWURFS-Baum durch die echte\n{@see \\Octi\\Plugin\\Builder\\Render\\BuilderPageRenderer}-Pipeline — Rumpf-HTML + Basis-CSS je\nbenutztem Baustein-Typ + Theme-CSS. Nichts wird persistiert.\n\nAbgrenzung zu `/preview`: dort ein komplettes Dokument aus dem GESPEICHERTEN Entwurf, hier\nein Fragment aus dem ungespeicherten Baum des Editors. Element-CSS liefert der Server bewusst\nNICHT — das kompiliert der Editor lokal (TS-Port, Paritaet ueber Golden-Fixtures).","properties":{"ulid":{"description":"Die Flaeche, deren Entwurf gerendert wurde.","type":["string","null"]},"html":{"description":"Rumpf-HTML (Fragment, kein Dokument).","type":["string","null"]},"baseCss":{"description":"Basis-CSS der benutzten Baustein-Typen.","type":["string","null"]},"classCss":{"description":"CSS der referenzierten Stil-Klassen inkl. Layer-Ordnung (ENT-BUILDER-17).","type":["string","null"]},"refCss":{"description":"Server-kompilierte Element-Regeln — noetig fuer REFERENZIERTE Baeume (globale Elemente,\nKomponenten-Definitionen), deren Knoten NICHT im Editor-Baum stehen und die der TS-Compiler\ndeshalb nie sieht (Befund SESS-BUILDER-CANVASREFCSS-01). Der Canvas legt sie VOR das\nDraft-CSS in dieselbe Layer: fuer Seiten-Knoten gewinnt weiterhin die Client-Fassung.","type":["string","null"]},"themeCss":{"description":"Theme-Variablen + Grundstile (`--ob-*`, `.ob-page`).","type":["string","null"]},"breakpoints":{"description":"Bruchpunkte des Themes — der Editor kompiliert damit dieselben Media-Queries wie der Server.","anyOf":[{"type":"object","additionalProperties":{"type":"integer"}},{"type":"array","items":{"type":["string","null"]}}]},"islands":{"description":"deklarierte Nachlade-Quellen (ENT-BUILDER-10)","type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"usedBlockTypes":{"type":"array","items":{"type":"string"}}}},"BuilderCanvas.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Die Flaeche, deren Entwurf gerendert wurde.","type":["string","null"]},"html":{"description":"Rumpf-HTML (Fragment, kein Dokument).","type":["string","null"]},"baseCss":{"description":"Basis-CSS der benutzten Baustein-Typen.","type":["string","null"]},"classCss":{"description":"CSS der referenzierten Stil-Klassen inkl. Layer-Ordnung (ENT-BUILDER-17).","type":["string","null"]},"refCss":{"description":"Server-kompilierte Element-Regeln — noetig fuer REFERENZIERTE Baeume (globale Elemente,\nKomponenten-Definitionen), deren Knoten NICHT im Editor-Baum stehen und die der TS-Compiler\ndeshalb nie sieht (Befund SESS-BUILDER-CANVASREFCSS-01). Der Canvas legt sie VOR das\nDraft-CSS in dieselbe Layer: fuer Seiten-Knoten gewinnt weiterhin die Client-Fassung.","type":["string","null"]},"themeCss":{"description":"Theme-Variablen + Grundstile (`--ob-*`, `.ob-page`).","type":["string","null"]},"breakpoints":{"description":"Bruchpunkte des Themes — der Editor kompiliert damit dieselben Media-Queries wie der Server.","anyOf":[{"type":"object","additionalProperties":{"type":"integer"}},{"type":"array","items":{"type":["string","null"]}}]},"islands":{"description":"deklarierte Nachlade-Quellen (ENT-BUILDER-10)","type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"usedBlockTypes":{"type":"array","items":{"type":"string"}}}}],"description":"Live-Canvas des Editors (ENT-BUILDER-16): der uebergebene ENTWURFS-Baum durch die echte\n{@see \\Octi\\Plugin\\Builder\\Render\\BuilderPageRenderer}-Pipeline — Rumpf-HTML + Basis-CSS je\nbenutztem Baustein-Typ + Theme-CSS. Nichts wird persistiert.\n\nAbgrenzung zu `/preview`: dort ein komplettes Dokument aus dem GESPEICHERTEN Entwurf, hier\nein Fragment aus dem ungespeicherten Baum des Editors. Element-CSS liefert der Server bewusst\nNICHT — das kompiliert der Editor lokal (TS-Port, Paritaet ueber Golden-Fixtures)."},"BuilderCollectionSource-builder.read":{"type":"object","description":"Katalog der Listen-Quellen (ENT-BUILDER-20, Doc 37 §7.4) — die Auswahl, aus der der\nBindungs-Wähler und der Repeater ihre Quelle beziehen.\n\nDer Katalog haengt am Kontext: jede Site-Collection ist eine eigene Quelle. Ohne `siteUlid`\nliefert er nur die statischen Quellen — Collections fremder Sites tauchen nie auf.","properties":{"key":{"description":"Quellen-Schluessel. BEWUSST kein API-Platform-Identifier: er traegt bei datengetriebenen\nQuellen einen Doppelpunkt (`site.collection:01H…`), und daraus laesst sich keine Item-IRI\nbauen — der Katalog hat auch keine Item-Route (er ist eine Liste, kein Bestand).","type":["string","null"]},"label":{"type":["string","null"]},"group":{"description":"Gruppen-Schlüssel für die Darstellung im Wähler.","type":["string","null"]},"fields":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}]}}},"sortableFields":{"type":"array","items":{"type":"string"}},"supportsDetailUrl":{"description":"Hat ein Eintrag eine eigene Seite? Nur dann gibt es `item._url`.","default":false,"type":"boolean"}}},"BuilderCollectionSource.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"description":"Quellen-Schluessel. BEWUSST kein API-Platform-Identifier: er traegt bei datengetriebenen\nQuellen einen Doppelpunkt (`site.collection:01H…`), und daraus laesst sich keine Item-IRI\nbauen — der Katalog hat auch keine Item-Route (er ist eine Liste, kein Bestand).","type":["string","null"]},"label":{"type":["string","null"]},"group":{"description":"Gruppen-Schlüssel für die Darstellung im Wähler.","type":["string","null"]},"fields":{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}]}}},"sortableFields":{"type":"array","items":{"type":"string"}},"supportsDetailUrl":{"description":"Hat ein Eintrag eine eigene Seite? Nur dann gibt es `item._url`.","default":false,"type":"boolean"}}}],"description":"Katalog der Listen-Quellen (ENT-BUILDER-20, Doc 37 §7.4) — die Auswahl, aus der der\nBindungs-Wähler und der Repeater ihre Quelle beziehen.\n\nDer Katalog haengt am Kontext: jede Site-Collection ist eine eigene Quelle. Ohne `siteUlid`\nliefert er nur die statischen Quellen — Collections fremder Sites tauchen nie auf."},"BuilderCollectionSourceItem-builder.read":{"type":"object","description":"Eintraege EINER Listen-Quelle als Auswahl-Paare (Doc 37 §7.4, Stufe 8) — der Eintrags-Wähler\nkuratierter Listen (`idIn`): der Redakteur pickt Eintraege von Hand statt zu filtern.\n\nQuellen-agnostisch ueber die Registry (Site-Collections, Blog-Beitraege, kuenftige Quellen) —\nbenannt wird ein Eintrag ueber das `labelField` der Quelle (SPI 2.62). Geliefert wird nur, was\ndie Quelle ohnehin freigibt: Veroeffentlichtes im sichtbaren Site-/Marken-Kontext.","properties":{"id":{"description":"Eintrags-Kennung (ULID der Quelle) — der Wert der `idIn`-Regel.","type":["string","null"]},"label":{"description":"Anzeige-Name (Wert des `labelField` der Quelle; Kennung, wenn keines deklariert ist).","type":["string","null"]}}},"BuilderCollectionSourceItem.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Eintrags-Kennung (ULID der Quelle) — der Wert der `idIn`-Regel.","type":["string","null"]},"label":{"description":"Anzeige-Name (Wert des `labelField` der Quelle; Kennung, wenn keines deklariert ist).","type":["string","null"]}}}],"description":"Eintraege EINER Listen-Quelle als Auswahl-Paare (Doc 37 §7.4, Stufe 8) — der Eintrags-Wähler\nkuratierter Listen (`idIn`): der Redakteur pickt Eintraege von Hand statt zu filtern.\n\nQuellen-agnostisch ueber die Registry (Site-Collections, Blog-Beitraege, kuenftige Quellen) —\nbenannt wird ein Eintrag ueber das `labelField` der Quelle (SPI 2.62). Geliefert wird nur, was\ndie Quelle ohnehin freigibt: Veroeffentlichtes im sichtbaren Site-/Marken-Kontext."},"BuilderDynamicSource-builder.read":{"type":"object","description":"Katalog der dynamischen Datenquellen (AP 3.2) fuer den Editor: key, label, island-Flag.\nNur lesend; die Aufloesung passiert beim Release-Bau bzw. ueber die oeffentliche Insel-API.","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"island":{"type":["boolean","null"]},"provider":{"type":["string","null"]}}},"BuilderDynamicSource.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"island":{"type":["boolean","null"]},"provider":{"type":["string","null"]}}}],"description":"Katalog der dynamischen Datenquellen (AP 3.2) fuer den Editor: key, label, island-Flag.\nNur lesend; die Aufloesung passiert beim Release-Bau bzw. ueber die oeffentliche Insel-API."},"BuilderLibraryExport-builder.read":{"type":"object","description":"Export eines Bibliotheks-Eintrags als portables JSON (AP 3.3) — Gegenstueck zum Import\nunter POST /v1/builder/library-items/import.","properties":{"ulid":{"type":["string","null"]},"format":{"description":"Format-Kennung `octibuilder-library@1`.","type":["string","null"]},"name":{"type":["string","null"]},"kind":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"blocks":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"propsSchema":{"description":"Props-Schema (nur kind=component, Doc 37 §7.6).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"slots":{"description":"Slots (nur kind=component).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"BuilderLibraryExport.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"format":{"description":"Format-Kennung `octibuilder-library@1`.","type":["string","null"]},"name":{"type":["string","null"]},"kind":{"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"blocks":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"propsSchema":{"description":"Props-Schema (nur kind=component, Doc 37 §7.6).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"slots":{"description":"Slots (nur kind=component).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Export eines Bibliotheks-Eintrags als portables JSON (AP 3.3) — Gegenstueck zum Import\nunter POST /v1/builder/library-items/import."},"BuilderLibraryItem-builder.list":{"type":"object","description":"Vorlagen-Bibliothek (S10(g), AP 3.3): gespeicherte Abschnitte/Seiten, globale Elemente,\nKomponenten (Doc 37 §7.6, ENT-BUILDER-21).\n- kind=global|component: Update baut alle aktiven Releases mit dieser Referenz neu (GlobalElementPropagator)\n- kind=component: propsSchema + slots; Instanz-Blocktyp `builderComponentRef`\n- Export/Import als Datei-Format `octibuilder-library@1`.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"description":"section|page|global.","type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"propsSchema":{"description":"Props-Schema (nur kind=component, Doc 37 §7.6): list<{key, label, type, translatable?, default?}>;\ntype ∈ text|richtext|image|link|color|visibility.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"slots":{"description":"Slots (nur kind=component): list<{key, label}> — befuellt je Instanz ueber builderSlotContent.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"externalRefs":{"description":"Import-Herkunft (read-only).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"BuilderLibraryItem-builder.read":{"type":"object","description":"Vorlagen-Bibliothek (S10(g), AP 3.3): gespeicherte Abschnitte/Seiten, globale Elemente,\nKomponenten (Doc 37 §7.6, ENT-BUILDER-21).\n- kind=global|component: Update baut alle aktiven Releases mit dieser Referenz neu (GlobalElementPropagator)\n- kind=component: propsSchema + slots; Instanz-Blocktyp `builderComponentRef`\n- Export/Import als Datei-Format `octibuilder-library@1`.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"description":"section|page|global.","type":["string","null"]},"blocksJson":{"description":"Gespeicherter Block-Baum.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tags":{"type":["array","null"],"items":{"type":"string"}},"propsSchema":{"description":"Props-Schema (nur kind=component, Doc 37 §7.6): list<{key, label, type, translatable?, default?}>;\ntype ∈ text|richtext|image|link|color|visibility.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"slots":{"description":"Slots (nur kind=component): list<{key, label}> — befuellt je Instanz ueber builderSlotContent.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"externalRefs":{"description":"Import-Herkunft (read-only).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"BuilderLibraryItem-builder.write":{"type":"object","description":"Vorlagen-Bibliothek (S10(g), AP 3.3): gespeicherte Abschnitte/Seiten, globale Elemente,\nKomponenten (Doc 37 §7.6, ENT-BUILDER-21).\n- kind=global|component: Update baut alle aktiven Releases mit dieser Referenz neu (GlobalElementPropagator)\n- kind=component: propsSchema + slots; Instanz-Blocktyp `builderComponentRef`\n- Export/Import als Datei-Format `octibuilder-library@1`.","properties":{"name":{"type":["string","null"]},"kind":{"description":"section|page|global.","type":["string","null"]},"blocksJson":{"description":"Gespeicherter Block-Baum.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tags":{"type":["array","null"],"items":{"type":"string"}},"propsSchema":{"description":"Props-Schema (nur kind=component, Doc 37 §7.6): list<{key, label, type, translatable?, default?}>;\ntype ∈ text|richtext|image|link|color|visibility.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"slots":{"description":"Slots (nur kind=component): list<{key, label}> — befuellt je Instanz ueber builderSlotContent.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]}}},"BuilderLibraryItem-builder.write.jsonMergePatch":{"type":"object","description":"Vorlagen-Bibliothek (S10(g), AP 3.3): gespeicherte Abschnitte/Seiten, globale Elemente,\nKomponenten (Doc 37 §7.6, ENT-BUILDER-21).\n- kind=global|component: Update baut alle aktiven Releases mit dieser Referenz neu (GlobalElementPropagator)\n- kind=component: propsSchema + slots; Instanz-Blocktyp `builderComponentRef`\n- Export/Import als Datei-Format `octibuilder-library@1`.","properties":{"name":{"type":["string","null"]},"kind":{"description":"section|page|global.","type":["string","null"]},"blocksJson":{"description":"Gespeicherter Block-Baum.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tags":{"type":["array","null"],"items":{"type":"string"}},"propsSchema":{"description":"Props-Schema (nur kind=component, Doc 37 §7.6): list<{key, label, type, translatable?, default?}>;\ntype ∈ text|richtext|image|link|color|visibility.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"slots":{"description":"Slots (nur kind=component): list<{key, label}> — befuellt je Instanz ueber builderSlotContent.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]}}},"BuilderLibraryItem.jsonld-builder.list":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"description":"section|page|global.","type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"propsSchema":{"description":"Props-Schema (nur kind=component, Doc 37 §7.6): list<{key, label, type, translatable?, default?}>;\ntype ∈ text|richtext|image|link|color|visibility.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"slots":{"description":"Slots (nur kind=component): list<{key, label}> — befuellt je Instanz ueber builderSlotContent.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"externalRefs":{"description":"Import-Herkunft (read-only).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Vorlagen-Bibliothek (S10(g), AP 3.3): gespeicherte Abschnitte/Seiten, globale Elemente,\nKomponenten (Doc 37 §7.6, ENT-BUILDER-21).\n- kind=global|component: Update baut alle aktiven Releases mit dieser Referenz neu (GlobalElementPropagator)\n- kind=component: propsSchema + slots; Instanz-Blocktyp `builderComponentRef`\n- Export/Import als Datei-Format `octibuilder-library@1`."},"BuilderLibraryItem.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"description":"section|page|global.","type":["string","null"]},"blocksJson":{"description":"Gespeicherter Block-Baum.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tags":{"type":["array","null"],"items":{"type":"string"}},"propsSchema":{"description":"Props-Schema (nur kind=component, Doc 37 §7.6): list<{key, label, type, translatable?, default?}>;\ntype ∈ text|richtext|image|link|color|visibility.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"slots":{"description":"Slots (nur kind=component): list<{key, label}> — befuellt je Instanz ueber builderSlotContent.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"externalRefs":{"description":"Import-Herkunft (read-only).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Vorlagen-Bibliothek (S10(g), AP 3.3): gespeicherte Abschnitte/Seiten, globale Elemente,\nKomponenten (Doc 37 §7.6, ENT-BUILDER-21).\n- kind=global|component: Update baut alle aktiven Releases mit dieser Referenz neu (GlobalElementPropagator)\n- kind=component: propsSchema + slots; Instanz-Blocktyp `builderComponentRef`\n- Export/Import als Datei-Format `octibuilder-library@1`."},"BuilderPage-builder.list":{"type":"object","description":"Baukasten-Flaeche (Doc 35, ENT-BUILDER-01/-03): Seite, Vorlage, Popup, Abschnitt.\n- Entwurfs-Baum (`blocks`) nur im Detail/Write; das Ausgelieferte ist immer ein Release\n- `status` abgeleitet: published (aktives Release) > scheduled (geplantes Release) > draft\n- kind=template/popup brauchen zusaetzlich template.manage/popup.manage (Processor).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"description":"page|template|popup|section — nur beim Anlegen schreibbar.","type":["string","null"]},"templateKind":{"description":"kind=template: header|footer|page|landing|blog-archive|blog-post|search|error|maintenance.","type":["string","null"]},"locale":{"type":["string","null"]},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"themeUlid":{"description":"Theme-Zuordnung per ULID; leerer String loest die Zuordnung (Standard-Theme der Marke).","type":["string","null"]},"slug":{"type":["string","null"]},"status":{"description":"draft|published|scheduled.","type":["string","null"]},"publishedAt":{"type":["string","null"]},"scheduledFor":{"type":["string","null"]},"publishedVersionNo":{"type":["integer","null"]},"documentExists":{"description":"Wurde schon einmal Inhalt geschrieben (Document-Kernel-Dokument vorhanden)?","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"BuilderPage-builder.read":{"type":"object","description":"Baukasten-Flaeche (Doc 35, ENT-BUILDER-01/-03): Seite, Vorlage, Popup, Abschnitt.\n- Entwurfs-Baum (`blocks`) nur im Detail/Write; das Ausgelieferte ist immer ein Release\n- `status` abgeleitet: published (aktives Release) > scheduled (geplantes Release) > draft\n- kind=template/popup brauchen zusaetzlich template.manage/popup.manage (Processor).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"description":"page|template|popup|section — nur beim Anlegen schreibbar.","type":["string","null"]},"templateKind":{"description":"kind=template: header|footer|page|landing|blog-archive|blog-post|search|error|maintenance.","type":["string","null"]},"locale":{"type":["string","null"]},"locales":{"type":["array","null"],"items":{"type":"string"}},"seoI18n":{"description":"Kopf-Uebersteuerungen je Sprache — plus `_bindings` (Doc 37 §7.5): dynamisches SEO einer\n`collection-page`-Vorlage, je Feld `{dynamic: 'item.<feld>', fallback?}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"themeUlid":{"description":"Theme-Zuordnung per ULID; leerer String loest die Zuordnung (Standard-Theme der Marke).","type":["string","null"]},"slug":{"type":["string","null"]},"metaTitle":{"type":["string","null"]},"metaDescription":{"type":["string","null"]},"canonicalUrl":{"type":["string","null"]},"robotsIndex":{"type":["boolean","null"]},"robotsFollow":{"type":["boolean","null"]},"ogImageFileUlid":{"type":["string","null"]},"structuredDataType":{"type":["string","null"]},"structuredDataJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"displayConditions":{"description":"kind=template: Anzeige-Bedingungen (Praesentationslogik, keine Automation-Conditions).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"popupConfig":{"description":"kind=popup: Ausloeser + Anzeige-Regeln.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"blocks":{"description":"ENTWURFS-Baum — nur im Detail lesbar, per PATCH schreibbar (EditAuthorizationGuard).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"status":{"description":"draft|published|scheduled.","type":["string","null"]},"publishedAt":{"type":["string","null"]},"scheduledFor":{"type":["string","null"]},"publishedVersionNo":{"type":["integer","null"]},"documentExists":{"description":"Wurde schon einmal Inhalt geschrieben (Document-Kernel-Dokument vorhanden)?","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"BuilderPage-builder.write":{"type":"object","description":"Baukasten-Flaeche (Doc 35, ENT-BUILDER-01/-03): Seite, Vorlage, Popup, Abschnitt.\n- Entwurfs-Baum (`blocks`) nur im Detail/Write; das Ausgelieferte ist immer ein Release\n- `status` abgeleitet: published (aktives Release) > scheduled (geplantes Release) > draft\n- kind=template/popup brauchen zusaetzlich template.manage/popup.manage (Processor).","properties":{"name":{"type":["string","null"]},"kind":{"description":"page|template|popup|section — nur beim Anlegen schreibbar.","type":["string","null"]},"templateKind":{"description":"kind=template: header|footer|page|landing|blog-archive|blog-post|search|error|maintenance.","type":["string","null"]},"locale":{"type":["string","null"]},"locales":{"type":["array","null"],"items":{"type":"string"}},"seoI18n":{"description":"Kopf-Uebersteuerungen je Sprache — plus `_bindings` (Doc 37 §7.5): dynamisches SEO einer\n`collection-page`-Vorlage, je Feld `{dynamic: 'item.<feld>', fallback?}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"themeUlid":{"description":"Theme-Zuordnung per ULID; leerer String loest die Zuordnung (Standard-Theme der Marke).","type":["string","null"]},"slug":{"type":["string","null"]},"metaTitle":{"type":["string","null"]},"metaDescription":{"type":["string","null"]},"canonicalUrl":{"type":["string","null"]},"robotsIndex":{"type":["boolean","null"]},"robotsFollow":{"type":["boolean","null"]},"ogImageFileUlid":{"type":["string","null"]},"structuredDataType":{"type":["string","null"]},"structuredDataJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"displayConditions":{"description":"kind=template: Anzeige-Bedingungen (Praesentationslogik, keine Automation-Conditions).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"popupConfig":{"description":"kind=popup: Ausloeser + Anzeige-Regeln.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"blocks":{"description":"ENTWURFS-Baum — nur im Detail lesbar, per PATCH schreibbar (EditAuthorizationGuard).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"BuilderPage-builder.write.jsonMergePatch":{"type":"object","description":"Baukasten-Flaeche (Doc 35, ENT-BUILDER-01/-03): Seite, Vorlage, Popup, Abschnitt.\n- Entwurfs-Baum (`blocks`) nur im Detail/Write; das Ausgelieferte ist immer ein Release\n- `status` abgeleitet: published (aktives Release) > scheduled (geplantes Release) > draft\n- kind=template/popup brauchen zusaetzlich template.manage/popup.manage (Processor).","properties":{"name":{"type":["string","null"]},"kind":{"description":"page|template|popup|section — nur beim Anlegen schreibbar.","type":["string","null"]},"templateKind":{"description":"kind=template: header|footer|page|landing|blog-archive|blog-post|search|error|maintenance.","type":["string","null"]},"locale":{"type":["string","null"]},"locales":{"type":["array","null"],"items":{"type":"string"}},"seoI18n":{"description":"Kopf-Uebersteuerungen je Sprache — plus `_bindings` (Doc 37 §7.5): dynamisches SEO einer\n`collection-page`-Vorlage, je Feld `{dynamic: 'item.<feld>', fallback?}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"themeUlid":{"description":"Theme-Zuordnung per ULID; leerer String loest die Zuordnung (Standard-Theme der Marke).","type":["string","null"]},"slug":{"type":["string","null"]},"metaTitle":{"type":["string","null"]},"metaDescription":{"type":["string","null"]},"canonicalUrl":{"type":["string","null"]},"robotsIndex":{"type":["boolean","null"]},"robotsFollow":{"type":["boolean","null"]},"ogImageFileUlid":{"type":["string","null"]},"structuredDataType":{"type":["string","null"]},"structuredDataJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"displayConditions":{"description":"kind=template: Anzeige-Bedingungen (Praesentationslogik, keine Automation-Conditions).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"popupConfig":{"description":"kind=popup: Ausloeser + Anzeige-Regeln.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"blocks":{"description":"ENTWURFS-Baum — nur im Detail lesbar, per PATCH schreibbar (EditAuthorizationGuard).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"BuilderPage.jsonld-builder.list":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"description":"page|template|popup|section — nur beim Anlegen schreibbar.","type":["string","null"]},"templateKind":{"description":"kind=template: header|footer|page|landing|blog-archive|blog-post|search|error|maintenance.","type":["string","null"]},"locale":{"type":["string","null"]},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"themeUlid":{"description":"Theme-Zuordnung per ULID; leerer String loest die Zuordnung (Standard-Theme der Marke).","type":["string","null"]},"slug":{"type":["string","null"]},"status":{"description":"draft|published|scheduled.","type":["string","null"]},"publishedAt":{"type":["string","null"]},"scheduledFor":{"type":["string","null"]},"publishedVersionNo":{"type":["integer","null"]},"documentExists":{"description":"Wurde schon einmal Inhalt geschrieben (Document-Kernel-Dokument vorhanden)?","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Baukasten-Flaeche (Doc 35, ENT-BUILDER-01/-03): Seite, Vorlage, Popup, Abschnitt.\n- Entwurfs-Baum (`blocks`) nur im Detail/Write; das Ausgelieferte ist immer ein Release\n- `status` abgeleitet: published (aktives Release) > scheduled (geplantes Release) > draft\n- kind=template/popup brauchen zusaetzlich template.manage/popup.manage (Processor)."},"BuilderPage.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"description":"page|template|popup|section — nur beim Anlegen schreibbar.","type":["string","null"]},"templateKind":{"description":"kind=template: header|footer|page|landing|blog-archive|blog-post|search|error|maintenance.","type":["string","null"]},"locale":{"type":["string","null"]},"locales":{"type":["array","null"],"items":{"type":"string"}},"seoI18n":{"description":"Kopf-Uebersteuerungen je Sprache — plus `_bindings` (Doc 37 §7.5): dynamisches SEO einer\n`collection-page`-Vorlage, je Feld `{dynamic: 'item.<feld>', fallback?}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"themeUlid":{"description":"Theme-Zuordnung per ULID; leerer String loest die Zuordnung (Standard-Theme der Marke).","type":["string","null"]},"slug":{"type":["string","null"]},"metaTitle":{"type":["string","null"]},"metaDescription":{"type":["string","null"]},"canonicalUrl":{"type":["string","null"]},"robotsIndex":{"type":["boolean","null"]},"robotsFollow":{"type":["boolean","null"]},"ogImageFileUlid":{"type":["string","null"]},"structuredDataType":{"type":["string","null"]},"structuredDataJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"displayConditions":{"description":"kind=template: Anzeige-Bedingungen (Praesentationslogik, keine Automation-Conditions).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"popupConfig":{"description":"kind=popup: Ausloeser + Anzeige-Regeln.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"blocks":{"description":"ENTWURFS-Baum — nur im Detail lesbar, per PATCH schreibbar (EditAuthorizationGuard).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"status":{"description":"draft|published|scheduled.","type":["string","null"]},"publishedAt":{"type":["string","null"]},"scheduledFor":{"type":["string","null"]},"publishedVersionNo":{"type":["integer","null"]},"documentExists":{"description":"Wurde schon einmal Inhalt geschrieben (Document-Kernel-Dokument vorhanden)?","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Baukasten-Flaeche (Doc 35, ENT-BUILDER-01/-03): Seite, Vorlage, Popup, Abschnitt.\n- Entwurfs-Baum (`blocks`) nur im Detail/Write; das Ausgelieferte ist immer ein Release\n- `status` abgeleitet: published (aktives Release) > scheduled (geplantes Release) > draft\n- kind=template/popup brauchen zusaetzlich template.manage/popup.manage (Processor)."},"BuilderPageAudit-builder.read":{"type":"object","description":"Pruefhinweise des ENTWURFS (B18 + AP 2.4): a11y-/SEO-/Kontrast-Befunde live im Editor —\ndieselben Befunde, die beim Release-Bau in metricsJson.findings protokolliert werden.","properties":{"ulid":{"description":"Die Flaeche, zu der die Befunde gehoeren.","type":["string","null"]},"findings":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"BuilderPageAudit.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Die Flaeche, zu der die Befunde gehoeren.","type":["string","null"]},"findings":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Pruefhinweise des ENTWURFS (B18 + AP 2.4): a11y-/SEO-/Kontrast-Befunde live im Editor —\ndieselben Befunde, die beim Release-Bau in metricsJson.findings protokolliert werden."},"BuilderPagePreview-builder.read":{"type":"object","description":"Vorschau des ENTWURFS: vollstaendiges HTML-Dokument, Ad-hoc gerendert OHNE\nRelease-Persistierung ({@see \\Octi\\Plugin\\Builder\\Service\\BuilderReleaseBuilder::buildPreviewHtml}).","properties":{"ulid":{"description":"Die Flaeche, deren Entwurf gerendert wurde.","type":["string","null"]},"html":{"type":["string","null"]}}},"BuilderPagePreview.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Die Flaeche, deren Entwurf gerendert wurde.","type":["string","null"]},"html":{"type":["string","null"]}}}],"description":"Vorschau des ENTWURFS: vollstaendiges HTML-Dokument, Ad-hoc gerendert OHNE\nRelease-Persistierung ({@see \\Octi\\Plugin\\Builder\\Service\\BuilderReleaseBuilder::buildPreviewHtml})."},"BuilderRelease":{"type":"object","description":"Release-Sicht einer Flaeche (ENT-BUILDER-01: das ERZEUGNIS) + die Veroeffentlichungs-\nHandlungen. Ein Release ist unveraenderlich — Zurueckrollen aktiviert ein aelteres.","properties":{"ulid":{"type":["string","null"]},"releaseUlid":{"description":"Alias des Identifiers — vertraglich zugesagter Antwort-Schluessel der Publish-Aktionen.","type":["string","null"]},"versionNo":{"type":["integer","null"]},"locale":{"description":"Sprache des Erzeugnisses (ENT-BUILDER-12: ein Release je Ziel-Sprache, Set = versionNo).","type":["string","null"]},"state":{"description":"ready|scheduled|active|superseded.","type":["string","null"]},"publishedAt":{"type":["string","null"]},"scheduledFor":{"type":["string","null"]},"metrics":{"description":"Messwerte des Erzeugnisses: `{domNodes, htmlBytes, cssBytes, findings: Anzahl}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"createdBy":{"type":["string","null"]}}},"BuilderRelease-builder.read":{"type":"object","description":"Release-Sicht einer Flaeche (ENT-BUILDER-01: das ERZEUGNIS) + die Veroeffentlichungs-\nHandlungen. Ein Release ist unveraenderlich — Zurueckrollen aktiviert ein aelteres.","properties":{"ulid":{"type":["string","null"]},"releaseUlid":{"description":"Alias des Identifiers — vertraglich zugesagter Antwort-Schluessel der Publish-Aktionen.","type":["string","null"]},"versionNo":{"type":["integer","null"]},"locale":{"description":"Sprache des Erzeugnisses (ENT-BUILDER-12: ein Release je Ziel-Sprache, Set = versionNo).","type":["string","null"]},"state":{"description":"ready|scheduled|active|superseded.","type":["string","null"]},"publishedAt":{"type":["string","null"]},"scheduledFor":{"type":["string","null"]},"metrics":{"description":"Messwerte des Erzeugnisses: `{domNodes, htmlBytes, cssBytes, findings: Anzahl}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"createdBy":{"type":["string","null"]}}},"BuilderRelease.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"releaseUlid":{"description":"Alias des Identifiers — vertraglich zugesagter Antwort-Schluessel der Publish-Aktionen.","type":["string","null"]},"versionNo":{"type":["integer","null"]},"locale":{"description":"Sprache des Erzeugnisses (ENT-BUILDER-12: ein Release je Ziel-Sprache, Set = versionNo).","type":["string","null"]},"state":{"description":"ready|scheduled|active|superseded.","type":["string","null"]},"publishedAt":{"type":["string","null"]},"scheduledFor":{"type":["string","null"]},"metrics":{"description":"Messwerte des Erzeugnisses: `{domNodes, htmlBytes, cssBytes, findings: Anzahl}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"createdBy":{"type":["string","null"]}}}],"description":"Release-Sicht einer Flaeche (ENT-BUILDER-01: das ERZEUGNIS) + die Veroeffentlichungs-\nHandlungen. Ein Release ist unveraenderlich — Zurueckrollen aktiviert ein aelteres."},"BuilderStyleClass-builder.read":{"type":"object","description":"Wiederverwendbare Stil-Klassen (ENT-BUILDER-17, Doc 37 §6.2).\n\nEine Klasse wirkt auf JEDE Fläche, die sie referenziert — deshalb hängt das Ändern am eigenen\nRecht `builder.class.manage`, nicht am Seiten-Recht. Zuweisen an einem Baustein reicht dagegen\n`builder.class.view` plus das übliche Stil-Recht an der Fläche.","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"description":"CSS-Adresse: `.obc-<slug>`. Wird aus dem Namen abgeleitet, wenn nicht gesetzt.","type":["string","null"]},"kind":{"description":"`class` (benannt, referenziert) oder `tag` (Grundstil eines HTML-Tags).","type":["string","null"]},"tag":{"description":"nur kind=tag.","type":["string","null"]},"comboParents":{"description":"Kombi-Klasse: ULIDs der Eltern (höchstens zwei)","type":["array","null"],"items":{"type":"string"}},"styles":{"description":"`{base:{style,states}, breakpoints:{…}}`","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"description":"Marken-Scope; `null` = markenübergreifend.","type":["integer","null"]},"version":{"type":["integer","null"]},"updatedAt":{"type":["string","null"]}}},"BuilderStyleClass-builder.write":{"type":"object","description":"Wiederverwendbare Stil-Klassen (ENT-BUILDER-17, Doc 37 §6.2).\n\nEine Klasse wirkt auf JEDE Fläche, die sie referenziert — deshalb hängt das Ändern am eigenen\nRecht `builder.class.manage`, nicht am Seiten-Recht. Zuweisen an einem Baustein reicht dagegen\n`builder.class.view` plus das übliche Stil-Recht an der Fläche.","properties":{"name":{"type":["string","null"]},"slug":{"description":"CSS-Adresse: `.obc-<slug>`. Wird aus dem Namen abgeleitet, wenn nicht gesetzt.","type":["string","null"]},"kind":{"description":"`class` (benannt, referenziert) oder `tag` (Grundstil eines HTML-Tags).","type":["string","null"]},"tag":{"description":"nur kind=tag.","type":["string","null"]},"comboParents":{"description":"Kombi-Klasse: ULIDs der Eltern (höchstens zwei)","type":["array","null"],"items":{"type":"string"}},"styles":{"description":"`{base:{style,states}, breakpoints:{…}}`","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"description":"Marken-Scope; `null` = markenübergreifend.","type":["integer","null"]}}},"BuilderStyleClass-builder.write.jsonMergePatch":{"type":"object","description":"Wiederverwendbare Stil-Klassen (ENT-BUILDER-17, Doc 37 §6.2).\n\nEine Klasse wirkt auf JEDE Fläche, die sie referenziert — deshalb hängt das Ändern am eigenen\nRecht `builder.class.manage`, nicht am Seiten-Recht. Zuweisen an einem Baustein reicht dagegen\n`builder.class.view` plus das übliche Stil-Recht an der Fläche.","properties":{"name":{"type":["string","null"]},"slug":{"description":"CSS-Adresse: `.obc-<slug>`. Wird aus dem Namen abgeleitet, wenn nicht gesetzt.","type":["string","null"]},"kind":{"description":"`class` (benannt, referenziert) oder `tag` (Grundstil eines HTML-Tags).","type":["string","null"]},"tag":{"description":"nur kind=tag.","type":["string","null"]},"comboParents":{"description":"Kombi-Klasse: ULIDs der Eltern (höchstens zwei)","type":["array","null"],"items":{"type":"string"}},"styles":{"description":"`{base:{style,states}, breakpoints:{…}}`","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"description":"Marken-Scope; `null` = markenübergreifend.","type":["integer","null"]}}},"BuilderStyleClass.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"description":"CSS-Adresse: `.obc-<slug>`. Wird aus dem Namen abgeleitet, wenn nicht gesetzt.","type":["string","null"]},"kind":{"description":"`class` (benannt, referenziert) oder `tag` (Grundstil eines HTML-Tags).","type":["string","null"]},"tag":{"description":"nur kind=tag.","type":["string","null"]},"comboParents":{"description":"Kombi-Klasse: ULIDs der Eltern (höchstens zwei)","type":["array","null"],"items":{"type":"string"}},"styles":{"description":"`{base:{style,states}, breakpoints:{…}}`","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"description":"Marken-Scope; `null` = markenübergreifend.","type":["integer","null"]},"version":{"type":["integer","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Wiederverwendbare Stil-Klassen (ENT-BUILDER-17, Doc 37 §6.2).\n\nEine Klasse wirkt auf JEDE Fläche, die sie referenziert — deshalb hängt das Ändern am eigenen\nRecht `builder.class.manage`, nicht am Seiten-Recht. Zuweisen an einem Baustein reicht dagegen\n`builder.class.view` plus das übliche Stil-Recht an der Fläche."},"BuilderTheme-builder.list":{"type":"object","description":"Design-Token-Satz (ENT-BUILDER-05): Farbrollen hell/dunkel, Typo, Abstaende, Radien,\nSchatten, Bruchpunkte + der EINE versionierte Eigen-CSS-Pfad je Site.\n- jedes Update legt VORHER eine BuilderThemeVersion mit dem alten Stand an und hebt cssVersion\n- isDefault=true nimmt anderen Themes derselben Marke den Default.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"isDefault":{"description":"Standard-Theme der Marke (Fallback fuer Seiten ohne Zuordnung).","type":["boolean","null"]},"cssVersion":{"description":"Hochzaehlende CSS-Version (read-only, Cache-Busting).","type":["integer","null"]},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"BuilderTheme-builder.read":{"type":"object","description":"Design-Token-Satz (ENT-BUILDER-05): Farbrollen hell/dunkel, Typo, Abstaende, Radien,\nSchatten, Bruchpunkte + der EINE versionierte Eigen-CSS-Pfad je Site.\n- jedes Update legt VORHER eine BuilderThemeVersion mit dem alten Stand an und hebt cssVersion\n- isDefault=true nimmt anderen Themes derselben Marke den Default.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"isDefault":{"description":"Standard-Theme der Marke (Fallback fuer Seiten ohne Zuordnung).","type":["boolean","null"]},"tokensJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"breakpointsJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customCss":{"description":"Der EINE Site-Eigen-CSS-Pfad; leerer String loescht ihn.","type":["string","null"]},"cssVersion":{"description":"Hochzaehlende CSS-Version (read-only, Cache-Busting).","type":["integer","null"]},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"BuilderTheme-builder.write":{"type":"object","description":"Design-Token-Satz (ENT-BUILDER-05): Farbrollen hell/dunkel, Typo, Abstaende, Radien,\nSchatten, Bruchpunkte + der EINE versionierte Eigen-CSS-Pfad je Site.\n- jedes Update legt VORHER eine BuilderThemeVersion mit dem alten Stand an und hebt cssVersion\n- isDefault=true nimmt anderen Themes derselben Marke den Default.","properties":{"name":{"type":["string","null"]},"isDefault":{"description":"Standard-Theme der Marke (Fallback fuer Seiten ohne Zuordnung).","type":["boolean","null"]},"tokensJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"breakpointsJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customCss":{"description":"Der EINE Site-Eigen-CSS-Pfad; leerer String loescht ihn.","type":["string","null"]},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]}}},"BuilderTheme-builder.write.jsonMergePatch":{"type":"object","description":"Design-Token-Satz (ENT-BUILDER-05): Farbrollen hell/dunkel, Typo, Abstaende, Radien,\nSchatten, Bruchpunkte + der EINE versionierte Eigen-CSS-Pfad je Site.\n- jedes Update legt VORHER eine BuilderThemeVersion mit dem alten Stand an und hebt cssVersion\n- isDefault=true nimmt anderen Themes derselben Marke den Default.","properties":{"name":{"type":["string","null"]},"isDefault":{"description":"Standard-Theme der Marke (Fallback fuer Seiten ohne Zuordnung).","type":["boolean","null"]},"tokensJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"breakpointsJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customCss":{"description":"Der EINE Site-Eigen-CSS-Pfad; leerer String loescht ihn.","type":["string","null"]},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]}}},"BuilderTheme.jsonld-builder.list":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"isDefault":{"description":"Standard-Theme der Marke (Fallback fuer Seiten ohne Zuordnung).","type":["boolean","null"]},"cssVersion":{"description":"Hochzaehlende CSS-Version (read-only, Cache-Busting).","type":["integer","null"]},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Design-Token-Satz (ENT-BUILDER-05): Farbrollen hell/dunkel, Typo, Abstaende, Radien,\nSchatten, Bruchpunkte + der EINE versionierte Eigen-CSS-Pfad je Site.\n- jedes Update legt VORHER eine BuilderThemeVersion mit dem alten Stand an und hebt cssVersion\n- isDefault=true nimmt anderen Themes derselben Marke den Default."},"BuilderTheme.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"isDefault":{"description":"Standard-Theme der Marke (Fallback fuer Seiten ohne Zuordnung).","type":["boolean","null"]},"tokensJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"breakpointsJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customCss":{"description":"Der EINE Site-Eigen-CSS-Pfad; leerer String loescht ihn.","type":["string","null"]},"cssVersion":{"description":"Hochzaehlende CSS-Version (read-only, Cache-Busting).","type":["integer","null"]},"brandId":{"description":"Marke; nur beim Anlegen schreibbar (null = markenuebergreifend).","type":["integer","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Design-Token-Satz (ENT-BUILDER-05): Farbrollen hell/dunkel, Typo, Abstaende, Radien,\nSchatten, Bruchpunkte + der EINE versionierte Eigen-CSS-Pfad je Site.\n- jedes Update legt VORHER eine BuilderThemeVersion mit dem alten Stand an und hebt cssVersion\n- isDefault=true nimmt anderen Themes derselben Marke den Default."},"BuilderThemeVersion-builder.read":{"type":"object","description":"Historien-Zeilen eines Themes (ENT-BUILDER-05: versionierter Eigen-CSS-Pfad) —\nunveraenderlich; Wiederherstellen laeuft ueber POST /themes/{ulid}/restore.","properties":{"ulid":{"type":["string","null"]},"versionNo":{"type":["integer","null"]},"tokensJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"breakpointsJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customCss":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"createdBy":{"type":["string","null"]}}},"BuilderThemeVersion.jsonld-builder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"versionNo":{"type":["integer","null"]},"tokensJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"breakpointsJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customCss":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"createdBy":{"type":["string","null"]}}}],"description":"Historien-Zeilen eines Themes (ENT-BUILDER-05: versionierter Eigen-CSS-Pfad) —\nunveraenderlich; Wiederherstellen laeuft ueber POST /themes/{ulid}/restore."},"BusinessHours-business_hours.read":{"type":"object","description":"Geschäftszeiten/Feiertagskalender als Daten (04-04 §3/§6/AK11) für die SLA-Fristenrechnung.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"timezone":{"type":["string","null"]},"weekly":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"holidays":{"type":["array","null"],"items":{"type":"string"}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"BusinessHours-business_hours.update.jsonMergePatch":{"type":"object","description":"Geschäftszeiten/Feiertagskalender als Daten (04-04 §3/§6/AK11) für die SLA-Fristenrechnung.","properties":{"label":{"type":["string","null"]},"timezone":{"type":["string","null"]},"weekly":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"holidays":{"type":["array","null"],"items":{"type":"string"}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"BusinessHours-business_hours.write":{"type":"object","description":"Geschäftszeiten/Feiertagskalender als Daten (04-04 §3/§6/AK11) für die SLA-Fristenrechnung.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"timezone":{"type":["string","null"]},"weekly":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"holidays":{"type":["array","null"],"items":{"type":"string"}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"BusinessHours.jsonld-business_hours.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"timezone":{"type":["string","null"]},"weekly":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"holidays":{"type":["array","null"],"items":{"type":"string"}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Geschäftszeiten/Feiertagskalender als Daten (04-04 §3/§6/AK11) für die SLA-Fristenrechnung."},"CannedResponse-canned.read":{"type":"object","description":"Textbaustein/Makro (04-04 §4.2, S4-1) — Platzhalter {{customer}}, {{ticketNumber}}, {{agent}}\nbeim Einfügen ersetzt.","properties":{"ulid":{"type":["string","null"]},"title":{"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"variables":{"type":["array","null"],"items":{"type":"string"}},"scope":{"enum":["global","brand","personal"],"description":"global|brand|personal.","type":["string","null"]},"brandId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]}},"required":["title","bodyHtml"]},"CannedResponse-canned.write":{"type":"object","description":"Textbaustein/Makro (04-04 §4.2, S4-1) — Platzhalter {{customer}}, {{ticketNumber}}, {{agent}}\nbeim Einfügen ersetzt.","required":["title","bodyHtml"],"properties":{"title":{"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"variables":{"type":["array","null"],"items":{"type":"string"}},"scope":{"enum":["global","brand","personal"],"description":"global|brand|personal.","type":["string","null"]},"brandId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]}}},"CannedResponse-canned.write.jsonMergePatch":{"type":"object","description":"Textbaustein/Makro (04-04 §4.2, S4-1) — Platzhalter {{customer}}, {{ticketNumber}}, {{agent}}\nbeim Einfügen ersetzt.","properties":{"title":{"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"variables":{"type":["array","null"],"items":{"type":"string"}},"scope":{"enum":["global","brand","personal"],"description":"global|brand|personal.","type":["string","null"]},"brandId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]}}},"CannedResponse.jsonld-canned.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"title":{"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"variables":{"type":["array","null"],"items":{"type":"string"}},"scope":{"enum":["global","brand","personal"],"description":"global|brand|personal.","type":["string","null"]},"brandId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]}},"required":["title","bodyHtml"]}],"description":"Textbaustein/Makro (04-04 §4.2, S4-1) — Platzhalter {{customer}}, {{ticketNumber}}, {{agent}}\nbeim Einfügen ersetzt."},"Capacity-capacity.read":{"type":"object","description":"Kapazität je Mitarbeiter/Periode (04-09 §4.1, §6.1) — read-only Aggregat.\nFilter: from/to/granularity(day|week|month)/employeeId/includeFreelancers.\nPeriode liefert: gross/absence/holiday/reserve/available.","properties":{"key":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"name":{"type":["string","null"]},"external":{"type":["boolean","null"]},"granularity":{"type":["string","null"]},"periods":{"description":"je Periode: key/periodStart/periodEnd/gross/absence/holiday/reserve/available","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Capacity.jsonld-capacity.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"name":{"type":["string","null"]},"external":{"type":["boolean","null"]},"granularity":{"type":["string","null"]},"periods":{"description":"je Periode: key/periodStart/periodEnd/gross/absence/holiday/reserve/available","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Kapazität je Mitarbeiter/Periode (04-09 §4.1, §6.1) — read-only Aggregat.\nFilter: from/to/granularity(day|week|month)/employeeId/includeFreelancers.\nPeriode liefert: gross/absence/holiday/reserve/available."},"ChannelConnectorType-channel_connector_type.read":{"type":"object","description":"Die Konnektor-Bibliothek als Katalog (Doc 25 AP 9.1).\n\n**Dieselbe Entscheidung wie beim Flow-Baustein (AP 8.4):** die Kanal-Maske kennt keinen\nKonnektor namentlich, sondern liest Fähigkeiten und Konfigurationsfelder hier. Stünde der\nKatalog im Frontend, bliebe ein Konnektor aus einem fremden Plugin unkonfigurierbar.","properties":{"type":{"type":["string","null"]},"labelKey":{"type":["string","null"]},"capabilities":{"type":"object","additionalProperties":{"type":"boolean"}},"schema":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ChannelConnectorType.jsonld-channel_connector_type.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"type":{"type":["string","null"]},"labelKey":{"type":["string","null"]},"capabilities":{"type":"object","additionalProperties":{"type":"boolean"}},"schema":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Die Konnektor-Bibliothek als Katalog (Doc 25 AP 9.1).\n\n**Dieselbe Entscheidung wie beim Flow-Baustein (AP 8.4):** die Kanal-Maske kennt keinen\nKonnektor namentlich, sondern liest Fähigkeiten und Konfigurationsfelder hier. Stünde der\nKatalog im Frontend, bliebe ein Konnektor aus einem fremden Plugin unkonfigurierbar."},"ChannelListing-channel_listing.read":{"type":"object","description":"Ein Artikel IN einem Kanal (Doc 25 AP 9.1 — Endgate „Listing-Lifecycle via API/MCP\").\n\nDer Lebenslauf steht vollständig hier: anlegen (`draft`) → senden (`published`) → zurückziehen\n(`unpublished`) → wieder senden. `error` ist kein Endzustand, sondern ein Zwischenstand mit\nBegründung — der nächste Lauf ist die Gelegenheit, an der er sich einrenkt.","properties":{"ulid":{"type":["string","null"]},"channelUlid":{"type":["string","null"]},"channelName":{"type":["string","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"sku":{"type":["string","null"]},"externalId":{"type":["string","null"]},"status":{"type":["string","null"]},"overrides":{"description":"Nur die Abweichungen: `title`, `description`, `priceAmount` (Cent), `imageUrls`, `attributes`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"effectivePriceAmount":{"description":"Aufgelöster Kanalpreis in Cent (Überschreibung oder Kernel-Pipeline).","type":["integer","null"]},"allocatedQty":{"description":"Menge, die dieser Kanal sehen darf (nach Sockel und Anteil).","type":["number","null"]},"lastError":{"type":["string","null"]},"lastSyncedAt":{"type":["string","null"]}}},"ChannelListing-channel_listing.write":{"type":"object","description":"Ein Artikel IN einem Kanal (Doc 25 AP 9.1 — Endgate „Listing-Lifecycle via API/MCP\").\n\nDer Lebenslauf steht vollständig hier: anlegen (`draft`) → senden (`published`) → zurückziehen\n(`unpublished`) → wieder senden. `error` ist kein Endzustand, sondern ein Zwischenstand mit\nBegründung — der nächste Lauf ist die Gelegenheit, an der er sich einrenkt.","properties":{"channelUlid":{"type":["string","null"]},"productId":{"type":["integer","null"]},"overrides":{"description":"Nur die Abweichungen: `title`, `description`, `priceAmount` (Cent), `imageUrls`, `attributes`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ChannelListing-channel_listing.write.jsonMergePatch":{"type":"object","description":"Ein Artikel IN einem Kanal (Doc 25 AP 9.1 — Endgate „Listing-Lifecycle via API/MCP\").\n\nDer Lebenslauf steht vollständig hier: anlegen (`draft`) → senden (`published`) → zurückziehen\n(`unpublished`) → wieder senden. `error` ist kein Endzustand, sondern ein Zwischenstand mit\nBegründung — der nächste Lauf ist die Gelegenheit, an der er sich einrenkt.","properties":{"channelUlid":{"type":["string","null"]},"productId":{"type":["integer","null"]},"overrides":{"description":"Nur die Abweichungen: `title`, `description`, `priceAmount` (Cent), `imageUrls`, `attributes`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ChannelListing.jsonld-channel_listing.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"channelUlid":{"type":["string","null"]},"channelName":{"type":["string","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"sku":{"type":["string","null"]},"externalId":{"type":["string","null"]},"status":{"type":["string","null"]},"overrides":{"description":"Nur die Abweichungen: `title`, `description`, `priceAmount` (Cent), `imageUrls`, `attributes`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"effectivePriceAmount":{"description":"Aufgelöster Kanalpreis in Cent (Überschreibung oder Kernel-Pipeline).","type":["integer","null"]},"allocatedQty":{"description":"Menge, die dieser Kanal sehen darf (nach Sockel und Anteil).","type":["number","null"]},"lastError":{"type":["string","null"]},"lastSyncedAt":{"type":["string","null"]}}}],"description":"Ein Artikel IN einem Kanal (Doc 25 AP 9.1 — Endgate „Listing-Lifecycle via API/MCP\").\n\nDer Lebenslauf steht vollständig hier: anlegen (`draft`) → senden (`published`) → zurückziehen\n(`unpublished`) → wieder senden. `error` ist kein Endzustand, sondern ein Zwischenstand mit\nBegründung — der nächste Lauf ist die Gelegenheit, an der er sich einrenkt."},"ClarificationCase-clarification_case.read":{"type":"object","description":"Klärfälle aus dem Lager (Doc 25 AP 4.2 / B3).\n\nLesen und Auflösen — angelegt werden sie nicht von Hand, sondern aus dem Scan-Flow\n(`/v1/wms/pick-lists/{ulid}/shortage`). Ein Klärfall ohne Fehlmenge dahinter wäre eine Notiz,\nund dafür gibt es Notizen.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"reason":{"description":"shortage|not_found|damaged|expired|skipped.","type":["string","null"]},"status":{"description":"open|resolved.","type":["string","null"]},"qtyMissing":{"type":["string","null"]},"orderId":{"type":["integer","null"]},"orderNumber":{"description":"Auftragsnummer, serverseitig aufgelöst (null ohne OctiSalesOrder).","type":["string","null"]},"productId":{"type":["integer","null"]},"pickListId":{"type":["integer","null"]},"note":{"type":["string","null"]},"resolution":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"ClarificationCase-clarification_case.write":{"type":"object","description":"Klärfälle aus dem Lager (Doc 25 AP 4.2 / B3).\n\nLesen und Auflösen — angelegt werden sie nicht von Hand, sondern aus dem Scan-Flow\n(`/v1/wms/pick-lists/{ulid}/shortage`). Ein Klärfall ohne Fehlmenge dahinter wäre eine Notiz,\nund dafür gibt es Notizen.","properties":{"resolution":{"type":["string","null"]}}},"ClarificationCase.jsonld-clarification_case.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"reason":{"description":"shortage|not_found|damaged|expired|skipped.","type":["string","null"]},"status":{"description":"open|resolved.","type":["string","null"]},"qtyMissing":{"type":["string","null"]},"orderId":{"type":["integer","null"]},"orderNumber":{"description":"Auftragsnummer, serverseitig aufgelöst (null ohne OctiSalesOrder).","type":["string","null"]},"productId":{"type":["integer","null"]},"pickListId":{"type":["integer","null"]},"note":{"type":["string","null"]},"resolution":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Klärfälle aus dem Lager (Doc 25 AP 4.2 / B3).\n\nLesen und Auflösen — angelegt werden sie nicht von Hand, sondern aus dem Scan-Flow\n(`/v1/wms/pick-lists/{ulid}/shortage`). Ein Klärfall ohne Fehlmenge dahinter wäre eine Notiz,\nund dafür gibt es Notizen."},"Communication-communication.read":{"type":"object","description":"- Kommunikations-Thread über alle Objekte\n- Rechteprüfung objektbezogen in Provider/Processor\n- Collection-Filter: subjectType + subjectId.","properties":{"ulid":{"type":["string","null"]},"subjectType":{"description":"- Validierung dynamisch gegen Resolver-Registry, nicht feste Liste\n- Plugin-Typen nur bei aktivem Plugin; Dritt-Plugins ergänzen ohne Core-Edit (Audit A-3).","type":["string","null"]},"subjectId":{"type":["string","null"]},"visibility":{"enum":["internal","customer"],"default":"internal","type":"string"},"type":{"enum":["comment","note","email","call","meeting","system"],"default":"comment","type":"string"},"direction":{"type":["string","null"]},"channel":{"description":"Outbound-Kanal des Beitrags (K1: `email`/`whatsapp`/…); nur kundengerichtete in/out-Einträge. Read-only.","type":["string","null"]},"deliveryStatus":{"description":"Zustell-Zustand der (jüngsten) OutboundDelivery: pending|sent|failed|suppressed. Read-only.","type":["string","null"]},"deliveryRecipient":{"description":"Empfänger-Adresse der (jüngsten) OutboundDelivery. Read-only.","type":["string","null"]},"authorId":{"type":["integer","null"]},"authorName":{"type":["string","null"]},"contactId":{"type":["integer","null"]},"contactName":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"subject":{"type":["string","null"]},"body":{"default":"","type":"string"},"bodyFormat":{"default":"html","type":"string"},"pinned":{"default":false,"type":"boolean"},"externalVisible":{"description":"Für externe Mitwirkende sichtbar? (Doc 27 Stufe 7, E-4 — „rotes Auge\")\nDefault true; Verbergen ist die bewusste Einzelaktion. Gilt je Beitrag, nicht je Thread.","default":true,"type":"boolean"},"attachmentIds":{"type":["array","null"],"items":{"type":"string"}},"relatedTicketId":{"type":["integer","null"]},"relatedTicketRef":{"type":["string","null"]},"relatedTicketCode":{"description":"Kundenseitige Vorgangsnummer des führenden Tickets — die nach außen kommunizierte ID.","type":["string","null"]},"relatedTicketUlid":{"description":"ULID des führenden Tickets (Doc 43) — Sprungziel `/tickets/{ulid}` statt der Ticket-Liste; auch in der POST-Antwort.","type":["string","null"]},"meta":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"reactions":{"description":"Emoji-Reaktionen (Doc 27 0.3): {emoji => [userId, …]}. Read-only im normalen Thread;\ngeändert ausschließlich über die reactions-Action.","type":"object","additionalProperties":{"type":"array","items":{"type":"integer"}}},"myReactions":{"description":"Emojis, die der aktuelle Nutzer gesetzt hat (für Hervorhebung im Frontend — dieses kennt keine\nnumerische User-ID).","type":"array","items":{"type":"string"}},"createdAt":{"type":["string","null"],"format":"date-time"},"createdBy":{"type":["string","null"]}},"required":["subjectType","subjectId","body"]},"Communication-communication.write":{"type":"object","description":"- Kommunikations-Thread über alle Objekte\n- Rechteprüfung objektbezogen in Provider/Processor\n- Collection-Filter: subjectType + subjectId.","required":["subjectType","subjectId","body"],"properties":{"subjectType":{"description":"- Validierung dynamisch gegen Resolver-Registry, nicht feste Liste\n- Plugin-Typen nur bei aktivem Plugin; Dritt-Plugins ergänzen ohne Core-Edit (Audit A-3).","type":["string","null"]},"subjectId":{"type":["string","null"]},"visibility":{"enum":["internal","customer"],"default":"internal","type":"string"},"type":{"enum":["comment","note","email","call","meeting","system"],"default":"comment","type":"string"},"authorId":{"type":["integer","null"]},"contactId":{"type":["integer","null"]},"customerId":{"type":["integer","null"]},"subject":{"type":["string","null"]},"body":{"default":"","type":"string"},"bodyFormat":{"default":"html","type":"string"},"pinned":{"default":false,"type":"boolean"},"externalVisible":{"description":"Für externe Mitwirkende sichtbar? (Doc 27 Stufe 7, E-4 — „rotes Auge\")\nDefault true; Verbergen ist die bewusste Einzelaktion. Gilt je Beitrag, nicht je Thread.","default":true,"type":"boolean"},"attachmentIds":{"type":["array","null"],"items":{"type":"string"}},"emoji":{"description":"Nur für die reactions-Action (Body {emoji}) — kein regulär persistiertes Feld.","type":["string","null"]}}},"Communication-communication.write.jsonMergePatch":{"type":"object","description":"- Kommunikations-Thread über alle Objekte\n- Rechteprüfung objektbezogen in Provider/Processor\n- Collection-Filter: subjectType + subjectId.","properties":{"subjectType":{"description":"- Validierung dynamisch gegen Resolver-Registry, nicht feste Liste\n- Plugin-Typen nur bei aktivem Plugin; Dritt-Plugins ergänzen ohne Core-Edit (Audit A-3).","type":["string","null"]},"subjectId":{"type":["string","null"]},"visibility":{"enum":["internal","customer"],"default":"internal","type":"string"},"type":{"enum":["comment","note","email","call","meeting","system"],"default":"comment","type":"string"},"authorId":{"type":["integer","null"]},"contactId":{"type":["integer","null"]},"customerId":{"type":["integer","null"]},"subject":{"type":["string","null"]},"body":{"default":"","type":"string"},"bodyFormat":{"default":"html","type":"string"},"pinned":{"default":false,"type":"boolean"},"externalVisible":{"description":"Für externe Mitwirkende sichtbar? (Doc 27 Stufe 7, E-4 — „rotes Auge\")\nDefault true; Verbergen ist die bewusste Einzelaktion. Gilt je Beitrag, nicht je Thread.","default":true,"type":"boolean"},"attachmentIds":{"type":["array","null"],"items":{"type":"string"}},"emoji":{"description":"Nur für die reactions-Action (Body {emoji}) — kein regulär persistiertes Feld.","type":["string","null"]}}},"Communication.jsonld-communication.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"subjectType":{"description":"- Validierung dynamisch gegen Resolver-Registry, nicht feste Liste\n- Plugin-Typen nur bei aktivem Plugin; Dritt-Plugins ergänzen ohne Core-Edit (Audit A-3).","type":["string","null"]},"subjectId":{"type":["string","null"]},"visibility":{"enum":["internal","customer"],"default":"internal","type":"string"},"type":{"enum":["comment","note","email","call","meeting","system"],"default":"comment","type":"string"},"direction":{"type":["string","null"]},"channel":{"description":"Outbound-Kanal des Beitrags (K1: `email`/`whatsapp`/…); nur kundengerichtete in/out-Einträge. Read-only.","type":["string","null"]},"deliveryStatus":{"description":"Zustell-Zustand der (jüngsten) OutboundDelivery: pending|sent|failed|suppressed. Read-only.","type":["string","null"]},"deliveryRecipient":{"description":"Empfänger-Adresse der (jüngsten) OutboundDelivery. Read-only.","type":["string","null"]},"authorId":{"type":["integer","null"]},"authorName":{"type":["string","null"]},"contactId":{"type":["integer","null"]},"contactName":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"subject":{"type":["string","null"]},"body":{"default":"","type":"string"},"bodyFormat":{"default":"html","type":"string"},"pinned":{"default":false,"type":"boolean"},"externalVisible":{"description":"Für externe Mitwirkende sichtbar? (Doc 27 Stufe 7, E-4 — „rotes Auge\")\nDefault true; Verbergen ist die bewusste Einzelaktion. Gilt je Beitrag, nicht je Thread.","default":true,"type":"boolean"},"attachmentIds":{"type":["array","null"],"items":{"type":"string"}},"relatedTicketId":{"type":["integer","null"]},"relatedTicketRef":{"type":["string","null"]},"relatedTicketCode":{"description":"Kundenseitige Vorgangsnummer des führenden Tickets — die nach außen kommunizierte ID.","type":["string","null"]},"relatedTicketUlid":{"description":"ULID des führenden Tickets (Doc 43) — Sprungziel `/tickets/{ulid}` statt der Ticket-Liste; auch in der POST-Antwort.","type":["string","null"]},"meta":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"reactions":{"description":"Emoji-Reaktionen (Doc 27 0.3): {emoji => [userId, …]}. Read-only im normalen Thread;\ngeändert ausschließlich über die reactions-Action.","type":"object","additionalProperties":{"type":"array","items":{"type":"integer"}}},"myReactions":{"description":"Emojis, die der aktuelle Nutzer gesetzt hat (für Hervorhebung im Frontend — dieses kennt keine\nnumerische User-ID).","type":"array","items":{"type":"string"}},"createdAt":{"type":["string","null"],"format":"date-time"},"createdBy":{"type":["string","null"]}},"required":["subjectType","subjectId","body"]}],"description":"- Kommunikations-Thread über alle Objekte\n- Rechteprüfung objektbezogen in Provider/Processor\n- Collection-Filter: subjectType + subjectId."},"ConnectAuthMethod-connect_auth_method.read":{"type":"object","description":"Die Anmelde-Arten als Katalog (Doc 25 AP 8.6).\n\n- dieselbe Begründung wie beim Baustein-Katalog: die Oberfläche kennt keine Anmelde-Art\n  namentlich, sonst bekäme eine aus einem Fremd-Plugin nie eine Eingabemaske\n- `requiredSecrets` sagt der Einrichtung, WAS in der Integration hinterlegt sein muss","properties":{"type":{"type":["string","null"]},"labelKey":{"type":["string","null"]},"requiredSecrets":{"description":"Geheimnis-Schlüssel, die in der Integration hinterlegt sein müssen.","type":"array","items":{"type":"string"}},"schema":{"description":"Nicht-geheime Konfigurationsfelder (Form wie beim Baustein-Katalog).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ConnectAuthMethod.jsonld-connect_auth_method.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"type":{"type":["string","null"]},"labelKey":{"type":["string","null"]},"requiredSecrets":{"description":"Geheimnis-Schlüssel, die in der Integration hinterlegt sein müssen.","type":"array","items":{"type":"string"}},"schema":{"description":"Nicht-geheime Konfigurationsfelder (Form wie beim Baustein-Katalog).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Die Anmelde-Arten als Katalog (Doc 25 AP 8.6).\n\n- dieselbe Begründung wie beim Baustein-Katalog: die Oberfläche kennt keine Anmelde-Art\n  namentlich, sonst bekäme eine aus einem Fremd-Plugin nie eine Eingabemaske\n- `requiredSecrets` sagt der Einrichtung, WAS in der Integration hinterlegt sein muss"},"ConnectFlow-connect_flow.read":{"type":"object","description":"Flow inklusive Bausteinen (Doc 25 Stufe 8, Spec 04-56 §5).\n\n**Vollständig über die API, und das ist Absicht (B6 Fähigkeit 11):** eine KI kann über MCP eine\nIntegration anlegen, sie testen und am Journal debuggen. Kein Wettbewerber kann das — aber nur,\nwenn wirklich JEDE Operation hier steht und nicht die Hälfte im Editor versteckt ist.\n\n`nodes` schreiben = voller Ersatz des Bauplans; ein Flow wird als Ganzes gepflegt.","properties":{"ulid":{"type":["string","null"]},"flowKey":{"maxLength":100,"description":"Stabiler Schlüssel — Kennung für Export/Import und für den Aufruf aus einer Automation.","type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"triggerType":{"enum":["event","cron","webhook","manual"],"description":"event | cron | webhook | manual.","type":["string","null"]},"triggerConfig":{"description":"Trigger-Parameter: `cron` → `{\"cron\":\"0 3 * * *\"}`; `event`/`manual`/`webhook` → `{}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"webhookScheme":{"maxLength":40,"description":"Signatur-Verfahren des eingehenden Webhooks; die verfügbaren nennt `GET /v1/connect/webhook-schemes`.","type":["string","null"]},"hasWebhookSecret":{"description":"Ist ein Geheimnis hinterlegt? (read-only — der Wert selbst bleibt geheim).","type":["boolean","null"]},"webhookPath":{"description":"Vollständiger Endpunkt des eingehenden Webhooks (read-only; nur bei `triggerType=webhook`).","type":["string","null"]},"queueName":{"maxLength":60,"type":["string","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"runAsUserUlid":{"description":"Benutzer, unter dessen Rechten der Flow das eigene System schreibt (ULID).","type":["string","null"]},"active":{"type":["boolean","null"]},"variables":{"description":"Startwerte als `{{variable.<name>}}`. Geheimnisse gehören NICHT hierher.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"testPayload":{"description":"Testdaten des Ablaufs (Doc 38 Stufe 6) — der Auslöse-Payload für den Probelauf im Editor.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"nodes":{"description":"Bauplan; Schreiben ersetzt ihn vollständig. Je Eintrag: `nodeKey`, `type`, `label`,\n`config`, `parentKey?`, `branch?`, `sortOrder?`, `enabled?`, `retryPolicy?`, `retryMax?`,\n`stopOnError?`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"edges":{"description":"Die Verbindungen zwischen den Bausteinen (Doc 38 Stufe 2).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"lastRunAt":{"type":["string","null"]},"valid":{"description":"Antwort von `validate`/`activate`: ist der Bauplan sauber?","type":["boolean","null"]},"errors":{"description":"Antwort von `validate`/`activate`: die Mängel als Text — aufgelöst in der Sprache der\nAnfrage (Audit R32-P2-5; die Meldungen selbst tragen einen Katalog-Schlüssel).","type":"array","items":{"type":"string"}},"runUlid":{"description":"Antwort von `test`/`run`: der erzeugte Lauf.","type":["string","null"]},"runStatus":{"description":"Antwort von `test`/`run`: Zustand des Laufs (bei `test` bereits ein Endzustand).","type":["string","null"]},"bundle":{"description":"`export` liefert es, `import` verlangt es: der transportfähige Bauplan samt Abhängigkeiten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"bundleCreated":{"description":"Antwort von `import`: wurde ein Flow NEU angelegt (true) oder ein bestehender ersetzt?","type":["boolean","null"]},"missingFlows":{"description":"Antwort von `import`: Unter-Flows, auf die der Bauplan verweist und die es hier nicht gibt.","type":"array","items":{"type":"string"}}}},"ConnectFlow-connect_flow.write":{"type":"object","description":"Flow inklusive Bausteinen (Doc 25 Stufe 8, Spec 04-56 §5).\n\n**Vollständig über die API, und das ist Absicht (B6 Fähigkeit 11):** eine KI kann über MCP eine\nIntegration anlegen, sie testen und am Journal debuggen. Kein Wettbewerber kann das — aber nur,\nwenn wirklich JEDE Operation hier steht und nicht die Hälfte im Editor versteckt ist.\n\n`nodes` schreiben = voller Ersatz des Bauplans; ein Flow wird als Ganzes gepflegt.","properties":{"flowKey":{"maxLength":100,"description":"Stabiler Schlüssel — Kennung für Export/Import und für den Aufruf aus einer Automation.","type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"triggerType":{"enum":["event","cron","webhook","manual"],"description":"event | cron | webhook | manual.","type":["string","null"]},"triggerConfig":{"description":"Trigger-Parameter: `cron` → `{\"cron\":\"0 3 * * *\"}`; `event`/`manual`/`webhook` → `{}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"webhookSecret":{"description":"Nur SCHREIBEN: das Webhook-Geheimnis wird verschlüsselt abgelegt und nie zurückgegeben.","type":["string","null"]},"webhookScheme":{"maxLength":40,"description":"Signatur-Verfahren des eingehenden Webhooks; die verfügbaren nennt `GET /v1/connect/webhook-schemes`.","type":["string","null"]},"queueName":{"maxLength":60,"type":["string","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"runAsUserUlid":{"description":"Benutzer, unter dessen Rechten der Flow das eigene System schreibt (ULID).","type":["string","null"]},"variables":{"description":"Startwerte als `{{variable.<name>}}`. Geheimnisse gehören NICHT hierher.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"node":{"description":"EIN Baustein — für die Einzel-Operationen (Doc 38 Stufe 7). Form wie ein Eintrag in `nodes`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"after":{"description":"Baustein-Schlüssel, hinter den der neue gehängt wird (Einzel-Anlage).","type":["string","null"]},"testPayload":{"description":"Testdaten des Ablaufs (Doc 38 Stufe 6) — der Auslöse-Payload für den Probelauf im Editor.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"nodes":{"description":"Bauplan; Schreiben ersetzt ihn vollständig. Je Eintrag: `nodeKey`, `type`, `label`,\n`config`, `parentKey?`, `branch?`, `sortOrder?`, `enabled?`, `retryPolicy?`, `retryMax?`,\n`stopOnError?`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"edges":{"description":"Die Verbindungen zwischen den Bausteinen (Doc 38 Stufe 2).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"payload":{"description":"Nur `test`/`run`: Payload, der zum `{{trigger}}` des Laufs wird.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"bundle":{"description":"`export` liefert es, `import` verlangt es: der transportfähige Bauplan samt Abhängigkeiten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ConnectFlow-connect_flow.write.jsonMergePatch":{"type":"object","description":"Flow inklusive Bausteinen (Doc 25 Stufe 8, Spec 04-56 §5).\n\n**Vollständig über die API, und das ist Absicht (B6 Fähigkeit 11):** eine KI kann über MCP eine\nIntegration anlegen, sie testen und am Journal debuggen. Kein Wettbewerber kann das — aber nur,\nwenn wirklich JEDE Operation hier steht und nicht die Hälfte im Editor versteckt ist.\n\n`nodes` schreiben = voller Ersatz des Bauplans; ein Flow wird als Ganzes gepflegt.","properties":{"flowKey":{"maxLength":100,"description":"Stabiler Schlüssel — Kennung für Export/Import und für den Aufruf aus einer Automation.","type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"triggerType":{"enum":["event","cron","webhook","manual"],"description":"event | cron | webhook | manual.","type":["string","null"]},"triggerConfig":{"description":"Trigger-Parameter: `cron` → `{\"cron\":\"0 3 * * *\"}`; `event`/`manual`/`webhook` → `{}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"webhookSecret":{"description":"Nur SCHREIBEN: das Webhook-Geheimnis wird verschlüsselt abgelegt und nie zurückgegeben.","type":["string","null"]},"webhookScheme":{"maxLength":40,"description":"Signatur-Verfahren des eingehenden Webhooks; die verfügbaren nennt `GET /v1/connect/webhook-schemes`.","type":["string","null"]},"queueName":{"maxLength":60,"type":["string","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"runAsUserUlid":{"description":"Benutzer, unter dessen Rechten der Flow das eigene System schreibt (ULID).","type":["string","null"]},"variables":{"description":"Startwerte als `{{variable.<name>}}`. Geheimnisse gehören NICHT hierher.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"node":{"description":"EIN Baustein — für die Einzel-Operationen (Doc 38 Stufe 7). Form wie ein Eintrag in `nodes`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"after":{"description":"Baustein-Schlüssel, hinter den der neue gehängt wird (Einzel-Anlage).","type":["string","null"]},"testPayload":{"description":"Testdaten des Ablaufs (Doc 38 Stufe 6) — der Auslöse-Payload für den Probelauf im Editor.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"nodes":{"description":"Bauplan; Schreiben ersetzt ihn vollständig. Je Eintrag: `nodeKey`, `type`, `label`,\n`config`, `parentKey?`, `branch?`, `sortOrder?`, `enabled?`, `retryPolicy?`, `retryMax?`,\n`stopOnError?`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"edges":{"description":"Die Verbindungen zwischen den Bausteinen (Doc 38 Stufe 2).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"payload":{"description":"Nur `test`/`run`: Payload, der zum `{{trigger}}` des Laufs wird.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"bundle":{"description":"`export` liefert es, `import` verlangt es: der transportfähige Bauplan samt Abhängigkeiten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ConnectFlow.ConnectScheduledRunResult-connect_flow.read":{"type":"object","description":"Flow inklusive Bausteinen (Doc 25 Stufe 8, Spec 04-56 §5).\n\n**Vollständig über die API, und das ist Absicht (B6 Fähigkeit 11):** eine KI kann über MCP eine\nIntegration anlegen, sie testen und am Journal debuggen. Kein Wettbewerber kann das — aber nur,\nwenn wirklich JEDE Operation hier steht und nicht die Hälfte im Editor versteckt ist.\n\n`nodes` schreiben = voller Ersatz des Bauplans; ein Flow wird als Ganzes gepflegt.","properties":{"startedFlowKeys":{"description":"Schlüssel der gestarteten Flows.","type":"array","items":{"type":"string"}},"started":{"description":"Anzahl der gestarteten Läufe.","type":"integer"},"startedFlows":{"description":"Je gestartetem Flow: `flowKey`, `triggerType` (cron|polling) und `detail` (Ausdruck bzw.","type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}}}},"ConnectFlow.ConnectScheduledRunResult.jsonld-connect_flow.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"startedFlowKeys":{"description":"Schlüssel der gestarteten Flows.","type":"array","items":{"type":"string"}},"started":{"description":"Anzahl der gestarteten Läufe.","type":"integer"},"startedFlows":{"description":"Je gestartetem Flow: `flowKey`, `triggerType` (cron|polling) und `detail` (Ausdruck bzw.","type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}}}}],"description":"Flow inklusive Bausteinen (Doc 25 Stufe 8, Spec 04-56 §5).\n\n**Vollständig über die API, und das ist Absicht (B6 Fähigkeit 11):** eine KI kann über MCP eine\nIntegration anlegen, sie testen und am Journal debuggen. Kein Wettbewerber kann das — aber nur,\nwenn wirklich JEDE Operation hier steht und nicht die Hälfte im Editor versteckt ist.\n\n`nodes` schreiben = voller Ersatz des Bauplans; ein Flow wird als Ganzes gepflegt."},"ConnectFlow.jsonld-connect_flow.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"flowKey":{"maxLength":100,"description":"Stabiler Schlüssel — Kennung für Export/Import und für den Aufruf aus einer Automation.","type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"triggerType":{"enum":["event","cron","webhook","manual"],"description":"event | cron | webhook | manual.","type":["string","null"]},"triggerConfig":{"description":"Trigger-Parameter: `cron` → `{\"cron\":\"0 3 * * *\"}`; `event`/`manual`/`webhook` → `{}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"webhookScheme":{"maxLength":40,"description":"Signatur-Verfahren des eingehenden Webhooks; die verfügbaren nennt `GET /v1/connect/webhook-schemes`.","type":["string","null"]},"hasWebhookSecret":{"description":"Ist ein Geheimnis hinterlegt? (read-only — der Wert selbst bleibt geheim).","type":["boolean","null"]},"webhookPath":{"description":"Vollständiger Endpunkt des eingehenden Webhooks (read-only; nur bei `triggerType=webhook`).","type":["string","null"]},"queueName":{"maxLength":60,"type":["string","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"runAsUserUlid":{"description":"Benutzer, unter dessen Rechten der Flow das eigene System schreibt (ULID).","type":["string","null"]},"active":{"type":["boolean","null"]},"variables":{"description":"Startwerte als `{{variable.<name>}}`. Geheimnisse gehören NICHT hierher.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"testPayload":{"description":"Testdaten des Ablaufs (Doc 38 Stufe 6) — der Auslöse-Payload für den Probelauf im Editor.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"nodes":{"description":"Bauplan; Schreiben ersetzt ihn vollständig. Je Eintrag: `nodeKey`, `type`, `label`,\n`config`, `parentKey?`, `branch?`, `sortOrder?`, `enabled?`, `retryPolicy?`, `retryMax?`,\n`stopOnError?`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"edges":{"description":"Die Verbindungen zwischen den Bausteinen (Doc 38 Stufe 2).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"lastRunAt":{"type":["string","null"]},"valid":{"description":"Antwort von `validate`/`activate`: ist der Bauplan sauber?","type":["boolean","null"]},"errors":{"description":"Antwort von `validate`/`activate`: die Mängel als Text — aufgelöst in der Sprache der\nAnfrage (Audit R32-P2-5; die Meldungen selbst tragen einen Katalog-Schlüssel).","type":"array","items":{"type":"string"}},"runUlid":{"description":"Antwort von `test`/`run`: der erzeugte Lauf.","type":["string","null"]},"runStatus":{"description":"Antwort von `test`/`run`: Zustand des Laufs (bei `test` bereits ein Endzustand).","type":["string","null"]},"bundle":{"description":"`export` liefert es, `import` verlangt es: der transportfähige Bauplan samt Abhängigkeiten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"bundleCreated":{"description":"Antwort von `import`: wurde ein Flow NEU angelegt (true) oder ein bestehender ersetzt?","type":["boolean","null"]},"missingFlows":{"description":"Antwort von `import`: Unter-Flows, auf die der Bauplan verweist und die es hier nicht gibt.","type":"array","items":{"type":"string"}}}}],"description":"Flow inklusive Bausteinen (Doc 25 Stufe 8, Spec 04-56 §5).\n\n**Vollständig über die API, und das ist Absicht (B6 Fähigkeit 11):** eine KI kann über MCP eine\nIntegration anlegen, sie testen und am Journal debuggen. Kein Wettbewerber kann das — aber nur,\nwenn wirklich JEDE Operation hier steht und nicht die Hälfte im Editor versteckt ist.\n\n`nodes` schreiben = voller Ersatz des Bauplans; ein Flow wird als Ganzes gepflegt."},"ConnectFlowVersion":{"type":"object","description":"Fassungen eines Bauplans (Doc 38 Stufe 7, IC14).\n\nJedes Speichern hebt den Stand VOR der Änderung auf. Zurückholen ist damit kein Kunststück,\nsondern ein Klick — und selbst wieder rückholbar.","properties":{"versionNo":{"type":["integer","null"]},"ulid":{"type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"createdBy":{"type":["string","null"]},"nodeCount":{"description":"Anzahl Bausteine in dieser Fassung — die Liste soll ohne Aufklappen etwas sagen.","type":["integer","null"]},"snapshot":{"description":"Vollständiger Schnappschuss (nur Einzelsicht).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ConnectFlowVersion-connect_flow_version.read":{"type":"object","description":"Fassungen eines Bauplans (Doc 38 Stufe 7, IC14).\n\nJedes Speichern hebt den Stand VOR der Änderung auf. Zurückholen ist damit kein Kunststück,\nsondern ein Klick — und selbst wieder rückholbar.","properties":{"versionNo":{"type":["integer","null"]},"ulid":{"type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"createdBy":{"type":["string","null"]},"nodeCount":{"description":"Anzahl Bausteine in dieser Fassung — die Liste soll ohne Aufklappen etwas sagen.","type":["integer","null"]},"snapshot":{"description":"Vollständiger Schnappschuss (nur Einzelsicht).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ConnectFlowVersion.jsonld-connect_flow_version.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"versionNo":{"type":["integer","null"]},"ulid":{"type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"createdBy":{"type":["string","null"]},"nodeCount":{"description":"Anzahl Bausteine in dieser Fassung — die Liste soll ohne Aufklappen etwas sagen.","type":["integer","null"]},"snapshot":{"description":"Vollständiger Schnappschuss (nur Einzelsicht).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"Fassungen eines Bauplans (Doc 38 Stufe 7, IC14).\n\nJedes Speichern hebt den Stand VOR der Änderung auf. Zurückholen ist damit kein Kunststück,\nsondern ein Klick — und selbst wieder rückholbar."},"ConnectLookupTable-connect_lookup.read":{"type":"object","description":"Zuordnungstabelle (Doc 25 AP 8.2, B6 Fähigkeit 4) — Fremdwert → eigener Wert.\n\nDer klassische Fall: Zahlart-Codes je Shop. In der Zuordnung selbst wären das lange\nWenn-Dann-Ketten; als Tabelle ist es eine Liste, die auch ein Nicht-Entwickler pflegt.","properties":{"ulid":{"type":["string","null"]},"tableKey":{"maxLength":100,"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"entries":{"description":"Fremdwert → eigener Wert.","type":["object","null"],"additionalProperties":{"type":"string"}},"fallback":{"maxLength":255,"description":"Wert für unbekannte Eingaben; leer = unverändert durchreichen.","type":["string","null"]},"strict":{"description":"Unbekannter Wert = Fehler statt Fallback.","type":["boolean","null"]}}},"ConnectLookupTable-connect_lookup.write":{"type":"object","description":"Zuordnungstabelle (Doc 25 AP 8.2, B6 Fähigkeit 4) — Fremdwert → eigener Wert.\n\nDer klassische Fall: Zahlart-Codes je Shop. In der Zuordnung selbst wären das lange\nWenn-Dann-Ketten; als Tabelle ist es eine Liste, die auch ein Nicht-Entwickler pflegt.","properties":{"tableKey":{"maxLength":100,"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"entries":{"description":"Fremdwert → eigener Wert.","type":["object","null"],"additionalProperties":{"type":"string"}},"fallback":{"maxLength":255,"description":"Wert für unbekannte Eingaben; leer = unverändert durchreichen.","type":["string","null"]},"strict":{"description":"Unbekannter Wert = Fehler statt Fallback.","type":["boolean","null"]}}},"ConnectLookupTable-connect_lookup.write.jsonMergePatch":{"type":"object","description":"Zuordnungstabelle (Doc 25 AP 8.2, B6 Fähigkeit 4) — Fremdwert → eigener Wert.\n\nDer klassische Fall: Zahlart-Codes je Shop. In der Zuordnung selbst wären das lange\nWenn-Dann-Ketten; als Tabelle ist es eine Liste, die auch ein Nicht-Entwickler pflegt.","properties":{"tableKey":{"maxLength":100,"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"entries":{"description":"Fremdwert → eigener Wert.","type":["object","null"],"additionalProperties":{"type":"string"}},"fallback":{"maxLength":255,"description":"Wert für unbekannte Eingaben; leer = unverändert durchreichen.","type":["string","null"]},"strict":{"description":"Unbekannter Wert = Fehler statt Fallback.","type":["boolean","null"]}}},"ConnectLookupTable.jsonld-connect_lookup.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"tableKey":{"maxLength":100,"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"entries":{"description":"Fremdwert → eigener Wert.","type":["object","null"],"additionalProperties":{"type":"string"}},"fallback":{"maxLength":255,"description":"Wert für unbekannte Eingaben; leer = unverändert durchreichen.","type":["string","null"]},"strict":{"description":"Unbekannter Wert = Fehler statt Fallback.","type":["boolean","null"]}}}],"description":"Zuordnungstabelle (Doc 25 AP 8.2, B6 Fähigkeit 4) — Fremdwert → eigener Wert.\n\nDer klassische Fall: Zahlart-Codes je Shop. In der Zuordnung selbst wären das lange\nWenn-Dann-Ketten; als Tabelle ist es eine Liste, die auch ein Nicht-Entwickler pflegt."},"ConnectMapping-connect_mapping.read":{"type":"object","description":"Wiederverwendbare Feld-Zuordnung (Doc 25 AP 8.2, B6 Fähigkeit 4).\n\n**`preview` ist der wichtigste Endpunkt hier.** Eine Zuordnung ohne Vorschau gegen eine ECHTE\nPayload ist eine Behauptung; erst die Vorschau macht sie prüfbar, bevor ein Fremdsystem sie zu\nsehen bekommt.","properties":{"ulid":{"type":["string","null"]},"mappingKey":{"maxLength":100,"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"rules":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"preserveEmpty":{"description":"Leere Ziel-Felder erhalten statt weglassen (für strikte Ziel-APIs).","type":["boolean","null"]},"sampleSource":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"result":{"description":"Antwort von `preview`: das Ergebnis der Zuordnung.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"errors":{"description":"Antwort von `preview`: was schiefging (z. B. fehlende Pflichtfelder).","type":"array","items":{"type":"string"}}}},"ConnectMapping-connect_mapping.write":{"type":"object","description":"Wiederverwendbare Feld-Zuordnung (Doc 25 AP 8.2, B6 Fähigkeit 4).\n\n**`preview` ist der wichtigste Endpunkt hier.** Eine Zuordnung ohne Vorschau gegen eine ECHTE\nPayload ist eine Behauptung; erst die Vorschau macht sie prüfbar, bevor ein Fremdsystem sie zu\nsehen bekommt.","properties":{"mappingKey":{"maxLength":100,"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"rules":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"preserveEmpty":{"description":"Leere Ziel-Felder erhalten statt weglassen (für strikte Ziel-APIs).","type":["boolean","null"]},"sampleSource":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"source":{"description":"Nur `preview`: Payload, gegen die geprüft wird (sonst `sampleSource`).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ConnectMapping-connect_mapping.write.jsonMergePatch":{"type":"object","description":"Wiederverwendbare Feld-Zuordnung (Doc 25 AP 8.2, B6 Fähigkeit 4).\n\n**`preview` ist der wichtigste Endpunkt hier.** Eine Zuordnung ohne Vorschau gegen eine ECHTE\nPayload ist eine Behauptung; erst die Vorschau macht sie prüfbar, bevor ein Fremdsystem sie zu\nsehen bekommt.","properties":{"mappingKey":{"maxLength":100,"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"rules":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"preserveEmpty":{"description":"Leere Ziel-Felder erhalten statt weglassen (für strikte Ziel-APIs).","type":["boolean","null"]},"sampleSource":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"source":{"description":"Nur `preview`: Payload, gegen die geprüft wird (sonst `sampleSource`).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ConnectMapping.jsonld-connect_mapping.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"mappingKey":{"maxLength":100,"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"rules":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"preserveEmpty":{"description":"Leere Ziel-Felder erhalten statt weglassen (für strikte Ziel-APIs).","type":["boolean","null"]},"sampleSource":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"result":{"description":"Antwort von `preview`: das Ergebnis der Zuordnung.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"errors":{"description":"Antwort von `preview`: was schiefging (z. B. fehlende Pflichtfelder).","type":"array","items":{"type":"string"}}}}],"description":"Wiederverwendbare Feld-Zuordnung (Doc 25 AP 8.2, B6 Fähigkeit 4).\n\n**`preview` ist der wichtigste Endpunkt hier.** Eine Zuordnung ohne Vorschau gegen eine ECHTE\nPayload ist eine Behauptung; erst die Vorschau macht sie prüfbar, bevor ein Fremdsystem sie zu\nsehen bekommt."},"ConnectNodeGroup-connect_node_group.read":{"type":"object","description":"Die Systeme, mit denen Abläufe sprechen können (Doc 39 Stufe 7).\n\n**Eigene Liste statt Wiederholung an jedem Baustein.** Die Bildmarken sind echte Firmenlogos und\ndamit einige Kilobyte gross; an 112 Bausteinen gehängt stünde dieselbe Grafik bis zu sechsmal je\nAnbindung in derselben Antwort. Hier steht jede Gruppe genau einmal.\n\nNebeneffekt, der genauso zählt: eine KI sieht über MCP in EINER Liste, welche Fremdsysteme\nangebunden sind — vorher musste sie das aus der Bausteinliste erschliessen.","properties":{"key":{"type":["string","null"]},"labelKey":{"description":"Übersetzungs-Schlüssel der Überschrift.","type":["string","null"]},"color":{"description":"Hausfarbe als Hex-Wert (`#FFCC00`).","type":["string","null"]},"icon":{"description":"PrimeIcons-Schlüssel; genommen, wenn es keine Bildmarke gibt.","type":["string","null"]},"logo":{"description":"Bildmarke als Data-URI; leer bei Gruppen ohne eigene Marke.","type":["string","null"]},"nodeCount":{"description":"Wie viele Bausteine in dieser Gruppe liegen.","default":0,"type":"integer"}}},"ConnectNodeGroup.jsonld-connect_node_group.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"labelKey":{"description":"Übersetzungs-Schlüssel der Überschrift.","type":["string","null"]},"color":{"description":"Hausfarbe als Hex-Wert (`#FFCC00`).","type":["string","null"]},"icon":{"description":"PrimeIcons-Schlüssel; genommen, wenn es keine Bildmarke gibt.","type":["string","null"]},"logo":{"description":"Bildmarke als Data-URI; leer bei Gruppen ohne eigene Marke.","type":["string","null"]},"nodeCount":{"description":"Wie viele Bausteine in dieser Gruppe liegen.","default":0,"type":"integer"}}}],"description":"Die Systeme, mit denen Abläufe sprechen können (Doc 39 Stufe 7).\n\n**Eigene Liste statt Wiederholung an jedem Baustein.** Die Bildmarken sind echte Firmenlogos und\ndamit einige Kilobyte gross; an 112 Bausteinen gehängt stünde dieselbe Grafik bis zu sechsmal je\nAnbindung in derselben Antwort. Hier steht jede Gruppe genau einmal.\n\nNebeneffekt, der genauso zählt: eine KI sieht über MCP in EINER Liste, welche Fremdsysteme\nangebunden sind — vorher musste sie das aus der Bausteinliste erschliessen."},"ConnectNodeType-connect_node_type.read":{"type":"object","description":"Die Bausteinbibliothek als Katalog (Doc 25 AP 8.4, Spec 04-56 §5).\n\n**Der Editor kennt keinen einzigen Baustein-Typ namentlich.** Er fragt diesen Endpunkt und baut\ndaraus Palette und Eingabemaske. Stünde der Katalog im Frontend, bekäme ein Konnektor aus einem\nfremden Plugin nie eine Oberfläche — die Zusage „ein neuer Konnektor ist ein neuer Dienst\"\ngälte dann nur für den Lauf, nicht fürs Bauen.\n\nNebeneffekt, der genauso zählt: eine KI sieht über MCP, welche Bausteine es gibt und welche\nFelder sie brauchen, statt sie zu raten.","properties":{"type":{"type":["string","null"]},"labelKey":{"description":"Übersetzungs-Schlüssel des Anzeigenamens.","type":["string","null"]},"icon":{"description":"PrimeIcons-Schlüssel (`pi-globe`); vom Handler oder abgeleiteter Standard.","type":["string","null"]},"group":{"description":"Gruppe, in der die Bibliothek den Baustein zeigt (Doc 39 Stufe 1) — ein SYSTEM, z. B.","type":["string","null"]},"groupLabelKey":{"type":["string","null"]},"groupColor":{"description":"Hausfarbe der Gruppe als Hex-Wert — die Bibliothek färbt damit Überschrift und Karte.","type":["string","null"]},"groupIcon":{"description":"PrimeIcons-Schlüssel der Gruppe — genommen, wenn es keine Bildmarke gibt.","type":["string","null"]},"container":{"type":["boolean","null"]},"branches":{"description":"Zweige, in die Kinder gehängt werden dürfen (`then`/`else`/`body`); leer bei Nicht-Containern.","type":"array","items":{"type":"string"}},"schema":{"description":"Konfigurationsfelder — `key`, `type`, `labelKey`, optional `required`, `options`, `default`,\n`helpKey`, `expression`, `rows`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ConnectNodeType.jsonld-connect_node_type.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"type":{"type":["string","null"]},"labelKey":{"description":"Übersetzungs-Schlüssel des Anzeigenamens.","type":["string","null"]},"icon":{"description":"PrimeIcons-Schlüssel (`pi-globe`); vom Handler oder abgeleiteter Standard.","type":["string","null"]},"group":{"description":"Gruppe, in der die Bibliothek den Baustein zeigt (Doc 39 Stufe 1) — ein SYSTEM, z. B.","type":["string","null"]},"groupLabelKey":{"type":["string","null"]},"groupColor":{"description":"Hausfarbe der Gruppe als Hex-Wert — die Bibliothek färbt damit Überschrift und Karte.","type":["string","null"]},"groupIcon":{"description":"PrimeIcons-Schlüssel der Gruppe — genommen, wenn es keine Bildmarke gibt.","type":["string","null"]},"container":{"type":["boolean","null"]},"branches":{"description":"Zweige, in die Kinder gehängt werden dürfen (`then`/`else`/`body`); leer bei Nicht-Containern.","type":"array","items":{"type":"string"}},"schema":{"description":"Konfigurationsfelder — `key`, `type`, `labelKey`, optional `required`, `options`, `default`,\n`helpKey`, `expression`, `rows`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Die Bausteinbibliothek als Katalog (Doc 25 AP 8.4, Spec 04-56 §5).\n\n**Der Editor kennt keinen einzigen Baustein-Typ namentlich.** Er fragt diesen Endpunkt und baut\ndaraus Palette und Eingabemaske. Stünde der Katalog im Frontend, bekäme ein Konnektor aus einem\nfremden Plugin nie eine Oberfläche — die Zusage „ein neuer Konnektor ist ein neuer Dienst\"\ngälte dann nur für den Lauf, nicht fürs Bauen.\n\nNebeneffekt, der genauso zählt: eine KI sieht über MCP, welche Bausteine es gibt und welche\nFelder sie brauchen, statt sie zu raten."},"ConnectRun":{"type":"object","description":"Lauf-Journal (Doc 25 Stufe 8, B6 Fähigkeit 7).\n\n**Die Einzelsicht trägt die vollständigen Payloads je Baustein** — Ein- UND Ausgang. Das ist\nder Unterschied zwischen „ist fehlgeschlagen\" und „an dieser Stelle kam DAS an und DAS ging\n * raus\". Ohne sie muss man eine Integration erneut auslösen, um sie zu verstehen — und bei einer\nBestellung, die schon angelegt wurde, ist das Datenschaden statt Fehlersuche.\n\nEigenes Leserecht `connect.run.view`: in den Payloads stehen Geschäftsdaten.","properties":{"ulid":{"type":["string","null"]},"flowUlid":{"type":["string","null"]},"flowKey":{"type":["string","null"]},"flowName":{"description":"Anzeigename des Flows — die Liste zeigt den Namen, nicht den Schlüssel.","type":["string","null"]},"status":{"type":["string","null"]},"triggerSource":{"type":["string","null"]},"synchronous":{"type":["boolean","null"]},"queueName":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"durationMs":{"type":["integer","null"]},"errorMessage":{"type":["string","null"]},"resumeAt":{"description":"Wartet der Lauf: Zeitpunkt, zu dem er weiterläuft.","type":["string","null"]},"waitingAtNode":{"description":"Wartet der Lauf: Baustein, an dem er steht.","type":["string","null"]},"retryOfUlid":{"description":"Der Lauf, aus dem dieser als Wiederanlauf entstand.","type":["string","null"]},"parentRunUlid":{"description":"Eltern-Lauf beim Sub-Flow-Aufruf.","type":["string","null"]},"triggerPayload":{"description":"Auslöse-Payload — `{{trigger}}` des Laufs (nur Einzelsicht).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"steps":{"description":"Schritte mit vollständigem Ein-/Ausgang (nur Einzelsicht).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ConnectRun-connect_run.read":{"type":"object","description":"Lauf-Journal (Doc 25 Stufe 8, B6 Fähigkeit 7).\n\n**Die Einzelsicht trägt die vollständigen Payloads je Baustein** — Ein- UND Ausgang. Das ist\nder Unterschied zwischen „ist fehlgeschlagen\" und „an dieser Stelle kam DAS an und DAS ging\n * raus\". Ohne sie muss man eine Integration erneut auslösen, um sie zu verstehen — und bei einer\nBestellung, die schon angelegt wurde, ist das Datenschaden statt Fehlersuche.\n\nEigenes Leserecht `connect.run.view`: in den Payloads stehen Geschäftsdaten.","properties":{"ulid":{"type":["string","null"]},"flowUlid":{"type":["string","null"]},"flowKey":{"type":["string","null"]},"flowName":{"description":"Anzeigename des Flows — die Liste zeigt den Namen, nicht den Schlüssel.","type":["string","null"]},"status":{"type":["string","null"]},"triggerSource":{"type":["string","null"]},"synchronous":{"type":["boolean","null"]},"queueName":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"durationMs":{"type":["integer","null"]},"errorMessage":{"type":["string","null"]},"resumeAt":{"description":"Wartet der Lauf: Zeitpunkt, zu dem er weiterläuft.","type":["string","null"]},"waitingAtNode":{"description":"Wartet der Lauf: Baustein, an dem er steht.","type":["string","null"]},"retryOfUlid":{"description":"Der Lauf, aus dem dieser als Wiederanlauf entstand.","type":["string","null"]},"parentRunUlid":{"description":"Eltern-Lauf beim Sub-Flow-Aufruf.","type":["string","null"]},"triggerPayload":{"description":"Auslöse-Payload — `{{trigger}}` des Laufs (nur Einzelsicht).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"steps":{"description":"Schritte mit vollständigem Ein-/Ausgang (nur Einzelsicht).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ConnectRun.jsonld-connect_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"flowUlid":{"type":["string","null"]},"flowKey":{"type":["string","null"]},"flowName":{"description":"Anzeigename des Flows — die Liste zeigt den Namen, nicht den Schlüssel.","type":["string","null"]},"status":{"type":["string","null"]},"triggerSource":{"type":["string","null"]},"synchronous":{"type":["boolean","null"]},"queueName":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"durationMs":{"type":["integer","null"]},"errorMessage":{"type":["string","null"]},"resumeAt":{"description":"Wartet der Lauf: Zeitpunkt, zu dem er weiterläuft.","type":["string","null"]},"waitingAtNode":{"description":"Wartet der Lauf: Baustein, an dem er steht.","type":["string","null"]},"retryOfUlid":{"description":"Der Lauf, aus dem dieser als Wiederanlauf entstand.","type":["string","null"]},"parentRunUlid":{"description":"Eltern-Lauf beim Sub-Flow-Aufruf.","type":["string","null"]},"triggerPayload":{"description":"Auslöse-Payload — `{{trigger}}` des Laufs (nur Einzelsicht).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"steps":{"description":"Schritte mit vollständigem Ein-/Ausgang (nur Einzelsicht).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Lauf-Journal (Doc 25 Stufe 8, B6 Fähigkeit 7).\n\n**Die Einzelsicht trägt die vollständigen Payloads je Baustein** — Ein- UND Ausgang. Das ist\nder Unterschied zwischen „ist fehlgeschlagen\" und „an dieser Stelle kam DAS an und DAS ging\n * raus\". Ohne sie muss man eine Integration erneut auslösen, um sie zu verstehen — und bei einer\nBestellung, die schon angelegt wurde, ist das Datenschaden statt Fehlersuche.\n\nEigenes Leserecht `connect.run.view`: in den Payloads stehen Geschäftsdaten."},"ConnectStore-connect_store.read":{"type":"object","description":"Das Gedächtnis zwischen Läufen, von aussen sichtbar (Doc 38 Stufe 4).\n\nOhne diese Sicht wäre ein Abruf, der „nichts Neues\" meldet, nicht erklärbar: der Wasserstand\nsteht in der Ablage, und wer ihn nicht sehen kann, kann ihn auch nicht zurücksetzen.","properties":{"ulid":{"type":["string","null"]},"flowUlid":{"description":"ULID des Ablaufs, dem die Ablage gehört — `null` bei der gemeinsamen Ablage.","type":["string","null"]},"flowName":{"type":["string","null"]},"storeKey":{"type":["string","null"]},"value":{"type":["string","null"]},"expiresAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"ConnectStore-connect_store.write.jsonMergePatch":{"type":"object","description":"Das Gedächtnis zwischen Läufen, von aussen sichtbar (Doc 38 Stufe 4).\n\nOhne diese Sicht wäre ein Abruf, der „nichts Neues\" meldet, nicht erklärbar: der Wasserstand\nsteht in der Ablage, und wer ihn nicht sehen kann, kann ihn auch nicht zurücksetzen.","properties":{"value":{"type":["string","null"]}}},"ConnectStore.jsonld-connect_store.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"flowUlid":{"description":"ULID des Ablaufs, dem die Ablage gehört — `null` bei der gemeinsamen Ablage.","type":["string","null"]},"flowName":{"type":["string","null"]},"storeKey":{"type":["string","null"]},"value":{"type":["string","null"]},"expiresAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Das Gedächtnis zwischen Läufen, von aussen sichtbar (Doc 38 Stufe 4).\n\nOhne diese Sicht wäre ein Abruf, der „nichts Neues\" meldet, nicht erklärbar: der Wasserstand\nsteht in der Ablage, und wer ihn nicht sehen kann, kann ihn auch nicht zurücksetzen."},"ConnectTemplate-connect_template.read":{"type":"object","description":"Vorlagen-Bibliothek (Doc 25 AP 8.5, B6 Fähigkeit 10).\n\n**Eine Vorlage ist der schnellste Weg zum ersten funktionierenden Flow** — und der beste Weg,\ndie Bauform zu lernen: was sie erzeugt, ist ein ganz normaler Flow, den man danach aufmacht und\numbaut. Deshalb bringt sie keine Sonder-Objekte mit, sondern genau das, was der Editor auch\nerzeugt hätte.\n\n**Installieren aktiviert NICHT.** Was danach fehlt (Geheimnis, ausführender Benutzer), steht in\n`errors` — dieselbe Liste, die `validate` liefert.","properties":{"key":{"type":["string","null"]},"labelKey":{"type":["string","null"]},"descriptionKey":{"type":["string","null"]},"category":{"type":["string","null"]},"parameters":{"description":"Parameter des Einrichtungs-Assistenten — `key`, `type`, `labelKey`, optional `required`,\n`default`, `helpKey`, `options`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"nodeTypes":{"description":"Baustein-Typen, die die Vorlage benutzt — damit die Galerie zeigen kann, was sie tut, ohne\ndas ganze Bündel auszuliefern.","type":"array","items":{"type":"string"}},"flowUlid":{"description":"Antwort von `install`: der angelegte Flow.","type":["string","null"]},"flowKey":{"type":["string","null"]},"created":{"description":"Antwort von `install`: neu angelegt (true) oder bestehender Flow ersetzt (false).","type":["boolean","null"]},"errors":{"description":"Antwort von `install`: was vor dem Aktivieren noch fehlt.","type":"array","items":{"type":"string"}}}},"ConnectTemplate-connect_template.write":{"type":"object","description":"Vorlagen-Bibliothek (Doc 25 AP 8.5, B6 Fähigkeit 10).\n\n**Eine Vorlage ist der schnellste Weg zum ersten funktionierenden Flow** — und der beste Weg,\ndie Bauform zu lernen: was sie erzeugt, ist ein ganz normaler Flow, den man danach aufmacht und\numbaut. Deshalb bringt sie keine Sonder-Objekte mit, sondern genau das, was der Editor auch\nerzeugt hätte.\n\n**Installieren aktiviert NICHT.** Was danach fehlt (Geheimnis, ausführender Benutzer), steht in\n`errors` — dieselbe Liste, die `validate` liefert.","properties":{"parameterValues":{"description":"Nur `install`: die ausgefüllten Parameter.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ConnectTemplate.jsonld-connect_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"labelKey":{"type":["string","null"]},"descriptionKey":{"type":["string","null"]},"category":{"type":["string","null"]},"parameters":{"description":"Parameter des Einrichtungs-Assistenten — `key`, `type`, `labelKey`, optional `required`,\n`default`, `helpKey`, `options`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"nodeTypes":{"description":"Baustein-Typen, die die Vorlage benutzt — damit die Galerie zeigen kann, was sie tut, ohne\ndas ganze Bündel auszuliefern.","type":"array","items":{"type":"string"}},"flowUlid":{"description":"Antwort von `install`: der angelegte Flow.","type":["string","null"]},"flowKey":{"type":["string","null"]},"created":{"description":"Antwort von `install`: neu angelegt (true) oder bestehender Flow ersetzt (false).","type":["boolean","null"]},"errors":{"description":"Antwort von `install`: was vor dem Aktivieren noch fehlt.","type":"array","items":{"type":"string"}}}}],"description":"Vorlagen-Bibliothek (Doc 25 AP 8.5, B6 Fähigkeit 10).\n\n**Eine Vorlage ist der schnellste Weg zum ersten funktionierenden Flow** — und der beste Weg,\ndie Bauform zu lernen: was sie erzeugt, ist ein ganz normaler Flow, den man danach aufmacht und\numbaut. Deshalb bringt sie keine Sonder-Objekte mit, sondern genau das, was der Editor auch\nerzeugt hätte.\n\n**Installieren aktiviert NICHT.** Was danach fehlt (Geheimnis, ausführender Benutzer), steht in\n`errors` — dieselbe Liste, die `validate` liefert."},"ConnectWebhookScheme-connect_webhook_scheme.read":{"type":"object","description":"Die Webhook-Signatur-Verfahren als Katalog (Doc 25 AP 8.6).\n\n- speist die Auswahl an einem Flow mit Webhook-Trigger\n- `signatureHeader` sagt der Einrichtung, welche Kopfzeile das Fremdsystem senden muss","properties":{"key":{"type":["string","null"]},"labelKey":{"type":["string","null"]},"signatureHeader":{"type":["string","null"]}}},"ConnectWebhookScheme.jsonld-connect_webhook_scheme.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"labelKey":{"type":["string","null"]},"signatureHeader":{"type":["string","null"]}}}],"description":"Die Webhook-Signatur-Verfahren als Katalog (Doc 25 AP 8.6).\n\n- speist die Auswahl an einem Flow mit Webhook-Trigger\n- `signatureHeader` sagt der Einrichtung, welche Kopfzeile das Fremdsystem senden muss"},"ConstraintViolation":{"type":"object","description":"Unprocessable entity","properties":{"status":{"default":422,"type":"integer"},"violations":{"type":"array","items":{"type":"object","properties":{"propertyPath":{"type":"string","description":"The property path of the violation"},"message":{"type":"string","description":"The message associated with the violation"},"code":{"type":"string","description":"The code of the violation"},"hint":{"type":"string","description":"An extra hint to understand the violation"},"payload":{"type":"object","additionalProperties":true,"description":"The serialized payload of the violation"}},"required":["propertyPath","message"]}},"detail":{"readOnly":true,"type":"string"},"type":{"readOnly":true,"type":"string"},"title":{"readOnly":true,"type":["string","null"]},"instance":{"readOnly":true,"type":["string","null"]}}},"Contact-contact.read":{"type":"object","description":"Ansprechpartner-Resource (CRM) — org-weit, keine Marken-Trennung; Rechte über contact.*.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK zusätzlich zur ULID — für Relationsfelder (Deal.primaryContactId) und\nEntityPicker; analog {@see CustomerResource::$id}.","type":["integer","null"]},"fullName":{"description":"Anzeigename (Vor- + Nachname) für Picker/Listen.","type":["string","null"]},"customerUlid":{"type":["string","null"]},"customerName":{"description":"Anzeigename des zugeordneten Kunden (read-only) — für die globale Kontakte-Seite und Picker.","type":["string","null"]},"salutation":{"maxLength":20,"type":["string","null"]},"firstName":{"maxLength":255,"type":["string","null"]},"lastName":{"maxLength":255,"type":["string","null"]},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"aliasEmails":{"description":"Alias-E-Mails zur Kontakterkennung (AP-6.2) — zusätzlich zu {@see $email}; eingehende\nNachrichten matchen Primär- UND Alias-Adressen.","type":["array","null"],"items":{"type":"string"}},"phone":{"maxLength":50,"type":["string","null"]},"locale":{"description":"Bevorzugte Kommunikationssprache ('de','en'); steuert die Sprache ausgehender Mails.","type":["string","null"]},"mobile":{"maxLength":50,"type":["string","null"]},"position":{"maxLength":255,"type":["string","null"]},"department":{"maxLength":255,"type":["string","null"]},"role":{"maxLength":100,"description":"Kontaktrolle (S1-3, Katalog-Konvention): z.B. decision_maker | billing | technical.","type":["string","null"]},"isPrimary":{"default":false,"type":"boolean"},"channels":{"type":["object","null"],"additionalProperties":{"type":"string"}},"notes":{"type":["string","null"]},"statusId":{"type":["string","null"]},"brandId":{"description":"Marke des Kontakts (Doc 42, ENT-MARKE-01…03). Eigene Marke, NICHT die des Kunden geerbt —\nein Konzernkunde kann Ansprechpartner mehrerer Marken haben. `null` = für alle Marken\nsichtbar (Bestand vor der Umstellung).","type":["integer","null"]},"score":{"description":"Interessen-Punkte (Programm 46 F-S): die Automation `adjust_score` hebt und senkt sie\n(„Öffnung +1 / Klick +3 / ab 50 heiß\"). Nur LESEND — geschrieben wird ausschließlich über\nden {@see \\App\\Platform\\Customer\\Service\\ScoreService}, sonst gäbe es zwei Wahrheiten\nüber denselben Zähler und die Schwellen-Automation liefe gegen einen von Hand verstellten\nStand (Audit R43-27).","default":0,"type":"integer"},"tags":{"description":"Schlagwörter des Kontakts — die Tabelle `tag_assignment` ist die Wahrheit, es gibt für\nKontakte bewusst KEINE JSON-Spalte. Geschrieben wird die GANZE Liste über den einen\nSchreibweg ({@see \\App\\Platform\\Tag\\Service\\TagAssignmentService::replace()}).","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["firstName","lastName"]},"Contact-contact.write":{"type":"object","description":"Ansprechpartner-Resource (CRM) — org-weit, keine Marken-Trennung; Rechte über contact.*.","properties":{"customerUlid":{"type":["string","null"]},"salutation":{"maxLength":20,"type":["string","null"]},"firstName":{"maxLength":255,"type":["string","null"]},"lastName":{"maxLength":255,"type":["string","null"]},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"aliasEmails":{"description":"Alias-E-Mails zur Kontakterkennung (AP-6.2) — zusätzlich zu {@see $email}; eingehende\nNachrichten matchen Primär- UND Alias-Adressen.","type":["array","null"],"items":{"type":"string"}},"phone":{"maxLength":50,"type":["string","null"]},"locale":{"description":"Bevorzugte Kommunikationssprache ('de','en'); steuert die Sprache ausgehender Mails.","type":["string","null"]},"mobile":{"maxLength":50,"type":["string","null"]},"position":{"maxLength":255,"type":["string","null"]},"department":{"maxLength":255,"type":["string","null"]},"role":{"maxLength":100,"description":"Kontaktrolle (S1-3, Katalog-Konvention): z.B. decision_maker | billing | technical.","type":["string","null"]},"isPrimary":{"default":false,"type":"boolean"},"channels":{"type":["object","null"],"additionalProperties":{"type":"string"}},"notes":{"type":["string","null"]},"statusId":{"type":["string","null"]},"brandId":{"description":"Marke des Kontakts (Doc 42, ENT-MARKE-01…03). Eigene Marke, NICHT die des Kunden geerbt —\nein Konzernkunde kann Ansprechpartner mehrerer Marken haben. `null` = für alle Marken\nsichtbar (Bestand vor der Umstellung).","type":["integer","null"]},"tags":{"description":"Schlagwörter des Kontakts — die Tabelle `tag_assignment` ist die Wahrheit, es gibt für\nKontakte bewusst KEINE JSON-Spalte. Geschrieben wird die GANZE Liste über den einen\nSchreibweg ({@see \\App\\Platform\\Tag\\Service\\TagAssignmentService::replace()}).","type":["array","null"],"items":{"type":"string"}}},"required":["firstName","lastName"]},"Contact-contact.write.jsonMergePatch":{"type":"object","description":"Ansprechpartner-Resource (CRM) — org-weit, keine Marken-Trennung; Rechte über contact.*.","properties":{"customerUlid":{"type":["string","null"]},"salutation":{"maxLength":20,"type":["string","null"]},"firstName":{"maxLength":255,"type":["string","null"]},"lastName":{"maxLength":255,"type":["string","null"]},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"aliasEmails":{"description":"Alias-E-Mails zur Kontakterkennung (AP-6.2) — zusätzlich zu {@see $email}; eingehende\nNachrichten matchen Primär- UND Alias-Adressen.","type":["array","null"],"items":{"type":"string"}},"phone":{"maxLength":50,"type":["string","null"]},"locale":{"description":"Bevorzugte Kommunikationssprache ('de','en'); steuert die Sprache ausgehender Mails.","type":["string","null"]},"mobile":{"maxLength":50,"type":["string","null"]},"position":{"maxLength":255,"type":["string","null"]},"department":{"maxLength":255,"type":["string","null"]},"role":{"maxLength":100,"description":"Kontaktrolle (S1-3, Katalog-Konvention): z.B. decision_maker | billing | technical.","type":["string","null"]},"isPrimary":{"default":false,"type":"boolean"},"channels":{"type":["object","null"],"additionalProperties":{"type":"string"}},"notes":{"type":["string","null"]},"statusId":{"type":["string","null"]},"brandId":{"description":"Marke des Kontakts (Doc 42, ENT-MARKE-01…03). Eigene Marke, NICHT die des Kunden geerbt —\nein Konzernkunde kann Ansprechpartner mehrerer Marken haben. `null` = für alle Marken\nsichtbar (Bestand vor der Umstellung).","type":["integer","null"]},"tags":{"description":"Schlagwörter des Kontakts — die Tabelle `tag_assignment` ist die Wahrheit, es gibt für\nKontakte bewusst KEINE JSON-Spalte. Geschrieben wird die GANZE Liste über den einen\nSchreibweg ({@see \\App\\Platform\\Tag\\Service\\TagAssignmentService::replace()}).","type":["array","null"],"items":{"type":"string"}}}},"Contact.jsonld-contact.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK zusätzlich zur ULID — für Relationsfelder (Deal.primaryContactId) und\nEntityPicker; analog {@see CustomerResource::$id}.","type":["integer","null"]},"fullName":{"description":"Anzeigename (Vor- + Nachname) für Picker/Listen.","type":["string","null"]},"customerUlid":{"type":["string","null"]},"customerName":{"description":"Anzeigename des zugeordneten Kunden (read-only) — für die globale Kontakte-Seite und Picker.","type":["string","null"]},"salutation":{"maxLength":20,"type":["string","null"]},"firstName":{"maxLength":255,"type":["string","null"]},"lastName":{"maxLength":255,"type":["string","null"]},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"aliasEmails":{"description":"Alias-E-Mails zur Kontakterkennung (AP-6.2) — zusätzlich zu {@see $email}; eingehende\nNachrichten matchen Primär- UND Alias-Adressen.","type":["array","null"],"items":{"type":"string"}},"phone":{"maxLength":50,"type":["string","null"]},"locale":{"description":"Bevorzugte Kommunikationssprache ('de','en'); steuert die Sprache ausgehender Mails.","type":["string","null"]},"mobile":{"maxLength":50,"type":["string","null"]},"position":{"maxLength":255,"type":["string","null"]},"department":{"maxLength":255,"type":["string","null"]},"role":{"maxLength":100,"description":"Kontaktrolle (S1-3, Katalog-Konvention): z.B. decision_maker | billing | technical.","type":["string","null"]},"isPrimary":{"default":false,"type":"boolean"},"channels":{"type":["object","null"],"additionalProperties":{"type":"string"}},"notes":{"type":["string","null"]},"statusId":{"type":["string","null"]},"brandId":{"description":"Marke des Kontakts (Doc 42, ENT-MARKE-01…03). Eigene Marke, NICHT die des Kunden geerbt —\nein Konzernkunde kann Ansprechpartner mehrerer Marken haben. `null` = für alle Marken\nsichtbar (Bestand vor der Umstellung).","type":["integer","null"]},"score":{"description":"Interessen-Punkte (Programm 46 F-S): die Automation `adjust_score` hebt und senkt sie\n(„Öffnung +1 / Klick +3 / ab 50 heiß\"). Nur LESEND — geschrieben wird ausschließlich über\nden {@see \\App\\Platform\\Customer\\Service\\ScoreService}, sonst gäbe es zwei Wahrheiten\nüber denselben Zähler und die Schwellen-Automation liefe gegen einen von Hand verstellten\nStand (Audit R43-27).","default":0,"type":"integer"},"tags":{"description":"Schlagwörter des Kontakts — die Tabelle `tag_assignment` ist die Wahrheit, es gibt für\nKontakte bewusst KEINE JSON-Spalte. Geschrieben wird die GANZE Liste über den einen\nSchreibweg ({@see \\App\\Platform\\Tag\\Service\\TagAssignmentService::replace()}).","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["firstName","lastName"]}],"description":"Ansprechpartner-Resource (CRM) — org-weit, keine Marken-Trennung; Rechte über contact.*."},"ContactRole-contact_role.read":{"type":"object","description":"Kontakt-Rollen-Katalog als Daten (Doc 26 3.9, konfigurierbar). `key` = {@see \\App\\Platform\\Customer\\Entity\\Contact::$role}.\nLesen `contact.read`; Pflege `customer.config.manage` (wie Kunden-/Kontakt-Status).","required":["key","label"],"properties":{"key":{"maxLength":50,"type":["string","null"]},"label":{"maxLength":100,"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ContactRole-contact_role.update.jsonMergePatch":{"type":"object","description":"Kontakt-Rollen-Katalog als Daten (Doc 26 3.9, konfigurierbar). `key` = {@see \\App\\Platform\\Customer\\Entity\\Contact::$role}.\nLesen `contact.read`; Pflege `customer.config.manage` (wie Kunden-/Kontakt-Status).","properties":{"label":{"maxLength":100,"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ContactRole-contact_role.write":{"type":"object","description":"Kontakt-Rollen-Katalog als Daten (Doc 26 3.9, konfigurierbar). `key` = {@see \\App\\Platform\\Customer\\Entity\\Contact::$role}.\nLesen `contact.read`; Pflege `customer.config.manage` (wie Kunden-/Kontakt-Status).","required":["key","label"],"properties":{"key":{"maxLength":50,"type":["string","null"]},"label":{"maxLength":100,"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ContactRole.jsonld-contact_role.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"maxLength":50,"type":["string","null"]},"label":{"maxLength":100,"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}}],"description":"Kontakt-Rollen-Katalog als Daten (Doc 26 3.9, konfigurierbar). `key` = {@see \\App\\Platform\\Customer\\Entity\\Contact::$role}.\nLesen `contact.read`; Pflege `customer.config.manage` (wie Kunden-/Kontakt-Status)."},"ContactStatus-contact_status.read":{"type":"object","description":"Kontakt-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in Contact.statusId.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ContactStatus-contact_status.update.jsonMergePatch":{"type":"object","description":"Kontakt-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in Contact.statusId.","properties":{"label":{"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ContactStatus-contact_status.write":{"type":"object","description":"Kontakt-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in Contact.statusId.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ContactStatus.jsonld-contact_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}}],"description":"Kontakt-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in Contact.statusId."},"ContentAdapter-content_adapter.read":{"type":"object","description":"Welche Ausspiel-Ziele kann DIESE Installation bedienen? (Programm 46 E).\n\nEine eigene Liste, weil sie beim ANLEGEN des ersten Ziels gebraucht wird — da gibt es noch\nkeine Zeile, an der sie haengen koennte. Sie haengt an den installierten Plugins: ohne\nWebseiten-Modul gibt es kein `site`, ohne Verbindungs-Modul kein `connect_flow`. Genau das\nsoll die Maske zeigen, statt eine Auswahl anzubieten, die ins Leere fuehrt.","properties":{"key":{"default":"","type":"string"},"label":{"default":"","type":"string"}}},"ContentAdapter.jsonld-content_adapter.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"default":"","type":"string"},"label":{"default":"","type":"string"}}}],"description":"Welche Ausspiel-Ziele kann DIESE Installation bedienen? (Programm 46 E).\n\nEine eigene Liste, weil sie beim ANLEGEN des ersten Ziels gebraucht wird — da gibt es noch\nkeine Zeile, an der sie haengen koennte. Sie haengt an den installierten Plugins: ohne\nWebseiten-Modul gibt es kein `site`, ohne Verbindungs-Modul kein `connect_flow`. Genau das\nsoll die Maske zeigen, statt eine Auswahl anzubieten, die ins Leere fuehrt."},"ContentAi-content_ai.read":{"type":"object","description":"KI-Vorschläge der Redaktion (Programm 46 E).\n\n`kind=draft` füllt die Felder eines Inhaltstyps, `kind=seo` schlägt Titel und Beschreibung für\nSuchmaschinen vor, `kind=image` erzeugt ein Aufmacherbild. ALLE DREI liefern nur Vorschläge:\nsie landen in der Maske, gespeichert wird durch einen Menschen — und veröffentlicht durch einen\nmit dem Freigabe-Recht.\n\nDas Bild landet dabei IM SYSTEM (Dateiablage, Ordner „Inhalte / KI-Bilder\"), nicht als\nAnbieter-Adresse: die sind nach Stunden tot, und ein veröffentlichter Beitrag hätte dann ein\nBild, das verschwindet.\n\nDas SCHREIB-Recht genügt: wer Beiträge schreiben darf, darf sich dabei helfen lassen. Ein\neigenes KI-Recht wäre eine weitere Stelle, an der Deckel auseinanderlaufen können.","properties":{"id":{"type":["string","null"]},"kind":{"description":"`draft` | `seo` | `image` | `series`","type":["string","null"]},"typeKey":{"description":"Nur `kind=draft`: der Inhaltstyp, dessen Felder gefüllt werden sollen.","type":["string","null"]},"itemUlid":{"description":"Nur `kind=seo`: der Beitrag, für den vorgeschlagen wird.","type":["string","null"]},"brief":{"description":"Nur `kind=draft`: worum es gehen soll.","type":["string","null"]},"brandId":{"description":"Marke, deren Instruktion, Budget und Ablage gelten (`draft`/`series`/`image`) — Schreibrecht\ndort ist Pflicht. Bei `seo` zählt die Marke des Beitrags, nicht dieser Wert.","type":["integer","null"]},"fields":{"description":"Nur `kind=draft`: die vorgeschlagenen Feld-Werte — NUR Felder, die es im Typ gibt.","type":"object","additionalProperties":{"type":["string","null"]}},"metaTitle":{"type":["string","null"]},"metaDescription":{"type":["string","null"]},"size":{"description":"Nur `kind=image`: Kantenmass `1024x1024` | `1024x1536` | `1536x1024`.","type":["string","null"]},"fileUlid":{"description":"Nur `kind=image`: Kennung der abgelegten Bilddatei.","type":["string","null"]},"mimeType":{"description":"Nur `kind=image`: Medientyp der abgelegten Datei.","type":["string","null"]},"downloadUrl":{"description":"Nur `kind=image`: Bezugsweg der abgelegten Datei (dieselbe abgesicherte Route wie jeder Download).","type":["string","null"]},"items":{"description":"Nur `kind=series`: die vorgeschlagenen Beiträge, je Eintrag eine Feld-Ablage.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"count":{"description":"Nur `kind=series`: wie viele Beiträge gewünscht sind (2–30).","type":["integer","null"]},"aiUsed":{"description":"`false` mit leerem Ergebnis heißt: keine aktive KI — eine Auskunft, kein Serverfehler.","default":false,"type":"boolean"}}},"ContentAi-content_ai.write":{"type":"object","description":"KI-Vorschläge der Redaktion (Programm 46 E).\n\n`kind=draft` füllt die Felder eines Inhaltstyps, `kind=seo` schlägt Titel und Beschreibung für\nSuchmaschinen vor, `kind=image` erzeugt ein Aufmacherbild. ALLE DREI liefern nur Vorschläge:\nsie landen in der Maske, gespeichert wird durch einen Menschen — und veröffentlicht durch einen\nmit dem Freigabe-Recht.\n\nDas Bild landet dabei IM SYSTEM (Dateiablage, Ordner „Inhalte / KI-Bilder\"), nicht als\nAnbieter-Adresse: die sind nach Stunden tot, und ein veröffentlichter Beitrag hätte dann ein\nBild, das verschwindet.\n\nDas SCHREIB-Recht genügt: wer Beiträge schreiben darf, darf sich dabei helfen lassen. Ein\neigenes KI-Recht wäre eine weitere Stelle, an der Deckel auseinanderlaufen können.","properties":{"kind":{"description":"`draft` | `seo` | `image` | `series`","type":["string","null"]},"typeKey":{"description":"Nur `kind=draft`: der Inhaltstyp, dessen Felder gefüllt werden sollen.","type":["string","null"]},"itemUlid":{"description":"Nur `kind=seo`: der Beitrag, für den vorgeschlagen wird.","type":["string","null"]},"brief":{"description":"Nur `kind=draft`: worum es gehen soll.","type":["string","null"]},"brandId":{"description":"Marke, deren Instruktion, Budget und Ablage gelten (`draft`/`series`/`image`) — Schreibrecht\ndort ist Pflicht. Bei `seo` zählt die Marke des Beitrags, nicht dieser Wert.","type":["integer","null"]},"size":{"description":"Nur `kind=image`: Kantenmass `1024x1024` | `1024x1536` | `1536x1024`.","type":["string","null"]},"count":{"description":"Nur `kind=series`: wie viele Beiträge gewünscht sind (2–30).","type":["integer","null"]}}},"ContentAi.jsonld-content_ai.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"kind":{"description":"`draft` | `seo` | `image` | `series`","type":["string","null"]},"typeKey":{"description":"Nur `kind=draft`: der Inhaltstyp, dessen Felder gefüllt werden sollen.","type":["string","null"]},"itemUlid":{"description":"Nur `kind=seo`: der Beitrag, für den vorgeschlagen wird.","type":["string","null"]},"brief":{"description":"Nur `kind=draft`: worum es gehen soll.","type":["string","null"]},"brandId":{"description":"Marke, deren Instruktion, Budget und Ablage gelten (`draft`/`series`/`image`) — Schreibrecht\ndort ist Pflicht. Bei `seo` zählt die Marke des Beitrags, nicht dieser Wert.","type":["integer","null"]},"fields":{"description":"Nur `kind=draft`: die vorgeschlagenen Feld-Werte — NUR Felder, die es im Typ gibt.","type":"object","additionalProperties":{"type":["string","null"]}},"metaTitle":{"type":["string","null"]},"metaDescription":{"type":["string","null"]},"size":{"description":"Nur `kind=image`: Kantenmass `1024x1024` | `1024x1536` | `1536x1024`.","type":["string","null"]},"fileUlid":{"description":"Nur `kind=image`: Kennung der abgelegten Bilddatei.","type":["string","null"]},"mimeType":{"description":"Nur `kind=image`: Medientyp der abgelegten Datei.","type":["string","null"]},"downloadUrl":{"description":"Nur `kind=image`: Bezugsweg der abgelegten Datei (dieselbe abgesicherte Route wie jeder Download).","type":["string","null"]},"items":{"description":"Nur `kind=series`: die vorgeschlagenen Beiträge, je Eintrag eine Feld-Ablage.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"count":{"description":"Nur `kind=series`: wie viele Beiträge gewünscht sind (2–30).","type":["integer","null"]},"aiUsed":{"description":"`false` mit leerem Ergebnis heißt: keine aktive KI — eine Auskunft, kein Serverfehler.","default":false,"type":"boolean"}}}],"description":"KI-Vorschläge der Redaktion (Programm 46 E).\n\n`kind=draft` füllt die Felder eines Inhaltstyps, `kind=seo` schlägt Titel und Beschreibung für\nSuchmaschinen vor, `kind=image` erzeugt ein Aufmacherbild. ALLE DREI liefern nur Vorschläge:\nsie landen in der Maske, gespeichert wird durch einen Menschen — und veröffentlicht durch einen\nmit dem Freigabe-Recht.\n\nDas Bild landet dabei IM SYSTEM (Dateiablage, Ordner „Inhalte / KI-Bilder\"), nicht als\nAnbieter-Adresse: die sind nach Stunden tot, und ein veröffentlichter Beitrag hätte dann ein\nBild, das verschwindet.\n\nDas SCHREIB-Recht genügt: wer Beiträge schreiben darf, darf sich dabei helfen lassen. Ein\neigenes KI-Recht wäre eine weitere Stelle, an der Deckel auseinanderlaufen können."},"ContentChannel-content_channel.read":{"type":"object","description":"Ein Ausspiel-Ziel (Programm 46 E).\n\nEinrichtung, kein Tagesgeschaeft: ein neues Ziel bedeutet, dass jeder kuenftige Beitrag auch\ndorthin geht. Deshalb ein eigenes Recht — und deshalb ist die Liste der VERFUEGBAREN Adapter\nlesbar fuer jeden, der Beitraege pflegt: er soll sehen koennen, wohin sein Text kann.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"adapterKey":{"description":"Welcher Adapter bedient das Ziel — aus der Liste der verfügbaren.","type":["string","null"]},"adapterLabel":{"description":"Anzeigename des Adapters (nur lesend).","type":["string","null"]},"config":{"description":"Einstellungen des Adapters — seine Sache, nicht unsere.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"locales":{"description":"Sprachen, die dieses Ziel annimmt; leer = alle.","type":["array","null"],"items":{"type":"string"}},"typeKeys":{"description":"Inhaltstypen, die dieses Ziel annimmt; leer = alle.","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]},"availableAdapters":{"description":"Alle Adapter, die diese Installation bereitstellt — für die Auswahl in der Maske.","type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"createdAt":{"type":["string","null"]}}},"ContentChannel-content_channel.write":{"type":"object","description":"Ein Ausspiel-Ziel (Programm 46 E).\n\nEinrichtung, kein Tagesgeschaeft: ein neues Ziel bedeutet, dass jeder kuenftige Beitrag auch\ndorthin geht. Deshalb ein eigenes Recht — und deshalb ist die Liste der VERFUEGBAREN Adapter\nlesbar fuer jeden, der Beitraege pflegt: er soll sehen koennen, wohin sein Text kann.","properties":{"name":{"maxLength":120,"type":["string","null"]},"adapterKey":{"description":"Welcher Adapter bedient das Ziel — aus der Liste der verfügbaren.","type":["string","null"]},"config":{"description":"Einstellungen des Adapters — seine Sache, nicht unsere.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"locales":{"description":"Sprachen, die dieses Ziel annimmt; leer = alle.","type":["array","null"],"items":{"type":"string"}},"typeKeys":{"description":"Inhaltstypen, die dieses Ziel annimmt; leer = alle.","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"ContentChannel-content_channel.write.jsonMergePatch":{"type":"object","description":"Ein Ausspiel-Ziel (Programm 46 E).\n\nEinrichtung, kein Tagesgeschaeft: ein neues Ziel bedeutet, dass jeder kuenftige Beitrag auch\ndorthin geht. Deshalb ein eigenes Recht — und deshalb ist die Liste der VERFUEGBAREN Adapter\nlesbar fuer jeden, der Beitraege pflegt: er soll sehen koennen, wohin sein Text kann.","properties":{"name":{"maxLength":120,"type":["string","null"]},"adapterKey":{"description":"Welcher Adapter bedient das Ziel — aus der Liste der verfügbaren.","type":["string","null"]},"config":{"description":"Einstellungen des Adapters — seine Sache, nicht unsere.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"locales":{"description":"Sprachen, die dieses Ziel annimmt; leer = alle.","type":["array","null"],"items":{"type":"string"}},"typeKeys":{"description":"Inhaltstypen, die dieses Ziel annimmt; leer = alle.","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"ContentChannel.jsonld-content_channel.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"adapterKey":{"description":"Welcher Adapter bedient das Ziel — aus der Liste der verfügbaren.","type":["string","null"]},"adapterLabel":{"description":"Anzeigename des Adapters (nur lesend).","type":["string","null"]},"config":{"description":"Einstellungen des Adapters — seine Sache, nicht unsere.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"locales":{"description":"Sprachen, die dieses Ziel annimmt; leer = alle.","type":["array","null"],"items":{"type":"string"}},"typeKeys":{"description":"Inhaltstypen, die dieses Ziel annimmt; leer = alle.","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]},"availableAdapters":{"description":"Alle Adapter, die diese Installation bereitstellt — für die Auswahl in der Maske.","type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"createdAt":{"type":["string","null"]}}}],"description":"Ein Ausspiel-Ziel (Programm 46 E).\n\nEinrichtung, kein Tagesgeschaeft: ein neues Ziel bedeutet, dass jeder kuenftige Beitrag auch\ndorthin geht. Deshalb ein eigenes Recht — und deshalb ist die Liste der VERFUEGBAREN Adapter\nlesbar fuer jeden, der Beitraege pflegt: er soll sehen koennen, wohin sein Text kann."},"ContentItem-content_item.read":{"type":"object","description":"Ein Beitrag (Programm 46 E, ENT-MKT-08).\n\nDIE OPERATIONEN SPIEGELN DEN ZUSTANDS-AUTOMATEN, und die Rechte spiegeln die Verantwortung:\nschreiben, planen und archivieren sind `content.item.manage`; veroeffentlichen und\nzuruecknehmen sind `content.item.publish`. Der Unterschied ist die Aussenwirkung — was\neinmal gelesen wurde, holt man nicht zurueck.\n\nDER ZUSTAND HAT KEINEN SCHREIB-ZUGANG. Ihn direkt zu setzen wuerde den Automaten umgehen:\nein Sprung von `draft` nach `published` uebersprang die Fassung, den Zeitpunkt und die\nAusgabe an die Ziele. Zustaende aendert man ueber die benannten Wege.","properties":{"ulid":{"type":["string","null"]},"typeKey":{"description":"Typ-Schluessel (`blog`, …) — beim Anlegen Pflicht, danach unveraenderlich.","type":["string","null"]},"typeName":{"type":["string","null"]},"locale":{"maxLength":5,"type":["string","null"]},"slug":{"maxLength":220,"description":"Adresse des Beitrags. Ohne Angabe aus der Ueberschrift gebildet.","type":["string","null"]},"status":{"description":"Nur lesend — Zustaende aendert man über die benannten Wege.","type":["string","null"]},"fields":{"description":"Werte je Feld-Key, gepruefft gegen das Schema des Typs.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"plannedPublishAt":{"type":["string","null"]},"publishedAt":{"type":["string","null"]},"authorEmployeeId":{"type":["integer","null"]},"categories":{"type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"translationGroupUlid":{"type":["string","null"]},"seo":{"description":"Suchmaschinen-Angaben: `{metaTitle, metaDescription, canonical, robots, ogImageFileUlid}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"title":{"description":"Ueberschrift in der Sprache des Beitrags — nur lesend, aus dem Kopf-Feld des Typs.","type":["string","null"]},"locales":{"description":"Sprachen, in denen dieser Beitrag WIRKLICH Text hat.","type":"array","items":{"type":"string"}},"publications":{"description":"Stand je Ziel und Sprache — die Antwort auf „wo steht der Beitrag, und wo klemmt es?\".","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"targets":{"description":"Gewählte Ausspiel-Ziele (Kanal-ULIDs); nur bei Inhaltstypen mit targetMode=explicit wirksam.","type":["array","null"],"items":{"type":"string"}},"availableTargets":{"description":"Wählbare Ziele mit Verbindungszustand und ggf. dem Grund, warum ein Ziel diesen Beitrag nicht nimmt.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"audit":{"description":"Hinweise der Inhalts-Prüfung als SCHLÜSSEL, nicht als fertiger Satz: `level` (info|warn|error), `code` (z. B. `titleShort`), `params` (die Werte des Satzes) und `field`. Den Satz bildet der Client aus `code` + `params` in der Sprache seines Lesers; der Code bleibt für MCP/Automation stabil.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"]}}},"ContentItem-content_item.write":{"type":"object","description":"Ein Beitrag (Programm 46 E, ENT-MKT-08).\n\nDIE OPERATIONEN SPIEGELN DEN ZUSTANDS-AUTOMATEN, und die Rechte spiegeln die Verantwortung:\nschreiben, planen und archivieren sind `content.item.manage`; veroeffentlichen und\nzuruecknehmen sind `content.item.publish`. Der Unterschied ist die Aussenwirkung — was\neinmal gelesen wurde, holt man nicht zurueck.\n\nDER ZUSTAND HAT KEINEN SCHREIB-ZUGANG. Ihn direkt zu setzen wuerde den Automaten umgehen:\nein Sprung von `draft` nach `published` uebersprang die Fassung, den Zeitpunkt und die\nAusgabe an die Ziele. Zustaende aendert man ueber die benannten Wege.","properties":{"typeKey":{"description":"Typ-Schluessel (`blog`, …) — beim Anlegen Pflicht, danach unveraenderlich.","type":["string","null"]},"locale":{"maxLength":5,"type":["string","null"]},"slug":{"maxLength":220,"description":"Adresse des Beitrags. Ohne Angabe aus der Ueberschrift gebildet.","type":["string","null"]},"fields":{"description":"Werte je Feld-Key, gepruefft gegen das Schema des Typs.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"plannedPublishAt":{"type":["string","null"]},"authorEmployeeId":{"type":["integer","null"]},"categories":{"type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"translationGroupUlid":{"type":["string","null"]},"seo":{"description":"Suchmaschinen-Angaben: `{metaTitle, metaDescription, canonical, robots, ogImageFileUlid}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"targets":{"description":"Gewählte Ausspiel-Ziele (Kanal-ULIDs); nur bei Inhaltstypen mit targetMode=explicit wirksam.","type":["array","null"],"items":{"type":"string"}}}},"ContentItem-content_item.write.jsonMergePatch":{"type":"object","description":"Ein Beitrag (Programm 46 E, ENT-MKT-08).\n\nDIE OPERATIONEN SPIEGELN DEN ZUSTANDS-AUTOMATEN, und die Rechte spiegeln die Verantwortung:\nschreiben, planen und archivieren sind `content.item.manage`; veroeffentlichen und\nzuruecknehmen sind `content.item.publish`. Der Unterschied ist die Aussenwirkung — was\neinmal gelesen wurde, holt man nicht zurueck.\n\nDER ZUSTAND HAT KEINEN SCHREIB-ZUGANG. Ihn direkt zu setzen wuerde den Automaten umgehen:\nein Sprung von `draft` nach `published` uebersprang die Fassung, den Zeitpunkt und die\nAusgabe an die Ziele. Zustaende aendert man ueber die benannten Wege.","properties":{"typeKey":{"description":"Typ-Schluessel (`blog`, …) — beim Anlegen Pflicht, danach unveraenderlich.","type":["string","null"]},"locale":{"maxLength":5,"type":["string","null"]},"slug":{"maxLength":220,"description":"Adresse des Beitrags. Ohne Angabe aus der Ueberschrift gebildet.","type":["string","null"]},"fields":{"description":"Werte je Feld-Key, gepruefft gegen das Schema des Typs.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"plannedPublishAt":{"type":["string","null"]},"authorEmployeeId":{"type":["integer","null"]},"categories":{"type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"translationGroupUlid":{"type":["string","null"]},"seo":{"description":"Suchmaschinen-Angaben: `{metaTitle, metaDescription, canonical, robots, ogImageFileUlid}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"targets":{"description":"Gewählte Ausspiel-Ziele (Kanal-ULIDs); nur bei Inhaltstypen mit targetMode=explicit wirksam.","type":["array","null"],"items":{"type":"string"}}}},"ContentItem.jsonld-content_item.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"typeKey":{"description":"Typ-Schluessel (`blog`, …) — beim Anlegen Pflicht, danach unveraenderlich.","type":["string","null"]},"typeName":{"type":["string","null"]},"locale":{"maxLength":5,"type":["string","null"]},"slug":{"maxLength":220,"description":"Adresse des Beitrags. Ohne Angabe aus der Ueberschrift gebildet.","type":["string","null"]},"status":{"description":"Nur lesend — Zustaende aendert man über die benannten Wege.","type":["string","null"]},"fields":{"description":"Werte je Feld-Key, gepruefft gegen das Schema des Typs.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"plannedPublishAt":{"type":["string","null"]},"publishedAt":{"type":["string","null"]},"authorEmployeeId":{"type":["integer","null"]},"categories":{"type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"translationGroupUlid":{"type":["string","null"]},"seo":{"description":"Suchmaschinen-Angaben: `{metaTitle, metaDescription, canonical, robots, ogImageFileUlid}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"title":{"description":"Ueberschrift in der Sprache des Beitrags — nur lesend, aus dem Kopf-Feld des Typs.","type":["string","null"]},"locales":{"description":"Sprachen, in denen dieser Beitrag WIRKLICH Text hat.","type":"array","items":{"type":"string"}},"publications":{"description":"Stand je Ziel und Sprache — die Antwort auf „wo steht der Beitrag, und wo klemmt es?\".","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"targets":{"description":"Gewählte Ausspiel-Ziele (Kanal-ULIDs); nur bei Inhaltstypen mit targetMode=explicit wirksam.","type":["array","null"],"items":{"type":"string"}},"availableTargets":{"description":"Wählbare Ziele mit Verbindungszustand und ggf. dem Grund, warum ein Ziel diesen Beitrag nicht nimmt.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"audit":{"description":"Hinweise der Inhalts-Prüfung als SCHLÜSSEL, nicht als fertiger Satz: `level` (info|warn|error), `code` (z. B. `titleShort`), `params` (die Werte des Satzes) und `field`. Den Satz bildet der Client aus `code` + `params` in der Sprache seines Lesers; der Code bleibt für MCP/Automation stabil.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"]}}}],"description":"Ein Beitrag (Programm 46 E, ENT-MKT-08).\n\nDIE OPERATIONEN SPIEGELN DEN ZUSTANDS-AUTOMATEN, und die Rechte spiegeln die Verantwortung:\nschreiben, planen und archivieren sind `content.item.manage`; veroeffentlichen und\nzuruecknehmen sind `content.item.publish`. Der Unterschied ist die Aussenwirkung — was\neinmal gelesen wurde, holt man nicht zurueck.\n\nDER ZUSTAND HAT KEINEN SCHREIB-ZUGANG. Ihn direkt zu setzen wuerde den Automaten umgehen:\nein Sprung von `draft` nach `published` uebersprang die Fassung, den Zeitpunkt und die\nAusgabe an die Ziele. Zustaende aendert man ueber die benannten Wege."},"ContentItemBulk-content_item_bulk.read":{"type":"object","description":"Eine SERIE Beitraege in EINEM Zug anlegen (`POST /v1/content/items/bulk`, Programm 47 Stufe 47-8).\n\nGANZ ODER GAR NICHT. Der Serien-Generator schlaegt sechs Beitraege vor, der Redakteur sagt „alle\nsechs uebernehmen\" — schluepften davon vier durch und zwei nicht, staende die Haelfte einer Serie\nim Kalender und niemand wuesste, welche zwei fehlen. Darum laeuft der ganze Zug in EINER\nTransaktion: bricht ein Eintrag, ist keiner angelegt, und die Antwort nennt den Eintrag mit\nseiner Position.\n\nDIE KOPFDATEN STEHEN OBEN, NICHT JE EINTRAG. Typ, Sprache, Marke, Ziele und Kategorien gelten\nfuer die ganze Serie — das ist es, was sie zur Serie macht. Je Eintrag bleiben nur die Werte\nund der Termin.","properties":{"ulid":{"description":"Synthetische Lauf-Kennung — die Antwort ist ein Aggregat, keine Entitaet.","type":["string","null"]},"typeKey":{"description":"Typ-Schluessel der ganzen Serie (Pflicht).","type":["string","null"]},"locale":{"description":"Sprache der ganzen Serie; ohne Angabe die Vorgabe-Sprache.","type":["string","null"]},"brandId":{"type":["integer","null"]},"created":{"description":"Angelegte Beitraege in der uebergebenen Reihenfolge.","default":0,"type":"integer"},"ulids":{"description":"ULIDs der angelegten Beitraege — in der Reihenfolge der Eintraege.","type":"array","items":{"type":"string"}}}},"ContentItemBulk-content_item_bulk.write":{"type":"object","description":"Eine SERIE Beitraege in EINEM Zug anlegen (`POST /v1/content/items/bulk`, Programm 47 Stufe 47-8).\n\nGANZ ODER GAR NICHT. Der Serien-Generator schlaegt sechs Beitraege vor, der Redakteur sagt „alle\nsechs uebernehmen\" — schluepften davon vier durch und zwei nicht, staende die Haelfte einer Serie\nim Kalender und niemand wuesste, welche zwei fehlen. Darum laeuft der ganze Zug in EINER\nTransaktion: bricht ein Eintrag, ist keiner angelegt, und die Antwort nennt den Eintrag mit\nseiner Position.\n\nDIE KOPFDATEN STEHEN OBEN, NICHT JE EINTRAG. Typ, Sprache, Marke, Ziele und Kategorien gelten\nfuer die ganze Serie — das ist es, was sie zur Serie macht. Je Eintrag bleiben nur die Werte\nund der Termin.","properties":{"typeKey":{"description":"Typ-Schluessel der ganzen Serie (Pflicht).","type":["string","null"]},"locale":{"description":"Sprache der ganzen Serie; ohne Angabe die Vorgabe-Sprache.","type":["string","null"]},"brandId":{"type":["integer","null"]},"targets":{"description":"Ziele fuer jeden Beitrag der Serie (Kanal-ULIDs) — nur bei Typen mit freier Ziel-Wahl.","type":["array","null"],"items":{"type":"string"}},"categories":{"description":"Kategorien fuer jeden Beitrag der Serie.","type":["array","null"],"items":{"type":"string"}},"items":{"description":"Die Eintraege: je `{fields: {…}, plannedPublishAt?: string, slug?: string}` (2–30).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ContentItemBulk.jsonld-content_item_bulk.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische Lauf-Kennung — die Antwort ist ein Aggregat, keine Entitaet.","type":["string","null"]},"typeKey":{"description":"Typ-Schluessel der ganzen Serie (Pflicht).","type":["string","null"]},"locale":{"description":"Sprache der ganzen Serie; ohne Angabe die Vorgabe-Sprache.","type":["string","null"]},"brandId":{"type":["integer","null"]},"created":{"description":"Angelegte Beitraege in der uebergebenen Reihenfolge.","default":0,"type":"integer"},"ulids":{"description":"ULIDs der angelegten Beitraege — in der Reihenfolge der Eintraege.","type":"array","items":{"type":"string"}}}}],"description":"Eine SERIE Beitraege in EINEM Zug anlegen (`POST /v1/content/items/bulk`, Programm 47 Stufe 47-8).\n\nGANZ ODER GAR NICHT. Der Serien-Generator schlaegt sechs Beitraege vor, der Redakteur sagt „alle\nsechs uebernehmen\" — schluepften davon vier durch und zwei nicht, staende die Haelfte einer Serie\nim Kalender und niemand wuesste, welche zwei fehlen. Darum laeuft der ganze Zug in EINER\nTransaktion: bricht ein Eintrag, ist keiner angelegt, und die Antwort nennt den Eintrag mit\nseiner Position.\n\nDIE KOPFDATEN STEHEN OBEN, NICHT JE EINTRAG. Typ, Sprache, Marke, Ziele und Kategorien gelten\nfuer die ganze Serie — das ist es, was sie zur Serie macht. Je Eintrag bleiben nur die Werte\nund der Termin."},"ContentOverview-content_overview.read":{"type":"object","description":"„Was ist schon da, und was mache ich hier?\" (Programm 47 Stufe 47-9).\n *\n * DIE ANTWORT AUF ZWEI FRAGEN, die eine Liste nie beantwortet: den FUNKTIONSSTAND (ist ein\n * Ausspiel-Ziel eingerichtet? laeuft die KI? gibt es Inhaltstypen?) und die ZAHLEN, die eine\n * Handlung ausloesen — allen voran die FEHLGESCHLAGENEN Veroeffentlichungen MIT Fehlertext.\n *\n * Genau die sind der Grund fuer diese Seite: ein Beitrag, der bei einem Ziel nicht ankam, taucht\n * in keiner Liste als Problem auf. Er steht als „veroeffentlicht\" da — nur eben nicht ueberall.","properties":{"id":{"description":"Synthetische Kennung — die Antwort ist ein Aggregat, keine Entitaet.","type":["string","null"]},"draftCount":{"default":0,"type":"integer"},"reviewCount":{"default":0,"type":"integer"},"scheduledCount":{"default":0,"type":"integer"},"publishedCount":{"default":0,"type":"integer"},"failedPublications":{"description":"Fehlgeschlagene Veroeffentlichungen MIT Fehlertext — je Eintrag\n`{itemUlid, title, channelName, locale, error, failedAt}`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"capabilities":{"description":"Funktionsstand je Faehigkeit — je Eintrag `{key, state, detail}` mit\n`state` aus `ok|warning|missing|off`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ContentOverview.jsonld-content_overview.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Synthetische Kennung — die Antwort ist ein Aggregat, keine Entitaet.","type":["string","null"]},"draftCount":{"default":0,"type":"integer"},"reviewCount":{"default":0,"type":"integer"},"scheduledCount":{"default":0,"type":"integer"},"publishedCount":{"default":0,"type":"integer"},"failedPublications":{"description":"Fehlgeschlagene Veroeffentlichungen MIT Fehlertext — je Eintrag\n`{itemUlid, title, channelName, locale, error, failedAt}`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"capabilities":{"description":"Funktionsstand je Faehigkeit — je Eintrag `{key, state, detail}` mit\n`state` aus `ok|warning|missing|off`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"„Was ist schon da, und was mache ich hier?\" (Programm 47 Stufe 47-9).\n *\n * DIE ANTWORT AUF ZWEI FRAGEN, die eine Liste nie beantwortet: den FUNKTIONSSTAND (ist ein\n * Ausspiel-Ziel eingerichtet? laeuft die KI? gibt es Inhaltstypen?) und die ZAHLEN, die eine\n * Handlung ausloesen — allen voran die FEHLGESCHLAGENEN Veroeffentlichungen MIT Fehlertext.\n *\n * Genau die sind der Grund fuer diese Seite: ein Beitrag, der bei einem Ziel nicht ankam, taucht\n * in keiner Liste als Problem auf. Er steht als „veroeffentlicht\" da — nur eben nicht ueberall."},"ContentPublicationReport-content_report.read":{"type":"object","description":"Der GEGENWEG: ein Ablauf meldet, was das Fremdsystem vergeben hat (Programm 46 E).\n\nOHNE IHN GIBT ES KEINE AKTUALISIERUNG, nur Neuanlagen. Der Ablauf hat gerade beim Zielsystem\neinen Beitrag angelegt und ist der Einzige, der dessen Kennung kennt. Meldet er sie nicht\nzurueck, legt der naechste Zug dort einen ZWEITEN Beitrag an — und beide stehen fuer die\nLeser da.\n\nDie drei Teile des Schluessels sind Pflicht: ohne die Sprache traefe die Meldung die falsche\nFassung, und die englische bliebe fuer immer „ausstehend\".","properties":{"ulid":{"type":["string","null"]},"itemUlid":{"type":["string","null"]},"channelUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"externalRef":{"description":"Kennung beim Zielsystem — der Schlüssel gegen doppelte Beiträge.","type":["string","null"]},"externalUrl":{"description":"Adresse beim Zielsystem, wenn es eine nennt.","type":["string","null"]},"error":{"description":"Fehlertext, wenn das Zielsystem abgelehnt hat. Gesetzt ⇒ die Meldung gilt als Fehlschlag.","type":["string","null"]},"status":{"type":["string","null"]}},"required":["itemUlid","channelUlid","locale"]},"ContentPublicationReport-content_report.write":{"type":"object","description":"Der GEGENWEG: ein Ablauf meldet, was das Fremdsystem vergeben hat (Programm 46 E).\n\nOHNE IHN GIBT ES KEINE AKTUALISIERUNG, nur Neuanlagen. Der Ablauf hat gerade beim Zielsystem\neinen Beitrag angelegt und ist der Einzige, der dessen Kennung kennt. Meldet er sie nicht\nzurueck, legt der naechste Zug dort einen ZWEITEN Beitrag an — und beide stehen fuer die\nLeser da.\n\nDie drei Teile des Schluessels sind Pflicht: ohne die Sprache traefe die Meldung die falsche\nFassung, und die englische bliebe fuer immer „ausstehend\".","required":["itemUlid","channelUlid","locale"],"properties":{"itemUlid":{"type":["string","null"]},"channelUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"externalRef":{"description":"Kennung beim Zielsystem — der Schlüssel gegen doppelte Beiträge.","type":["string","null"]},"externalUrl":{"description":"Adresse beim Zielsystem, wenn es eine nennt.","type":["string","null"]},"error":{"description":"Fehlertext, wenn das Zielsystem abgelehnt hat. Gesetzt ⇒ die Meldung gilt als Fehlschlag.","type":["string","null"]}}},"ContentPublicationReport.jsonld-content_report.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"itemUlid":{"type":["string","null"]},"channelUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"externalRef":{"description":"Kennung beim Zielsystem — der Schlüssel gegen doppelte Beiträge.","type":["string","null"]},"externalUrl":{"description":"Adresse beim Zielsystem, wenn es eine nennt.","type":["string","null"]},"error":{"description":"Fehlertext, wenn das Zielsystem abgelehnt hat. Gesetzt ⇒ die Meldung gilt als Fehlschlag.","type":["string","null"]},"status":{"type":["string","null"]}},"required":["itemUlid","channelUlid","locale"]}],"description":"Der GEGENWEG: ein Ablauf meldet, was das Fremdsystem vergeben hat (Programm 46 E).\n\nOHNE IHN GIBT ES KEINE AKTUALISIERUNG, nur Neuanlagen. Der Ablauf hat gerade beim Zielsystem\neinen Beitrag angelegt und ist der Einzige, der dessen Kennung kennt. Meldet er sie nicht\nzurueck, legt der naechste Zug dort einen ZWEITEN Beitrag an — und beide stehen fuer die\nLeser da.\n\nDie drei Teile des Schluessels sind Pflicht: ohne die Sprache traefe die Meldung die falsche\nFassung, und die englische bliebe fuer immer „ausstehend\"."},"ContentType-content_type.read":{"type":"object","description":"Ein Inhaltstyp — die FORM, die alle Beitraege dieser Art teilen (Programm 46 E).\n\nLESEN darf jeder mit dem Beitrags-Recht: ohne das Schema kann die Maske keinen Beitrag zeigen.\nSCHREIBEN verlangt ein eigenes Recht, denn eine Feld-Aenderung wirkt rueckwaerts auf JEDEN\nbestehenden Beitrag — ein neu gesetztes Pflichtfeld macht sie alle unvollstaendig.","properties":{"ulid":{"type":["string","null"]},"typeKey":{"pattern":"^([a-z][a-z0-9_-]{1,39})$","description":"Stabiler Schluessel — nach dem Anlegen unveraenderlich.","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"targetMode":{"enum":["auto","explicit"],"description":"Ziel-Wahl: auto = jedes eingerichtete Ziel, explicit = der Verfasser wählt je Beitrag.","type":["string","null"]},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"fields":{"description":"Feldschema: `[{key, label, type, required, translatable, …}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"titleFieldKey":{"type":["string","null"]},"excerptFieldKey":{"type":["string","null"]},"featuredImageFieldKey":{"type":["string","null"]},"categories":{"description":"Kategorien dieses Typs: `[{key, label}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"itemCount":{"description":"Wie viele Beitraege haengen daran? Nur lesend — die Antwort auf „darf ich das aendern?\".","default":0,"type":"integer"},"createdAt":{"type":["string","null"]}}},"ContentType-content_type.write":{"type":"object","description":"Ein Inhaltstyp — die FORM, die alle Beitraege dieser Art teilen (Programm 46 E).\n\nLESEN darf jeder mit dem Beitrags-Recht: ohne das Schema kann die Maske keinen Beitrag zeigen.\nSCHREIBEN verlangt ein eigenes Recht, denn eine Feld-Aenderung wirkt rueckwaerts auf JEDEN\nbestehenden Beitrag — ein neu gesetztes Pflichtfeld macht sie alle unvollstaendig.","properties":{"typeKey":{"pattern":"^([a-z][a-z0-9_-]{1,39})$","description":"Stabiler Schluessel — nach dem Anlegen unveraenderlich.","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"targetMode":{"enum":["auto","explicit"],"description":"Ziel-Wahl: auto = jedes eingerichtete Ziel, explicit = der Verfasser wählt je Beitrag.","type":["string","null"]},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"fields":{"description":"Feldschema: `[{key, label, type, required, translatable, …}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"titleFieldKey":{"type":["string","null"]},"excerptFieldKey":{"type":["string","null"]},"featuredImageFieldKey":{"type":["string","null"]},"categories":{"description":"Kategorien dieses Typs: `[{key, label}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"ContentType-content_type.write.jsonMergePatch":{"type":"object","description":"Ein Inhaltstyp — die FORM, die alle Beitraege dieser Art teilen (Programm 46 E).\n\nLESEN darf jeder mit dem Beitrags-Recht: ohne das Schema kann die Maske keinen Beitrag zeigen.\nSCHREIBEN verlangt ein eigenes Recht, denn eine Feld-Aenderung wirkt rueckwaerts auf JEDEN\nbestehenden Beitrag — ein neu gesetztes Pflichtfeld macht sie alle unvollstaendig.","properties":{"typeKey":{"pattern":"^([a-z][a-z0-9_-]{1,39})$","description":"Stabiler Schluessel — nach dem Anlegen unveraenderlich.","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"targetMode":{"enum":["auto","explicit"],"description":"Ziel-Wahl: auto = jedes eingerichtete Ziel, explicit = der Verfasser wählt je Beitrag.","type":["string","null"]},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"fields":{"description":"Feldschema: `[{key, label, type, required, translatable, …}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"titleFieldKey":{"type":["string","null"]},"excerptFieldKey":{"type":["string","null"]},"featuredImageFieldKey":{"type":["string","null"]},"categories":{"description":"Kategorien dieses Typs: `[{key, label}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"ContentType.jsonld-content_type.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"typeKey":{"pattern":"^([a-z][a-z0-9_-]{1,39})$","description":"Stabiler Schluessel — nach dem Anlegen unveraenderlich.","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"targetMode":{"enum":["auto","explicit"],"description":"Ziel-Wahl: auto = jedes eingerichtete Ziel, explicit = der Verfasser wählt je Beitrag.","type":["string","null"]},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"fields":{"description":"Feldschema: `[{key, label, type, required, translatable, …}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"titleFieldKey":{"type":["string","null"]},"excerptFieldKey":{"type":["string","null"]},"featuredImageFieldKey":{"type":["string","null"]},"categories":{"description":"Kategorien dieses Typs: `[{key, label}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"itemCount":{"description":"Wie viele Beitraege haengen daran? Nur lesend — die Antwort auf „darf ich das aendern?\".","default":0,"type":"integer"},"createdAt":{"type":["string","null"]}}}],"description":"Ein Inhaltstyp — die FORM, die alle Beitraege dieser Art teilen (Programm 46 E).\n\nLESEN darf jeder mit dem Beitrags-Recht: ohne das Schema kann die Maske keinen Beitrag zeigen.\nSCHREIBEN verlangt ein eigenes Recht, denn eine Feld-Aenderung wirkt rueckwaerts auf JEDEN\nbestehenden Beitrag — ein neu gesetztes Pflichtfeld macht sie alle unvollstaendig."},"Contract-contract.read":{"type":"object","description":"Vertrags-Resource (04-05 §5). CRUD + Lebenszyklus-Operationen (aktivieren/pausieren/\nfortsetzen/kündigen/beenden/verlängern/indexieren), Anlage von Kontingenten/Prepaid/\nPositionen, Erzeugung aus Angebot. Item-Detail bettet Kontingente/Positionen/Prepaid/\nVerlängerungsregel ein.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerischer PK (kein IRI-Identifier; Sub-Ressourcen wie Perioden/Historie filtern darüber).","type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"contractNumber":{"type":["string","null"]},"type":{"enum":["retainer","maintenance","hosting"],"description":"retainer | maintenance | hosting.","type":["string","null"]},"title":{"type":["string","null"]},"status":{"type":["string","null"]},"billingCycle":{"enum":["monthly","quarterly","yearly"],"description":"monthly | quarterly | yearly.","type":["string","null"]},"billingMode":{"enum":["advance","arrears"],"description":"advance | arrears.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"description":"Kündigungs-/Laufzeitende (NULL = unbefristet).","type":["string","null"]},"flatFeeAmount":{"minimum":0,"description":"Verbrauchsunabhängige Pauschale in Cent.","type":["integer","null"]},"coversNonBillable":{"type":["boolean","null"]},"slaId":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]},"recurringBillingPlanId":{"type":["integer","null"]},"indexationBasisPoints":{"description":"Jährliche Indexierung in Basispunkten (250 = 2,50 %).","type":["integer","null"]},"nextIndexationAt":{"type":["string","null"]},"noteCustomerVisible":{"type":["string","null"]},"aiSummary":{"type":["string","null"]},"signedAt":{"type":["string","null"]},"signedBy":{"description":"ULID des unterzeichnenden Portal-Users.","type":["string","null"]},"signatureEvidenceHash":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Vertrags-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"renewalMode":{"description":"auto_renew | fixed_term | open_ended.","type":["string","null"]},"renewalTermMonths":{"type":["integer","null"]},"noticePeriodDays":{"type":["integer","null"]},"quotas":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"items":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"prepaid":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"renewal":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"utilization":{"description":"Live-Auslastung je Kontingent (Minuten).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Contract-contract.write":{"type":"object","description":"Vertrags-Resource (04-05 §5). CRUD + Lebenszyklus-Operationen (aktivieren/pausieren/\nfortsetzen/kündigen/beenden/verlängern/indexieren), Anlage von Kontingenten/Prepaid/\nPositionen, Erzeugung aus Angebot. Item-Detail bettet Kontingente/Positionen/Prepaid/\nVerlängerungsregel ein.","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"type":{"enum":["retainer","maintenance","hosting"],"description":"retainer | maintenance | hosting.","type":["string","null"]},"title":{"type":["string","null"]},"billingCycle":{"enum":["monthly","quarterly","yearly"],"description":"monthly | quarterly | yearly.","type":["string","null"]},"billingMode":{"enum":["advance","arrears"],"description":"advance | arrears.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"description":"Kündigungs-/Laufzeitende (NULL = unbefristet).","type":["string","null"]},"flatFeeAmount":{"minimum":0,"description":"Verbrauchsunabhängige Pauschale in Cent.","type":["integer","null"]},"coversNonBillable":{"type":["boolean","null"]},"slaId":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]},"indexationBasisPoints":{"description":"Jährliche Indexierung in Basispunkten (250 = 2,50 %).","type":["integer","null"]},"noteCustomerVisible":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Vertrags-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"renewalMode":{"description":"auto_renew | fixed_term | open_ended.","type":["string","null"]},"renewalTermMonths":{"type":["integer","null"]},"noticePeriodDays":{"type":["integer","null"]},"quoteId":{"description":"create-from-quote: numerische Angebots-ID.","type":["integer","null"]},"quoteUlid":{"description":"create-from-quote: alternativ die Angebots-ULID (z. B. aus dem SPA-Picker).","type":["string","null"]},"terminationReason":{"description":"terminate/finalize-Sofortbeendigung.","type":["string","null"]},"pauseReason":{"description":"pause-Grund.","type":["string","null"]},"quotaName":{"description":"add-quota.","type":["string","null"]},"quotaTargetHours":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"quotaRule":{"enum":["extra","rollover","expire"],"description":"extra | rollover | expire.","type":["string","null"]},"quotaCapMode":{"enum":["hard_cap","warn","soft"],"description":"hard_cap | warn | soft.","type":["string","null"]},"quotaOverageRateId":{"type":["integer","null"]},"quotaTaxRate":{"minimum":0,"maximum":100,"description":"USt-Satz in Prozent für die Überstunden-/Mehrleistungsabrechnung dieses Kontingents (Default 19).","type":["integer","null"]},"quotaRolloverMaxHours":{"minimum":0,"type":["integer","null"]},"quotaRolloverExpiryPeriods":{"type":["integer","null"]},"quotaCategoryKey":{"type":["string","null"]},"quotaIsDefault":{"type":["boolean","null"]},"quotaWarnThresholds":{"type":["array","null"],"items":{"type":"integer"}},"prepaidName":{"description":"add-prepaid.","type":["string","null"]},"prepaidHours":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"prepaidPriceAmount":{"minimum":0,"type":["integer","null"]},"prepaidExpiresAt":{"type":["string","null"]},"prepaidWarnThresholdPct":{"type":["integer","null"]},"itemDescription":{"description":"add-item.","type":["string","null"]},"itemKind":{"description":"flat | quota | prepaid | usage.","type":["string","null"]},"itemQuantity":{"type":["string","null"]},"itemUnit":{"type":["string","null"]},"itemUnitPriceAmount":{"type":["integer","null"]},"itemTaxRate":{"minimum":0,"maximum":100,"description":"USt-Satz in Prozent — muss im TaxRate-Katalog existieren (19/7/0 geseedet).","type":["integer","null"]},"itemProductId":{"type":["integer","null"]},"itemQuotaId":{"type":["integer","null"]}}},"Contract-contract.write.jsonMergePatch":{"type":"object","description":"Vertrags-Resource (04-05 §5). CRUD + Lebenszyklus-Operationen (aktivieren/pausieren/\nfortsetzen/kündigen/beenden/verlängern/indexieren), Anlage von Kontingenten/Prepaid/\nPositionen, Erzeugung aus Angebot. Item-Detail bettet Kontingente/Positionen/Prepaid/\nVerlängerungsregel ein.","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"type":{"enum":["retainer","maintenance","hosting"],"description":"retainer | maintenance | hosting.","type":["string","null"]},"title":{"type":["string","null"]},"billingCycle":{"enum":["monthly","quarterly","yearly"],"description":"monthly | quarterly | yearly.","type":["string","null"]},"billingMode":{"enum":["advance","arrears"],"description":"advance | arrears.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"description":"Kündigungs-/Laufzeitende (NULL = unbefristet).","type":["string","null"]},"flatFeeAmount":{"minimum":0,"description":"Verbrauchsunabhängige Pauschale in Cent.","type":["integer","null"]},"coversNonBillable":{"type":["boolean","null"]},"slaId":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]},"indexationBasisPoints":{"description":"Jährliche Indexierung in Basispunkten (250 = 2,50 %).","type":["integer","null"]},"noteCustomerVisible":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Vertrags-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"renewalMode":{"description":"auto_renew | fixed_term | open_ended.","type":["string","null"]},"renewalTermMonths":{"type":["integer","null"]},"noticePeriodDays":{"type":["integer","null"]},"quoteId":{"description":"create-from-quote: numerische Angebots-ID.","type":["integer","null"]},"quoteUlid":{"description":"create-from-quote: alternativ die Angebots-ULID (z. B. aus dem SPA-Picker).","type":["string","null"]},"terminationReason":{"description":"terminate/finalize-Sofortbeendigung.","type":["string","null"]},"pauseReason":{"description":"pause-Grund.","type":["string","null"]},"quotaName":{"description":"add-quota.","type":["string","null"]},"quotaTargetHours":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"quotaRule":{"enum":["extra","rollover","expire"],"description":"extra | rollover | expire.","type":["string","null"]},"quotaCapMode":{"enum":["hard_cap","warn","soft"],"description":"hard_cap | warn | soft.","type":["string","null"]},"quotaOverageRateId":{"type":["integer","null"]},"quotaTaxRate":{"minimum":0,"maximum":100,"description":"USt-Satz in Prozent für die Überstunden-/Mehrleistungsabrechnung dieses Kontingents (Default 19).","type":["integer","null"]},"quotaRolloverMaxHours":{"minimum":0,"type":["integer","null"]},"quotaRolloverExpiryPeriods":{"type":["integer","null"]},"quotaCategoryKey":{"type":["string","null"]},"quotaIsDefault":{"type":["boolean","null"]},"quotaWarnThresholds":{"type":["array","null"],"items":{"type":"integer"}},"prepaidName":{"description":"add-prepaid.","type":["string","null"]},"prepaidHours":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"prepaidPriceAmount":{"minimum":0,"type":["integer","null"]},"prepaidExpiresAt":{"type":["string","null"]},"prepaidWarnThresholdPct":{"type":["integer","null"]},"itemDescription":{"description":"add-item.","type":["string","null"]},"itemKind":{"description":"flat | quota | prepaid | usage.","type":["string","null"]},"itemQuantity":{"type":["string","null"]},"itemUnit":{"type":["string","null"]},"itemUnitPriceAmount":{"type":["integer","null"]},"itemTaxRate":{"minimum":0,"maximum":100,"description":"USt-Satz in Prozent — muss im TaxRate-Katalog existieren (19/7/0 geseedet).","type":["integer","null"]},"itemProductId":{"type":["integer","null"]},"itemQuotaId":{"type":["integer","null"]}}},"Contract.jsonld-contract.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerischer PK (kein IRI-Identifier; Sub-Ressourcen wie Perioden/Historie filtern darüber).","type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"contractNumber":{"type":["string","null"]},"type":{"enum":["retainer","maintenance","hosting"],"description":"retainer | maintenance | hosting.","type":["string","null"]},"title":{"type":["string","null"]},"status":{"type":["string","null"]},"billingCycle":{"enum":["monthly","quarterly","yearly"],"description":"monthly | quarterly | yearly.","type":["string","null"]},"billingMode":{"enum":["advance","arrears"],"description":"advance | arrears.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"description":"Kündigungs-/Laufzeitende (NULL = unbefristet).","type":["string","null"]},"flatFeeAmount":{"minimum":0,"description":"Verbrauchsunabhängige Pauschale in Cent.","type":["integer","null"]},"coversNonBillable":{"type":["boolean","null"]},"slaId":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]},"recurringBillingPlanId":{"type":["integer","null"]},"indexationBasisPoints":{"description":"Jährliche Indexierung in Basispunkten (250 = 2,50 %).","type":["integer","null"]},"nextIndexationAt":{"type":["string","null"]},"noteCustomerVisible":{"type":["string","null"]},"aiSummary":{"type":["string","null"]},"signedAt":{"type":["string","null"]},"signedBy":{"description":"ULID des unterzeichnenden Portal-Users.","type":["string","null"]},"signatureEvidenceHash":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Vertrags-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"renewalMode":{"description":"auto_renew | fixed_term | open_ended.","type":["string","null"]},"renewalTermMonths":{"type":["integer","null"]},"noticePeriodDays":{"type":["integer","null"]},"quotas":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"items":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"prepaid":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"renewal":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"utilization":{"description":"Live-Auslastung je Kontingent (Minuten).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Vertrags-Resource (04-05 §5). CRUD + Lebenszyklus-Operationen (aktivieren/pausieren/\nfortsetzen/kündigen/beenden/verlängern/indexieren), Anlage von Kontingenten/Prepaid/\nPositionen, Erzeugung aus Angebot. Item-Detail bettet Kontingente/Positionen/Prepaid/\nVerlängerungsregel ein."},"ContractActivity-contract_activity.read":{"type":"object","description":"Aggregierte Vertrags-Kommunikation (10-kommunikation-integration, AP-4.3) — read-only\nVerdichtung der WorkItemMessages mit passender contractId. Analog AP-4.1.","properties":{"id":{"description":"Message-ULID (Identifier des Aggregations-Eintrags).","default":"","type":"string"},"workItemUlid":{"description":"Quell-Vorgang der Nachricht (Sprungziel in der UI).","type":["string","null"]},"workItemRef":{"type":["string","null"]},"workItemTitle":{"type":["string","null"]},"workItemKind":{"description":"task | ticket — steuert das Sprungziel (/work-items vs. /tickets) im Frontend.","type":["string","null"]},"type":{"default":"comment","type":"string"},"direction":{"type":["string","null"]},"internal":{"default":true,"type":"boolean"},"subject":{"type":["string","null"]},"body":{"type":["string","null"]},"authorId":{"type":["integer","null"]},"occurredAt":{"type":["string","null"]}}},"ContractActivity.jsonld-contract_activity.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Message-ULID (Identifier des Aggregations-Eintrags).","default":"","type":"string"},"workItemUlid":{"description":"Quell-Vorgang der Nachricht (Sprungziel in der UI).","type":["string","null"]},"workItemRef":{"type":["string","null"]},"workItemTitle":{"type":["string","null"]},"workItemKind":{"description":"task | ticket — steuert das Sprungziel (/work-items vs. /tickets) im Frontend.","type":["string","null"]},"type":{"default":"comment","type":"string"},"direction":{"type":["string","null"]},"internal":{"default":true,"type":"boolean"},"subject":{"type":["string","null"]},"body":{"type":["string","null"]},"authorId":{"type":["integer","null"]},"occurredAt":{"type":["string","null"]}}}],"description":"Aggregierte Vertrags-Kommunikation (10-kommunikation-integration, AP-4.3) — read-only\nVerdichtung der WorkItemMessages mit passender contractId. Analog AP-4.1."},"ContractAmendment-contract_amendment.read":{"type":"object","description":"Nachtrag/Versionierung eines Vertrags (04-05). Anlage vergibt nächste fortlaufende Version;\nMarken-Scope/IDOR über Provider/Processor.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"description":"Numerische Vertrags-ID (Pflicht bei Anlage; danach unveränderlich).","type":["integer","null"]},"version":{"description":"Fortlaufende, vertragsweite Versionsnummer (vom Server vergeben).","type":["integer","null"]},"title":{"maxLength":255,"type":["string","null"]},"description":{"maxLength":5000,"type":["string","null"]},"effectiveDate":{"description":"Inkrafttreten (ISO-Datum).","type":["string","null"]},"changes":{"description":"Strukturierter Änderungsumfang (z. B. {\"flatFeeAmount\": 25000}).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"status":{"enum":["draft","active"],"description":"draft | active.","type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"ContractAmendment-contract_amendment.write":{"type":"object","description":"Nachtrag/Versionierung eines Vertrags (04-05). Anlage vergibt nächste fortlaufende Version;\nMarken-Scope/IDOR über Provider/Processor.","properties":{"contractId":{"minimum":0,"exclusiveMinimum":0,"description":"Numerische Vertrags-ID (Pflicht bei Anlage; danach unveränderlich).","type":["integer","null"]},"title":{"maxLength":255,"type":["string","null"]},"description":{"maxLength":5000,"type":["string","null"]},"effectiveDate":{"description":"Inkrafttreten (ISO-Datum).","type":["string","null"]},"changes":{"description":"Strukturierter Änderungsumfang (z. B. {\"flatFeeAmount\": 25000}).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"status":{"enum":["draft","active"],"description":"draft | active.","type":["string","null"]}}},"ContractAmendment-contract_amendment.write.jsonMergePatch":{"type":"object","description":"Nachtrag/Versionierung eines Vertrags (04-05). Anlage vergibt nächste fortlaufende Version;\nMarken-Scope/IDOR über Provider/Processor.","properties":{"contractId":{"minimum":0,"exclusiveMinimum":0,"description":"Numerische Vertrags-ID (Pflicht bei Anlage; danach unveränderlich).","type":["integer","null"]},"title":{"maxLength":255,"type":["string","null"]},"description":{"maxLength":5000,"type":["string","null"]},"effectiveDate":{"description":"Inkrafttreten (ISO-Datum).","type":["string","null"]},"changes":{"description":"Strukturierter Änderungsumfang (z. B. {\"flatFeeAmount\": 25000}).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"status":{"enum":["draft","active"],"description":"draft | active.","type":["string","null"]}}},"ContractAmendment.jsonld-contract_amendment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"description":"Numerische Vertrags-ID (Pflicht bei Anlage; danach unveränderlich).","type":["integer","null"]},"version":{"description":"Fortlaufende, vertragsweite Versionsnummer (vom Server vergeben).","type":["integer","null"]},"title":{"maxLength":255,"type":["string","null"]},"description":{"maxLength":5000,"type":["string","null"]},"effectiveDate":{"description":"Inkrafttreten (ISO-Datum).","type":["string","null"]},"changes":{"description":"Strukturierter Änderungsumfang (z. B. {\"flatFeeAmount\": 25000}).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"status":{"enum":["draft","active"],"description":"draft | active.","type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Nachtrag/Versionierung eines Vertrags (04-05). Anlage vergibt nächste fortlaufende Version;\nMarken-Scope/IDOR über Provider/Processor."},"ContractHistory-contract_history.read":{"type":"object","description":"Vertrags-Historie (04-05 §3/AK8, read-only, append-only): lückenlose Timeline aller\nLebenszyklus- und Periodenereignisse. Filter: contractId, event.","properties":{"ulid":{"type":["string","null"]},"contractId":{"type":["integer","null"]},"event":{"type":["string","null"]},"payload":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"actorId":{"type":["string","null"]},"occurredAt":{"type":["string","null"]},"note":{"type":["string","null"]}}},"ContractHistory.jsonld-contract_history.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"contractId":{"type":["integer","null"]},"event":{"type":["string","null"]},"payload":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"actorId":{"type":["string","null"]},"occurredAt":{"type":["string","null"]},"note":{"type":["string","null"]}}}],"description":"Vertrags-Historie (04-05 §3/AK8, read-only, append-only): lückenlose Timeline aller\nLebenszyklus- und Periodenereignisse. Filter: contractId, event."},"ContractQuotaPeriod-quota_period.read":{"type":"object","description":"Kontingent-Perioden (04-05 §3/§5, read-only): Soll/Ist/Übertrag/Überverbrauch je Periode\n— Datenbasis für den Periodenverlauf im Vertragsdetail. Filter: contractId, quotaId, status.","properties":{"ulid":{"type":["string","null"]},"contractId":{"type":["integer","null"]},"quotaId":{"type":["integer","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"targetMinutes":{"type":["integer","null"]},"consumedMinutes":{"type":["integer","null"]},"carriedInMinutes":{"type":["integer","null"]},"carriedOutMinutes":{"type":["integer","null"]},"overageMinutes":{"type":["integer","null"]},"remainingMinutes":{"type":["integer","null"]},"status":{"type":["string","null"]}}},"ContractQuotaPeriod.jsonld-quota_period.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"contractId":{"type":["integer","null"]},"quotaId":{"type":["integer","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"targetMinutes":{"type":["integer","null"]},"consumedMinutes":{"type":["integer","null"]},"carriedInMinutes":{"type":["integer","null"]},"carriedOutMinutes":{"type":["integer","null"]},"overageMinutes":{"type":["integer","null"]},"remainingMinutes":{"type":["integer","null"]},"status":{"type":["string","null"]}}}],"description":"Kontingent-Perioden (04-05 §3/§5, read-only): Soll/Ist/Übertrag/Überverbrauch je Periode\n— Datenbasis für den Periodenverlauf im Vertragsdetail. Filter: contractId, quotaId, status."},"ContractStatus-contract_status.read":{"type":"object","description":"Vertrags-Status als Daten (04-05): konfigurierbar ohne Code. `key` = Contract::STATUS_*-Werte\n(Bestandsverträge bleiben kompatibel).","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ContractStatus-contract_status.update.jsonMergePatch":{"type":"object","description":"Vertrags-Status als Daten (04-05): konfigurierbar ohne Code. `key` = Contract::STATUS_*-Werte\n(Bestandsverträge bleiben kompatibel).","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ContractStatus-contract_status.write":{"type":"object","description":"Vertrags-Status als Daten (04-05): konfigurierbar ohne Code. `key` = Contract::STATUS_*-Werte\n(Bestandsverträge bleiben kompatibel).","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ContractStatus.jsonld-contract_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Vertrags-Status als Daten (04-05): konfigurierbar ohne Code. `key` = Contract::STATUS_*-Werte\n(Bestandsverträge bleiben kompatibel)."},"ContractSummary-contract_summary.read":{"type":"object","description":"Vertrags-Kennzahl-Aggregat für die Listenansicht (Audit R18 Perf, Muster\n{@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}). MRR über alle aktiven\nVerträge (Pauschale je Zyklus monats-normiert), stets Gesamtbestand statt nur Seite —\nersetzt die frühere clientseitige `listAll`-Truncation (5000er-Limit).","properties":{"id":{"type":["string","null"]},"mrrAmount":{"description":"MRR in Cent: `flatFeeAmount` je Zyklus monats-normiert (yearly ÷ 12, quarterly ÷ 3).","type":["integer","null"]},"activeCount":{"description":"Anzahl aktiver Verträge (Status active, nicht gelöscht) im Marken-Scope.","type":["integer","null"]}}},"ContractSummary.jsonld-contract_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"mrrAmount":{"description":"MRR in Cent: `flatFeeAmount` je Zyklus monats-normiert (yearly ÷ 12, quarterly ÷ 3).","type":["integer","null"]},"activeCount":{"description":"Anzahl aktiver Verträge (Status active, nicht gelöscht) im Marken-Scope.","type":["integer","null"]}}}],"description":"Vertrags-Kennzahl-Aggregat für die Listenansicht (Audit R18 Perf, Muster\n{@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}). MRR über alle aktiven\nVerträge (Pauschale je Zyklus monats-normiert), stets Gesamtbestand statt nur Seite —\nersetzt die frühere clientseitige `listAll`-Truncation (5000er-Limit)."},"CountryTaxRate-country_tax_rate.read":{"type":"object","description":"Steuersätze der EU-Bestimmungsländer (Doc 25 AP 10.3, Spec 04-51 §4).\n\n⚠ Der ausgelieferte Katalog ist ein **Ausgangsstand**, kein gepflegter Rechtsdienst — Sätze\nändern sich durch nationale Gesetzgebung. Vor der ersten OSS-Meldung gegen die TEDB-Datenbank\nder EU-Kommission bzw. mit dem Steuerberater prüfen; genau dafür sind sie hier änderbar.\n\n`validFrom`/`validTo` sind kein Komfort: ein Beleg vom 30. Juni muss den alten Satz behalten,\nauch wenn am 1. Juli der neue gilt. Eine Satzänderung OHNE neues Fenster verfälscht rückwirkend\ndie Meldung des laufenden Quartals.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"key":{"description":"Stabiler Katalog-Schlüssel `<LAND>:<kategorie>` (read-only).","type":["string","null"]},"countryCode":{"minLength":2,"maxLength":2,"description":"ISO 3166-1 alpha-2; nur beim Anlegen setzbar.","type":["string","null"]},"category":{"description":"`regular` | `reduced` | `exempt`; nur beim Anlegen setzbar.","type":["string","null"]},"rate":{"description":"Prozentsatz, z. B. `\"21.00\"`.","type":["string","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"CountryTaxRate-country_tax_rate.write":{"type":"object","description":"Steuersätze der EU-Bestimmungsländer (Doc 25 AP 10.3, Spec 04-51 §4).\n\n⚠ Der ausgelieferte Katalog ist ein **Ausgangsstand**, kein gepflegter Rechtsdienst — Sätze\nändern sich durch nationale Gesetzgebung. Vor der ersten OSS-Meldung gegen die TEDB-Datenbank\nder EU-Kommission bzw. mit dem Steuerberater prüfen; genau dafür sind sie hier änderbar.\n\n`validFrom`/`validTo` sind kein Komfort: ein Beleg vom 30. Juni muss den alten Satz behalten,\nauch wenn am 1. Juli der neue gilt. Eine Satzänderung OHNE neues Fenster verfälscht rückwirkend\ndie Meldung des laufenden Quartals.","properties":{"countryCode":{"minLength":2,"maxLength":2,"description":"ISO 3166-1 alpha-2; nur beim Anlegen setzbar.","type":["string","null"]},"category":{"description":"`regular` | `reduced` | `exempt`; nur beim Anlegen setzbar.","type":["string","null"]},"rate":{"description":"Prozentsatz, z. B. `\"21.00\"`.","type":["string","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"CountryTaxRate-country_tax_rate.write.jsonMergePatch":{"type":"object","description":"Steuersätze der EU-Bestimmungsländer (Doc 25 AP 10.3, Spec 04-51 §4).\n\n⚠ Der ausgelieferte Katalog ist ein **Ausgangsstand**, kein gepflegter Rechtsdienst — Sätze\nändern sich durch nationale Gesetzgebung. Vor der ersten OSS-Meldung gegen die TEDB-Datenbank\nder EU-Kommission bzw. mit dem Steuerberater prüfen; genau dafür sind sie hier änderbar.\n\n`validFrom`/`validTo` sind kein Komfort: ein Beleg vom 30. Juni muss den alten Satz behalten,\nauch wenn am 1. Juli der neue gilt. Eine Satzänderung OHNE neues Fenster verfälscht rückwirkend\ndie Meldung des laufenden Quartals.","properties":{"countryCode":{"minLength":2,"maxLength":2,"description":"ISO 3166-1 alpha-2; nur beim Anlegen setzbar.","type":["string","null"]},"category":{"description":"`regular` | `reduced` | `exempt`; nur beim Anlegen setzbar.","type":["string","null"]},"rate":{"description":"Prozentsatz, z. B. `\"21.00\"`.","type":["string","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"CountryTaxRate.jsonld-country_tax_rate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"key":{"description":"Stabiler Katalog-Schlüssel `<LAND>:<kategorie>` (read-only).","type":["string","null"]},"countryCode":{"minLength":2,"maxLength":2,"description":"ISO 3166-1 alpha-2; nur beim Anlegen setzbar.","type":["string","null"]},"category":{"description":"`regular` | `reduced` | `exempt`; nur beim Anlegen setzbar.","type":["string","null"]},"rate":{"description":"Prozentsatz, z. B. `\"21.00\"`.","type":["string","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]},"active":{"type":["boolean","null"]}}}],"description":"Steuersätze der EU-Bestimmungsländer (Doc 25 AP 10.3, Spec 04-51 §4).\n\n⚠ Der ausgelieferte Katalog ist ein **Ausgangsstand**, kein gepflegter Rechtsdienst — Sätze\nändern sich durch nationale Gesetzgebung. Vor der ersten OSS-Meldung gegen die TEDB-Datenbank\nder EU-Kommission bzw. mit dem Steuerberater prüfen; genau dafür sind sie hier änderbar.\n\n`validFrom`/`validTo` sind kein Komfort: ein Beleg vom 30. Juni muss den alten Satz behalten,\nauch wenn am 1. Juli der neue gilt. Eine Satzänderung OHNE neues Fenster verfälscht rückwirkend\ndie Meldung des laufenden Quartals."},"CreditOverride-credit_override.read":{"type":"object","description":"Einzelfreigabe über das Kreditlimit hinweg (Doc 25 AP 6.4).\n\nEigenes Recht `creditcontrol.limit.override` — bewusst getrennt vom Pflegen der Profile: wer\nLimits einträgt, soll nicht zwangsläufig auch über sie hinweg entscheiden dürfen. Die\nBegründung ist Pflicht (Muster der manuellen Versandfreigabe, AP 3.1); die Aktion läuft über\ndie API und wird damit vom Audit-Subscriber mitgeschrieben.\n\nKein DELETE, sondern `revoke`: eine widerrufene Freigabe bleibt als Zeile stehen.","properties":{"ulid":{"type":["string","null"]},"salesOrderUlid":{"description":"Freizugebender Auftrag — Pflicht bei Anlage.","type":["string","null"]},"customerId":{"type":["integer","null"]},"reason":{"minLength":5,"maxLength":2000,"description":"Pflicht — die Begründung ist der Prüfpfad.","type":["string","null"]},"balanceAtOverride":{"description":"Offener Saldo im Moment der Freigabe (read-only).","type":["integer","null"]},"limitAtOverride":{"description":"Rahmen im Moment der Freigabe (read-only).","type":["integer","null"]},"grantedBy":{"type":["string","null"]},"grantedAt":{"type":["string","null"]},"revoked":{"type":["boolean","null"]},"revokedAt":{"type":["string","null"]}}},"CreditOverride-credit_override.write":{"type":"object","description":"Einzelfreigabe über das Kreditlimit hinweg (Doc 25 AP 6.4).\n\nEigenes Recht `creditcontrol.limit.override` — bewusst getrennt vom Pflegen der Profile: wer\nLimits einträgt, soll nicht zwangsläufig auch über sie hinweg entscheiden dürfen. Die\nBegründung ist Pflicht (Muster der manuellen Versandfreigabe, AP 3.1); die Aktion läuft über\ndie API und wird damit vom Audit-Subscriber mitgeschrieben.\n\nKein DELETE, sondern `revoke`: eine widerrufene Freigabe bleibt als Zeile stehen.","properties":{"salesOrderUlid":{"description":"Freizugebender Auftrag — Pflicht bei Anlage.","type":["string","null"]},"reason":{"minLength":5,"maxLength":2000,"description":"Pflicht — die Begründung ist der Prüfpfad.","type":["string","null"]}}},"CreditOverride.jsonld-credit_override.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"salesOrderUlid":{"description":"Freizugebender Auftrag — Pflicht bei Anlage.","type":["string","null"]},"customerId":{"type":["integer","null"]},"reason":{"minLength":5,"maxLength":2000,"description":"Pflicht — die Begründung ist der Prüfpfad.","type":["string","null"]},"balanceAtOverride":{"description":"Offener Saldo im Moment der Freigabe (read-only).","type":["integer","null"]},"limitAtOverride":{"description":"Rahmen im Moment der Freigabe (read-only).","type":["integer","null"]},"grantedBy":{"type":["string","null"]},"grantedAt":{"type":["string","null"]},"revoked":{"type":["boolean","null"]},"revokedAt":{"type":["string","null"]}}}],"description":"Einzelfreigabe über das Kreditlimit hinweg (Doc 25 AP 6.4).\n\nEigenes Recht `creditcontrol.limit.override` — bewusst getrennt vom Pflegen der Profile: wer\nLimits einträgt, soll nicht zwangsläufig auch über sie hinweg entscheiden dürfen. Die\nBegründung ist Pflicht (Muster der manuellen Versandfreigabe, AP 3.1); die Aktion läuft über\ndie API und wird damit vom Audit-Subscriber mitgeschrieben.\n\nKein DELETE, sondern `revoke`: eine widerrufene Freigabe bleibt als Zeile stehen."},"CreditProfile-credit_profile.read":{"type":"object","description":"Kreditprofil je Kunde (Doc 25 AP 6.4, Spec 04-46 §5).\n\nDie Antwort trägt neben dem Rahmen IMMER den aktuellen offenen Saldo und die höchste offene\nMahnstufe — die Frage am Kreditprofil lautet nie „welches Limit hat der Kunde\", sondern „wie\n * weit ist es ausgeschöpft\".","properties":{"ulid":{"type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"description":"Kunde — Pflicht bei Anlage, danach unveränderlich.","type":["integer","null"]},"limitAmount":{"minimum":0,"description":"Kreditrahmen in Cent. null = kein Rahmen, 0 = kein Kredit (Vorkasse).","type":["integer","null"]},"includeOpenOrders":{"description":"Zählen bestätigte, noch nicht fakturierte Aufträge in den Saldo? (Default true).","type":["boolean","null"]},"blockFromDunningLevel":{"minimum":0,"description":"Ab dieser erreichten Mahnstufe wird unabhängig vom Rahmen gesperrt; null/0 = keine Kopplung.","type":["integer","null"]},"riskClass":{"enum":["low","normal","high"],"description":"low | normal | high — reine Einordnung.","type":["string","null"]},"note":{"type":["string","null"]},"active":{"type":["boolean","null"]},"openBalanceAmount":{"description":"Offener Saldo in Cent (read-only): offene Rechnungen + ggf. bestätigte, nicht fakturierte Aufträge.","type":["integer","null"]},"openInvoiceAmount":{"description":"Anteil aus offenen Rechnungen (read-only).","type":["integer","null"]},"openOrderAmount":{"description":"Anteil aus bestätigten, nicht fakturierten Aufträgen (read-only).","type":["integer","null"]},"availableAmount":{"description":"Verbleibender Rahmen in Cent (read-only); null ohne Rahmen. Negativ = überschritten.","type":["integer","null"]},"dunningLevel":{"description":"Höchste offene Mahnstufe des Kunden (read-only); null = keine offene Mahnung.","type":["integer","null"]},"exceeded":{"description":"Ist der Rahmen aktuell überschritten? (read-only).","type":["boolean","null"]}}},"CreditProfile-credit_profile.write":{"type":"object","description":"Kreditprofil je Kunde (Doc 25 AP 6.4, Spec 04-46 §5).\n\nDie Antwort trägt neben dem Rahmen IMMER den aktuellen offenen Saldo und die höchste offene\nMahnstufe — die Frage am Kreditprofil lautet nie „welches Limit hat der Kunde\", sondern „wie\n * weit ist es ausgeschöpft\".","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"description":"Kunde — Pflicht bei Anlage, danach unveränderlich.","type":["integer","null"]},"limitAmount":{"minimum":0,"description":"Kreditrahmen in Cent. null = kein Rahmen, 0 = kein Kredit (Vorkasse).","type":["integer","null"]},"includeOpenOrders":{"description":"Zählen bestätigte, noch nicht fakturierte Aufträge in den Saldo? (Default true).","type":["boolean","null"]},"blockFromDunningLevel":{"minimum":0,"description":"Ab dieser erreichten Mahnstufe wird unabhängig vom Rahmen gesperrt; null/0 = keine Kopplung.","type":["integer","null"]},"riskClass":{"enum":["low","normal","high"],"description":"low | normal | high — reine Einordnung.","type":["string","null"]},"note":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"CreditProfile-credit_profile.write.jsonMergePatch":{"type":"object","description":"Kreditprofil je Kunde (Doc 25 AP 6.4, Spec 04-46 §5).\n\nDie Antwort trägt neben dem Rahmen IMMER den aktuellen offenen Saldo und die höchste offene\nMahnstufe — die Frage am Kreditprofil lautet nie „welches Limit hat der Kunde\", sondern „wie\n * weit ist es ausgeschöpft\".","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"description":"Kunde — Pflicht bei Anlage, danach unveränderlich.","type":["integer","null"]},"limitAmount":{"minimum":0,"description":"Kreditrahmen in Cent. null = kein Rahmen, 0 = kein Kredit (Vorkasse).","type":["integer","null"]},"includeOpenOrders":{"description":"Zählen bestätigte, noch nicht fakturierte Aufträge in den Saldo? (Default true).","type":["boolean","null"]},"blockFromDunningLevel":{"minimum":0,"description":"Ab dieser erreichten Mahnstufe wird unabhängig vom Rahmen gesperrt; null/0 = keine Kopplung.","type":["integer","null"]},"riskClass":{"enum":["low","normal","high"],"description":"low | normal | high — reine Einordnung.","type":["string","null"]},"note":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"CreditProfile.jsonld-credit_profile.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"description":"Kunde — Pflicht bei Anlage, danach unveränderlich.","type":["integer","null"]},"limitAmount":{"minimum":0,"description":"Kreditrahmen in Cent. null = kein Rahmen, 0 = kein Kredit (Vorkasse).","type":["integer","null"]},"includeOpenOrders":{"description":"Zählen bestätigte, noch nicht fakturierte Aufträge in den Saldo? (Default true).","type":["boolean","null"]},"blockFromDunningLevel":{"minimum":0,"description":"Ab dieser erreichten Mahnstufe wird unabhängig vom Rahmen gesperrt; null/0 = keine Kopplung.","type":["integer","null"]},"riskClass":{"enum":["low","normal","high"],"description":"low | normal | high — reine Einordnung.","type":["string","null"]},"note":{"type":["string","null"]},"active":{"type":["boolean","null"]},"openBalanceAmount":{"description":"Offener Saldo in Cent (read-only): offene Rechnungen + ggf. bestätigte, nicht fakturierte Aufträge.","type":["integer","null"]},"openInvoiceAmount":{"description":"Anteil aus offenen Rechnungen (read-only).","type":["integer","null"]},"openOrderAmount":{"description":"Anteil aus bestätigten, nicht fakturierten Aufträgen (read-only).","type":["integer","null"]},"availableAmount":{"description":"Verbleibender Rahmen in Cent (read-only); null ohne Rahmen. Negativ = überschritten.","type":["integer","null"]},"dunningLevel":{"description":"Höchste offene Mahnstufe des Kunden (read-only); null = keine offene Mahnung.","type":["integer","null"]},"exceeded":{"description":"Ist der Rahmen aktuell überschritten? (read-only).","type":["boolean","null"]}}}],"description":"Kreditprofil je Kunde (Doc 25 AP 6.4, Spec 04-46 §5).\n\nDie Antwort trägt neben dem Rahmen IMMER den aktuellen offenen Saldo und die höchste offene\nMahnstufe — die Frage am Kreditprofil lautet nie „welches Limit hat der Kunde\", sondern „wie\n * weit ist es ausgeschöpft\"."},"CrmActivity-crm_activity.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["note","task","call","meeting","email"],"default":"note","type":"string"},"subject":{"maxLength":500,"description":"Betreff — bei type=call zugleich das Anliegen des Gespraechs; ohnehin durchgaengig Pflicht.","default":"","type":"string"},"body":{"type":["string","null"]},"targetType":{"enum":["customer","contact","deal"],"default":"deal","type":"string"},"targetId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"dueAt":{"type":["string","null"]},"doneAt":{"type":["string","null"]},"remindAt":{"description":"Zeitpunktgenaue Erinnerung (Doc 26 3.8).","type":["string","null"]},"locationUrl":{"maxLength":500,"description":"Video-Call-/Meeting-Link (Doc 26 3.8).","type":["string","null"]},"durationMinutes":{"minimum":1,"maximum":1440,"description":"Dauer in Minuten (Doc 44 Stufe 1); null = 30 Minuten Standarddauer.","type":["integer","null"]},"contactName":{"maxLength":200,"description":"Name des Gespraechspartners. Beim ANLEGEN eines Anrufs PFLICHT — eine Anruf-Erinnerung ohne\nNamen zwingt zum Nachschlagen im verknuepften Datensatz. Beim AENDERN nicht erzwungen\n(Bestandszeilen tragen die Angabe nicht); geleert werden darf eine vorhandene aber nicht.","type":["string","null"]},"contactPhone":{"maxLength":60,"description":"Rufnummer des Gespraechspartners. Beim Anlegen eines Anrufs PFLICHT (gleicher Grund wie contactName).","type":["string","null"]},"targetLabel":{"description":"Klartext-Name des Bezugs (Kunde/Kontakt/Deal) — read-only, geloeschtes Ziel = null.","type":["string","null"]},"targetUlid":{"description":"ULID des Bezugs fuer den Sprung auf dessen Detailseite — read-only.","type":["string","null"]},"targetPhone":{"description":"Am Bezug hinterlegte Rufnummer (Deal → Rufnummer des Kunden) — read-only, Ersatz fuer contactPhone.","type":["string","null"]},"isDone":{"default":false,"type":"boolean"},"calendarEventId":{"maxLength":255,"type":["string","null"]},"externalRefs":{"description":"Migrationsherkunft (HubSpot/awork), z.B. {\"hubspot\": \"123\"}.","type":["object","null"],"additionalProperties":{"type":"string"}},"reminderSentAt":{"description":"Zeitpunkt der Fälligkeits-Erinnerung (Scheduler) — read-only, null = noch nicht erinnert.","type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["type","subject","targetType","targetId"]},"CrmActivity-crm_activity.write":{"type":"object","required":["type","subject","targetType","targetId"],"properties":{"type":{"enum":["note","task","call","meeting","email"],"default":"note","type":"string"},"subject":{"maxLength":500,"description":"Betreff — bei type=call zugleich das Anliegen des Gespraechs; ohnehin durchgaengig Pflicht.","default":"","type":"string"},"body":{"type":["string","null"]},"targetType":{"enum":["customer","contact","deal"],"default":"deal","type":"string"},"targetId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"dueAt":{"type":["string","null"]},"doneAt":{"type":["string","null"]},"remindAt":{"description":"Zeitpunktgenaue Erinnerung (Doc 26 3.8).","type":["string","null"]},"locationUrl":{"maxLength":500,"description":"Video-Call-/Meeting-Link (Doc 26 3.8).","type":["string","null"]},"durationMinutes":{"minimum":1,"maximum":1440,"description":"Dauer in Minuten (Doc 44 Stufe 1); null = 30 Minuten Standarddauer.","type":["integer","null"]},"contactName":{"maxLength":200,"description":"Name des Gespraechspartners. Beim ANLEGEN eines Anrufs PFLICHT — eine Anruf-Erinnerung ohne\nNamen zwingt zum Nachschlagen im verknuepften Datensatz. Beim AENDERN nicht erzwungen\n(Bestandszeilen tragen die Angabe nicht); geleert werden darf eine vorhandene aber nicht.","type":["string","null"]},"contactPhone":{"maxLength":60,"description":"Rufnummer des Gespraechspartners. Beim Anlegen eines Anrufs PFLICHT (gleicher Grund wie contactName).","type":["string","null"]},"calendarEventId":{"maxLength":255,"type":["string","null"]},"externalRefs":{"description":"Migrationsherkunft (HubSpot/awork), z.B. {\"hubspot\": \"123\"}.","type":["object","null"],"additionalProperties":{"type":"string"}}}},"CrmActivity-crm_activity.write.jsonMergePatch":{"type":"object","properties":{"type":{"enum":["note","task","call","meeting","email"],"default":"note","type":"string"},"subject":{"maxLength":500,"description":"Betreff — bei type=call zugleich das Anliegen des Gespraechs; ohnehin durchgaengig Pflicht.","default":"","type":"string"},"body":{"type":["string","null"]},"targetType":{"enum":["customer","contact","deal"],"default":"deal","type":"string"},"targetId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"dueAt":{"type":["string","null"]},"doneAt":{"type":["string","null"]},"remindAt":{"description":"Zeitpunktgenaue Erinnerung (Doc 26 3.8).","type":["string","null"]},"locationUrl":{"maxLength":500,"description":"Video-Call-/Meeting-Link (Doc 26 3.8).","type":["string","null"]},"durationMinutes":{"minimum":1,"maximum":1440,"description":"Dauer in Minuten (Doc 44 Stufe 1); null = 30 Minuten Standarddauer.","type":["integer","null"]},"contactName":{"maxLength":200,"description":"Name des Gespraechspartners. Beim ANLEGEN eines Anrufs PFLICHT — eine Anruf-Erinnerung ohne\nNamen zwingt zum Nachschlagen im verknuepften Datensatz. Beim AENDERN nicht erzwungen\n(Bestandszeilen tragen die Angabe nicht); geleert werden darf eine vorhandene aber nicht.","type":["string","null"]},"contactPhone":{"maxLength":60,"description":"Rufnummer des Gespraechspartners. Beim Anlegen eines Anrufs PFLICHT (gleicher Grund wie contactName).","type":["string","null"]},"calendarEventId":{"maxLength":255,"type":["string","null"]},"externalRefs":{"description":"Migrationsherkunft (HubSpot/awork), z.B. {\"hubspot\": \"123\"}.","type":["object","null"],"additionalProperties":{"type":"string"}}}},"CrmActivity.jsonld-crm_activity.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["note","task","call","meeting","email"],"default":"note","type":"string"},"subject":{"maxLength":500,"description":"Betreff — bei type=call zugleich das Anliegen des Gespraechs; ohnehin durchgaengig Pflicht.","default":"","type":"string"},"body":{"type":["string","null"]},"targetType":{"enum":["customer","contact","deal"],"default":"deal","type":"string"},"targetId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"dueAt":{"type":["string","null"]},"doneAt":{"type":["string","null"]},"remindAt":{"description":"Zeitpunktgenaue Erinnerung (Doc 26 3.8).","type":["string","null"]},"locationUrl":{"maxLength":500,"description":"Video-Call-/Meeting-Link (Doc 26 3.8).","type":["string","null"]},"durationMinutes":{"minimum":1,"maximum":1440,"description":"Dauer in Minuten (Doc 44 Stufe 1); null = 30 Minuten Standarddauer.","type":["integer","null"]},"contactName":{"maxLength":200,"description":"Name des Gespraechspartners. Beim ANLEGEN eines Anrufs PFLICHT — eine Anruf-Erinnerung ohne\nNamen zwingt zum Nachschlagen im verknuepften Datensatz. Beim AENDERN nicht erzwungen\n(Bestandszeilen tragen die Angabe nicht); geleert werden darf eine vorhandene aber nicht.","type":["string","null"]},"contactPhone":{"maxLength":60,"description":"Rufnummer des Gespraechspartners. Beim Anlegen eines Anrufs PFLICHT (gleicher Grund wie contactName).","type":["string","null"]},"targetLabel":{"description":"Klartext-Name des Bezugs (Kunde/Kontakt/Deal) — read-only, geloeschtes Ziel = null.","type":["string","null"]},"targetUlid":{"description":"ULID des Bezugs fuer den Sprung auf dessen Detailseite — read-only.","type":["string","null"]},"targetPhone":{"description":"Am Bezug hinterlegte Rufnummer (Deal → Rufnummer des Kunden) — read-only, Ersatz fuer contactPhone.","type":["string","null"]},"isDone":{"default":false,"type":"boolean"},"calendarEventId":{"maxLength":255,"type":["string","null"]},"externalRefs":{"description":"Migrationsherkunft (HubSpot/awork), z.B. {\"hubspot\": \"123\"}.","type":["object","null"],"additionalProperties":{"type":"string"}},"reminderSentAt":{"description":"Zeitpunkt der Fälligkeits-Erinnerung (Scheduler) — read-only, null = noch nicht erinnert.","type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["type","subject","targetType","targetId"]}]},"CrmAssist-crm_assist.read":{"type":"object","description":"KI-Vertriebsassistenz für Deal/Lead (Doc 26 Stufe 7). `mode=draft_email` (7.1) erzeugt einen\nE-Mail-Entwurf, der Rückgabetext füllt im Composer das `body`-Feld vor. Weitere Modi folgen\n(7.2 summary …). Budget-Überschreitung → 409 (`errors.crm.aiBudgetExceeded`).\n\nDas `security`-Attribut ist SUBJEKTLOS (die Operation hat kein geladenes Objekt) und damit nur\ndas halbe Tor: den Subjekt-Schnitt zieht {@see \\Octi\\Plugin\\Crm\\Service\\CrmAssistService} über\n{@see \\App\\Platform\\Communication\\Service\\CommunicationSubjectGuard::assertCanViewSubject()} —\nfremde Marke, `owner_only` oder fehlendes Leserecht ⇒ 404 (Audit R41-N03).","properties":{"ulid":{"type":["string","null"]},"mode":{"enum":["draft_email","summarize","enrich"],"default":"draft_email","type":"string"},"assist":{"description":"Erzeugter Text (Entwurf) — null, wenn KI aus oder kein Kontext.","type":["string","null"]}}},"CrmAssist-crm_assist.write":{"type":"object","description":"KI-Vertriebsassistenz für Deal/Lead (Doc 26 Stufe 7). `mode=draft_email` (7.1) erzeugt einen\nE-Mail-Entwurf, der Rückgabetext füllt im Composer das `body`-Feld vor. Weitere Modi folgen\n(7.2 summary …). Budget-Überschreitung → 409 (`errors.crm.aiBudgetExceeded`).\n\nDas `security`-Attribut ist SUBJEKTLOS (die Operation hat kein geladenes Objekt) und damit nur\ndas halbe Tor: den Subjekt-Schnitt zieht {@see \\Octi\\Plugin\\Crm\\Service\\CrmAssistService} über\n{@see \\App\\Platform\\Communication\\Service\\CommunicationSubjectGuard::assertCanViewSubject()} —\nfremde Marke, `owner_only` oder fehlendes Leserecht ⇒ 404 (Audit R41-N03).","properties":{"mode":{"enum":["draft_email","summarize","enrich"],"default":"draft_email","type":"string"},"hint":{"description":"Optionaler Freitext-Hinweis für den Entwurf.","type":["string","null"]}}},"CrmAssist.jsonld-crm_assist.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"mode":{"enum":["draft_email","summarize","enrich"],"default":"draft_email","type":"string"},"assist":{"description":"Erzeugter Text (Entwurf) — null, wenn KI aus oder kein Kontext.","type":["string","null"]}}}],"description":"KI-Vertriebsassistenz für Deal/Lead (Doc 26 Stufe 7). `mode=draft_email` (7.1) erzeugt einen\nE-Mail-Entwurf, der Rückgabetext füllt im Composer das `body`-Feld vor. Weitere Modi folgen\n(7.2 summary …). Budget-Überschreitung → 409 (`errors.crm.aiBudgetExceeded`).\n\nDas `security`-Attribut ist SUBJEKTLOS (die Operation hat kein geladenes Objekt) und damit nur\ndas halbe Tor: den Subjekt-Schnitt zieht {@see \\Octi\\Plugin\\Crm\\Service\\CrmAssistService} über\n{@see \\App\\Platform\\Communication\\Service\\CommunicationSubjectGuard::assertCanViewSubject()} —\nfremde Marke, `owner_only` oder fehlendes Leserecht ⇒ 404 (Audit R41-N03)."},"CrmComposeMail-crm_compose_mail.read":{"type":"object","description":"1:1-Mailversand aus einem Deal/Lead (Doc 26 1.3) über den Communication-Send-Pfad (U-1): erzeugt\neine kundensichtbare `CommunicationMessage` und versendet — sofort oder zeitversetzt (send-later).\nPlatzhalter im Body ({{ customer_name }}, {{ contact_name }}, {{ deal_title }} …) werden aufgelöst.\nEmpfänger = Primärkontakt des Subjekts. Gruppen-Mail (Bulk) + Versand über das persönliche Postfach\ndes Owners sind spätere Verfeinerungen dieser Stufe.\n\nDas `security`-Attribut ist SUBJEKTLOS (das Subjekt steht erst im Rumpf): den Schnitt auf genau\ndieses Subjekt zieht der Processor über\n{@see \\App\\Platform\\Communication\\Service\\CommunicationAccess::assertCanPost()} — fremde Marke,\n`owner_only` oder fehlendes Recht ⇒ 404 (Audit R41-N03).","properties":{"id":{"type":["string","null"]},"sent":{"default":false,"type":"boolean"},"scheduled":{"default":false,"type":"boolean"},"scheduledFor":{"type":["string","null"],"format":"date-time"},"messageUlid":{"type":["string","null"]}}},"CrmComposeMail-crm_compose_mail.write":{"type":"object","description":"1:1-Mailversand aus einem Deal/Lead (Doc 26 1.3) über den Communication-Send-Pfad (U-1): erzeugt\neine kundensichtbare `CommunicationMessage` und versendet — sofort oder zeitversetzt (send-later).\nPlatzhalter im Body ({{ customer_name }}, {{ contact_name }}, {{ deal_title }} …) werden aufgelöst.\nEmpfänger = Primärkontakt des Subjekts. Gruppen-Mail (Bulk) + Versand über das persönliche Postfach\ndes Owners sind spätere Verfeinerungen dieser Stufe.\n\nDas `security`-Attribut ist SUBJEKTLOS (das Subjekt steht erst im Rumpf): den Schnitt auf genau\ndieses Subjekt zieht der Processor über\n{@see \\App\\Platform\\Communication\\Service\\CommunicationAccess::assertCanPost()} — fremde Marke,\n`owner_only` oder fehlendes Recht ⇒ 404 (Audit R41-N03).","required":["subjectType","subjectId","body"],"properties":{"subjectType":{"enum":["deal","lead"],"description":"Subjekt-Typ: deal | lead.","default":"deal","type":"string"},"subjectId":{"description":"ULID des Deals/Leads.","default":"","type":"string"},"subject":{"maxLength":255,"type":["string","null"]},"body":{"default":"","type":"string"},"sendAt":{"description":"Optionaler Versandzeitpunkt (ISO 8601). In der Zukunft ⇒ send-later (Queue).","type":["string","null"],"format":"date-time"}}},"CrmComposeMail.jsonld-crm_compose_mail.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"sent":{"default":false,"type":"boolean"},"scheduled":{"default":false,"type":"boolean"},"scheduledFor":{"type":["string","null"],"format":"date-time"},"messageUlid":{"type":["string","null"]}}}],"description":"1:1-Mailversand aus einem Deal/Lead (Doc 26 1.3) über den Communication-Send-Pfad (U-1): erzeugt\neine kundensichtbare `CommunicationMessage` und versendet — sofort oder zeitversetzt (send-later).\nPlatzhalter im Body ({{ customer_name }}, {{ contact_name }}, {{ deal_title }} …) werden aufgelöst.\nEmpfänger = Primärkontakt des Subjekts. Gruppen-Mail (Bulk) + Versand über das persönliche Postfach\ndes Owners sind spätere Verfeinerungen dieser Stufe.\n\nDas `security`-Attribut ist SUBJEKTLOS (das Subjekt steht erst im Rumpf): den Schnitt auf genau\ndieses Subjekt zieht der Processor über\n{@see \\App\\Platform\\Communication\\Service\\CommunicationAccess::assertCanPost()} — fremde Marke,\n`owner_only` oder fehlendes Recht ⇒ 404 (Audit R41-N03)."},"CrmDealHealth-crm_deal_health.read":{"type":"object","description":"Deal-Gesundheit (Doc 26 7.3): heuristischer Win-Score, „stockt\"-Flag und Next-Best-Action-Schlüssel\n(Frontend übersetzt). Read-only, live berechnet, `crm.deal.view` + markenscharf.","properties":{"ulid":{"type":["string","null"]},"winScore":{"description":"0..100 (harte Endzustände: gewonnen=100, verloren=0).","default":0,"type":"integer"},"stalled":{"default":false,"type":"boolean"},"daysSinceActivity":{"type":["integer","null"]},"activityCount":{"default":0,"type":"integer"},"nextBestAction":{"description":"Handlungsempfehlung: closed|first_contact|follow_up|schedule_meeting|keep_engaged.","default":"keep_engaged","type":"string"}}},"CrmDealHealth.jsonld-crm_deal_health.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"winScore":{"description":"0..100 (harte Endzustände: gewonnen=100, verloren=0).","default":0,"type":"integer"},"stalled":{"default":false,"type":"boolean"},"daysSinceActivity":{"type":["integer","null"]},"activityCount":{"default":0,"type":"integer"},"nextBestAction":{"description":"Handlungsempfehlung: closed|first_contact|follow_up|schedule_meeting|keep_engaged.","default":"keep_engaged","type":"string"}}}],"description":"Deal-Gesundheit (Doc 26 7.3): heuristischer Win-Score, „stockt\"-Flag und Next-Best-Action-Schlüssel\n(Frontend übersetzt). Read-only, live berechnet, `crm.deal.view` + markenscharf."},"CrmForecast-crm_forecast.read":{"type":"object","description":"Forecast-Report (04-01 §4.3/AC10): gewichtet/ungewichtet, Best/Worst-Case, gewonnen/verloren.\nLive aggregiert, filterbar (ownerId/pipelineId/brandId), read-only, Beträge in Cent.","properties":{"id":{"type":["string","null"]},"totalPipeline":{"description":"Ungewichteter Wert aller offenen Deals (Cent).","default":0,"type":"integer"},"weightedPipeline":{"description":"Gewichteter Wert aller offenen Deals: Σ value × probability (Cent).","default":0,"type":"integer"},"bestCase":{"description":"Best Case = offene Pipeline + bereits gewonnen (Cent).","default":0,"type":"integer"},"worstCase":{"description":"Worst Case = nur bereits gewonnen (Cent).","default":0,"type":"integer"},"wonAmount":{"default":0,"type":"integer"},"lostAmount":{"default":0,"type":"integer"},"dealCount":{"description":"Anzahl aller betrachteten Deals (offen + gewonnen + verloren).","default":0,"type":"integer"},"wonMrr":{"description":"Σ MRR gewonnener Deals (gesicherter wiederkehrender Umsatz).","default":0,"type":"integer"},"wonArr":{"description":"Σ ARR gewonnener Deals.","default":0,"type":"integer"},"openMrr":{"description":"Σ MRR offener Deals (wiederkehrende Pipeline).","default":0,"type":"integer"},"openArr":{"description":"Σ ARR offener Deals.","default":0,"type":"integer"},"months":{"description":"Offene Pipeline nach erwartetem Abschlussmonat (Doc 26 3.3, Forecast-Board). `month`=`null` =\nohne Datum; Σ `value`/`weighted` deckt sich mit `totalPipeline`/`weightedPipeline`.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"ownerId":{"type":["integer","null"]},"pipelineId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]}}},"CrmForecast.jsonld-crm_forecast.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"totalPipeline":{"description":"Ungewichteter Wert aller offenen Deals (Cent).","default":0,"type":"integer"},"weightedPipeline":{"description":"Gewichteter Wert aller offenen Deals: Σ value × probability (Cent).","default":0,"type":"integer"},"bestCase":{"description":"Best Case = offene Pipeline + bereits gewonnen (Cent).","default":0,"type":"integer"},"worstCase":{"description":"Worst Case = nur bereits gewonnen (Cent).","default":0,"type":"integer"},"wonAmount":{"default":0,"type":"integer"},"lostAmount":{"default":0,"type":"integer"},"dealCount":{"description":"Anzahl aller betrachteten Deals (offen + gewonnen + verloren).","default":0,"type":"integer"},"wonMrr":{"description":"Σ MRR gewonnener Deals (gesicherter wiederkehrender Umsatz).","default":0,"type":"integer"},"wonArr":{"description":"Σ ARR gewonnener Deals.","default":0,"type":"integer"},"openMrr":{"description":"Σ MRR offener Deals (wiederkehrende Pipeline).","default":0,"type":"integer"},"openArr":{"description":"Σ ARR offener Deals.","default":0,"type":"integer"},"months":{"description":"Offene Pipeline nach erwartetem Abschlussmonat (Doc 26 3.3, Forecast-Board). `month`=`null` =\nohne Datum; Σ `value`/`weighted` deckt sich mit `totalPipeline`/`weightedPipeline`.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"ownerId":{"type":["integer","null"]},"pipelineId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]}}}],"description":"Forecast-Report (04-01 §4.3/AC10): gewichtet/ungewichtet, Best/Worst-Case, gewonnen/verloren.\nLive aggregiert, filterbar (ownerId/pipelineId/brandId), read-only, Beträge in Cent."},"CrmFunnelReport-crm_funnel.read":{"type":"object","description":"CRM-Funnel/Analytics-Report (Doc 26 6.1): Vorwärts-Funnel je Stufe + Konversion + Ø Verweildauer,\nWon/Lost inkl. Verlustgründe, Durchschnittsalter offener Deals, Aktivitätsvolumen und\nE-Mail-Performance. Live\naggregiert, per `pipelineId` (Pflicht) + `from`/`to` + `brandId` gefiltert, read-only, Beträge in Cent.","properties":{"id":{"type":["string","null"]},"pipelineId":{"type":["integer","null"]},"pipelineName":{"type":["string","null"]},"stages":{"description":"Funnel je Stufe (nach sortOrder): erreichte Deals, Konversion zur Vorstufe (%) und\nØ Verweildauer in Tagen (`null` = keine abgeschlossenen Segmente im Fenster; `durationSamples`\nnennt die Zahl der ausgewerteten Stufen-Durchläufe).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"wonCount":{"default":0,"type":"integer"},"wonValue":{"description":"Σ Wert gewonnener Deals (Cent).","default":0,"type":"integer"},"lostCount":{"default":0,"type":"integer"},"lostByReason":{"description":"Verlorene Deals je Verlustgrund (absteigend).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"avgOpenAgeDays":{"default":0,"type":"integer"},"openCount":{"default":0,"type":"integer"},"activities":{"description":"Aktivitätsvolumen je Typ im Fenster.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"emailOpened":{"description":"E-Mail-Performance (Öffnungen/Klicks) der CRM-Subjekte im Fenster.","default":0,"type":"integer"},"emailClicked":{"default":0,"type":"integer"}}},"CrmFunnelReport.jsonld-crm_funnel.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"pipelineId":{"type":["integer","null"]},"pipelineName":{"type":["string","null"]},"stages":{"description":"Funnel je Stufe (nach sortOrder): erreichte Deals, Konversion zur Vorstufe (%) und\nØ Verweildauer in Tagen (`null` = keine abgeschlossenen Segmente im Fenster; `durationSamples`\nnennt die Zahl der ausgewerteten Stufen-Durchläufe).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"wonCount":{"default":0,"type":"integer"},"wonValue":{"description":"Σ Wert gewonnener Deals (Cent).","default":0,"type":"integer"},"lostCount":{"default":0,"type":"integer"},"lostByReason":{"description":"Verlorene Deals je Verlustgrund (absteigend).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"avgOpenAgeDays":{"default":0,"type":"integer"},"openCount":{"default":0,"type":"integer"},"activities":{"description":"Aktivitätsvolumen je Typ im Fenster.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"emailOpened":{"description":"E-Mail-Performance (Öffnungen/Klicks) der CRM-Subjekte im Fenster.","default":0,"type":"integer"},"emailClicked":{"default":0,"type":"integer"}}}],"description":"CRM-Funnel/Analytics-Report (Doc 26 6.1): Vorwärts-Funnel je Stufe + Konversion + Ø Verweildauer,\nWon/Lost inkl. Verlustgründe, Durchschnittsalter offener Deals, Aktivitätsvolumen und\nE-Mail-Performance. Live\naggregiert, per `pipelineId` (Pflicht) + `from`/`to` + `brandId` gefiltert, read-only, Beträge in Cent."},"CrmLostReason-crm_lost_reason.read":{"type":"object","description":"Konfigurierbarer Verlustgrund für Deals (Status als Daten), Schlüssel = `key`.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"category":{"enum":["price","timing","competitor","nofit","noresponse"],"description":"price|timing|competitor|nofit|noresponse.","type":["string","null"]},"active":{"type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]}}},"CrmLostReason-crm_lost_reason.update.jsonMergePatch":{"type":"object","description":"Konfigurierbarer Verlustgrund für Deals (Status als Daten), Schlüssel = `key`.","properties":{"label":{"type":["string","null"]},"category":{"enum":["price","timing","competitor","nofit","noresponse"],"description":"price|timing|competitor|nofit|noresponse.","type":["string","null"]},"active":{"type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]}}},"CrmLostReason-crm_lost_reason.write":{"type":"object","description":"Konfigurierbarer Verlustgrund für Deals (Status als Daten), Schlüssel = `key`.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["price","timing","competitor","nofit","noresponse"],"description":"price|timing|competitor|nofit|noresponse.","type":["string","null"]},"active":{"type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]}}},"CrmLostReason.jsonld-crm_lost_reason.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"category":{"enum":["price","timing","competitor","nofit","noresponse"],"description":"price|timing|competitor|nofit|noresponse.","type":["string","null"]},"active":{"type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]}}}],"description":"Konfigurierbarer Verlustgrund für Deals (Status als Daten), Schlüssel = `key`."},"CrmMerge-crm_merge.read":{"type":"object","description":"Deal-/Lead-Merge (Doc 26 3.1): der Datensatz im Pfad ({ulid}) ist der GEWINNER, `loserUlid` der\nVerlierer. Der Verlierer wird nach dem Umpointen soft-deleted.","properties":{"ulid":{"description":"ULID des GEWINNER-Datensatzes (Pfad-Identifier).","type":["string","null"]},"merged":{"default":false,"type":"boolean"}}},"CrmMerge-crm_merge.write":{"type":"object","description":"Deal-/Lead-Merge (Doc 26 3.1): der Datensatz im Pfad ({ulid}) ist der GEWINNER, `loserUlid` der\nVerlierer. Der Verlierer wird nach dem Umpointen soft-deleted.","required":["loserUlid"],"properties":{"loserUlid":{"description":"ULID des zu verschmelzenden (Verlierer-)Datensatzes.","default":"","type":"string"}}},"CrmMerge.jsonld-crm_merge.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID des GEWINNER-Datensatzes (Pfad-Identifier).","type":["string","null"]},"merged":{"default":false,"type":"boolean"}}}],"description":"Deal-/Lead-Merge (Doc 26 3.1): der Datensatz im Pfad ({ulid}) ist der GEWINNER, `loserUlid` der\nVerlierer. Der Verlierer wird nach dem Umpointen soft-deleted."},"CrmSource-crm_source.read":{"type":"object","description":"Konfigurierbare Lead-/Deal-Quelle (Status als Daten), Schlüssel = `key`.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"category":{"enum":["inbound","outbound","referral","marketing"],"description":"inbound|outbound|referral|marketing.","type":["string","null"]},"active":{"type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]}}},"CrmSource-crm_source.update.jsonMergePatch":{"type":"object","description":"Konfigurierbare Lead-/Deal-Quelle (Status als Daten), Schlüssel = `key`.","properties":{"label":{"type":["string","null"]},"category":{"enum":["inbound","outbound","referral","marketing"],"description":"inbound|outbound|referral|marketing.","type":["string","null"]},"active":{"type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]}}},"CrmSource-crm_source.write":{"type":"object","description":"Konfigurierbare Lead-/Deal-Quelle (Status als Daten), Schlüssel = `key`.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["inbound","outbound","referral","marketing"],"description":"inbound|outbound|referral|marketing.","type":["string","null"]},"active":{"type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]}}},"CrmSource.jsonld-crm_source.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"category":{"enum":["inbound","outbound","referral","marketing"],"description":"inbound|outbound|referral|marketing.","type":["string","null"]},"active":{"type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]}}}],"description":"Konfigurierbare Lead-/Deal-Quelle (Status als Daten), Schlüssel = `key`."},"CrmTicketLink-crmticketlink.read":{"type":"object","description":"Verknüpfung CRM-Vorgang (Deal/Lead) ↔ Ticket, über {@see \\Octi\\Plugin\\Crm\\Entity\\CrmWorkItemLink}\n— analog {@see \\App\\WorkItem\\ApiResource\\WorkItemLinkResource}.\nBidirektional, Pflicht-Filter: subjectType+subjectId (→ Tickets) ODER workItemUlid (→ Deals/Leads).\nMarken-Scope/IDOR über den jeweiligen Vorgang; nicht zugreifbare Gegenstücke werden ausgeblendet.","properties":{"ulid":{"type":["string","null"]},"subjectType":{"enum":["deal","lead"],"description":"deal | lead — CRM-Seite der Verknüpfung.","type":["string","null"]},"subjectId":{"maxLength":26,"description":"ULID des Deals/Leads.","type":["string","null"]},"workItemUlid":{"maxLength":26,"description":"ULID des Tickets (WorkItem, kind=ticket).","type":["string","null"]},"linkType":{"enum":["relates"],"default":"relates","type":"string"},"relatedRef":{"type":["string","null"]},"relatedTitle":{"type":["string","null"]},"relatedKind":{"description":"Immer 'ticket' — steuert das Sprungziel im Frontend.","type":["string","null"]},"relatedStatusId":{"type":["string","null"]},"relatedPriorityId":{"type":["string","null"]},"relatedOwnerId":{"type":["integer","null"]},"relatedChannel":{"type":["string","null"]},"relatedClosedAt":{"type":["string","null"]},"relatedResolvedAt":{"type":["string","null"]},"relatedFirstResponseDueAt":{"type":["string","null"]},"relatedResolutionDueAt":{"type":["string","null"]},"relatedFirstRespondedAt":{"type":["string","null"]},"relatedSlaBreached":{"default":false,"type":"boolean"},"relatedUpdatedAt":{"type":["string","null"]},"relatedLastMessageAt":{"type":["string","null"]},"relatedLastMessageDirection":{"type":["string","null"]},"relatedMessageCount":{"default":0,"type":"integer"},"subjectTitle":{"type":["string","null"]},"subjectStatus":{"description":"Deal: Stage-Name; Lead: Status-Key.","type":["string","null"]}},"required":["subjectType","subjectId","workItemUlid"]},"CrmTicketLink-crmticketlink.write":{"type":"object","description":"Verknüpfung CRM-Vorgang (Deal/Lead) ↔ Ticket, über {@see \\Octi\\Plugin\\Crm\\Entity\\CrmWorkItemLink}\n— analog {@see \\App\\WorkItem\\ApiResource\\WorkItemLinkResource}.\nBidirektional, Pflicht-Filter: subjectType+subjectId (→ Tickets) ODER workItemUlid (→ Deals/Leads).\nMarken-Scope/IDOR über den jeweiligen Vorgang; nicht zugreifbare Gegenstücke werden ausgeblendet.","required":["subjectType","subjectId","workItemUlid"],"properties":{"subjectType":{"enum":["deal","lead"],"description":"deal | lead — CRM-Seite der Verknüpfung.","type":["string","null"]},"subjectId":{"maxLength":26,"description":"ULID des Deals/Leads.","type":["string","null"]},"workItemUlid":{"maxLength":26,"description":"ULID des Tickets (WorkItem, kind=ticket).","type":["string","null"]},"linkType":{"enum":["relates"],"default":"relates","type":"string"}}},"CrmTicketLink.jsonld-crmticketlink.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"subjectType":{"enum":["deal","lead"],"description":"deal | lead — CRM-Seite der Verknüpfung.","type":["string","null"]},"subjectId":{"maxLength":26,"description":"ULID des Deals/Leads.","type":["string","null"]},"workItemUlid":{"maxLength":26,"description":"ULID des Tickets (WorkItem, kind=ticket).","type":["string","null"]},"linkType":{"enum":["relates"],"default":"relates","type":"string"},"relatedRef":{"type":["string","null"]},"relatedTitle":{"type":["string","null"]},"relatedKind":{"description":"Immer 'ticket' — steuert das Sprungziel im Frontend.","type":["string","null"]},"relatedStatusId":{"type":["string","null"]},"relatedPriorityId":{"type":["string","null"]},"relatedOwnerId":{"type":["integer","null"]},"relatedChannel":{"type":["string","null"]},"relatedClosedAt":{"type":["string","null"]},"relatedResolvedAt":{"type":["string","null"]},"relatedFirstResponseDueAt":{"type":["string","null"]},"relatedResolutionDueAt":{"type":["string","null"]},"relatedFirstRespondedAt":{"type":["string","null"]},"relatedSlaBreached":{"default":false,"type":"boolean"},"relatedUpdatedAt":{"type":["string","null"]},"relatedLastMessageAt":{"type":["string","null"]},"relatedLastMessageDirection":{"type":["string","null"]},"relatedMessageCount":{"default":0,"type":"integer"},"subjectTitle":{"type":["string","null"]},"subjectStatus":{"description":"Deal: Stage-Name; Lead: Status-Key.","type":["string","null"]}},"required":["subjectType","subjectId","workItemUlid"]}],"description":"Verknüpfung CRM-Vorgang (Deal/Lead) ↔ Ticket, über {@see \\Octi\\Plugin\\Crm\\Entity\\CrmWorkItemLink}\n— analog {@see \\App\\WorkItem\\ApiResource\\WorkItemLinkResource}.\nBidirektional, Pflicht-Filter: subjectType+subjectId (→ Tickets) ODER workItemUlid (→ Deals/Leads).\nMarken-Scope/IDOR über den jeweiligen Vorgang; nicht zugreifbare Gegenstücke werden ausgeblendet."},"CsatRating-csat.read":{"type":"object","description":"CSAT-Bewertung (04-04 §4 S4-1/T7) — Liste/Detail für Reporting + Abgabe via Einmal-Token.\nAbgabe bewusst öffentlich (`security: \"true\"`, PUBLIC_ACCESS `/v1/tickets/public/`) — Mail-Link\nohne Login, Autorisierung via Einmal-Token (unguessbar, 32 Hex). Unbekannte/verbrauchte Token:\nabgelehnt in {@see \\Octi\\Plugin\\Tickets\\Service\\CsatService::submit()}.","properties":{"ulid":{"type":["string","null"]},"workItemId":{"type":["integer","null"]},"ticketUlid":{"description":"ULID des verknüpften Tickets — Sprungziel CSAT-Review-Link. Detail-Route nur über ULID;\n{@see $workItemId} (numerisch) matcht dort nie (404).","type":["string","null"]},"customerId":{"type":["integer","null"]},"score":{"minimum":1,"maximum":5,"type":["integer","null"]},"comment":{"maxLength":2000,"type":["string","null"]},"requestedAt":{"type":["string","null"]},"ratedAt":{"type":["string","null"]}},"required":["score"]},"CsatRating-csat.write":{"type":"object","description":"CSAT-Bewertung (04-04 §4 S4-1/T7) — Liste/Detail für Reporting + Abgabe via Einmal-Token.\nAbgabe bewusst öffentlich (`security: \"true\"`, PUBLIC_ACCESS `/v1/tickets/public/`) — Mail-Link\nohne Login, Autorisierung via Einmal-Token (unguessbar, 32 Hex). Unbekannte/verbrauchte Token:\nabgelehnt in {@see \\Octi\\Plugin\\Tickets\\Service\\CsatService::submit()}.","required":["token","score"],"properties":{"token":{"maxLength":64,"description":"Einmal-Token (Eingabe bei der Abgabe).","type":["string","null"]},"score":{"minimum":1,"maximum":5,"type":["integer","null"]},"comment":{"maxLength":2000,"type":["string","null"]}}},"CsatRating.jsonld-csat.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"workItemId":{"type":["integer","null"]},"ticketUlid":{"description":"ULID des verknüpften Tickets — Sprungziel CSAT-Review-Link. Detail-Route nur über ULID;\n{@see $workItemId} (numerisch) matcht dort nie (404).","type":["string","null"]},"customerId":{"type":["integer","null"]},"score":{"minimum":1,"maximum":5,"type":["integer","null"]},"comment":{"maxLength":2000,"type":["string","null"]},"requestedAt":{"type":["string","null"]},"ratedAt":{"type":["string","null"]}},"required":["score"]}],"description":"CSAT-Bewertung (04-04 §4 S4-1/T7) — Liste/Detail für Reporting + Abgabe via Einmal-Token.\nAbgabe bewusst öffentlich (`security: \"true\"`, PUBLIC_ACCESS `/v1/tickets/public/`) — Mail-Link\nohne Login, Autorisierung via Einmal-Token (unguessbar, 32 Hex). Unbekannte/verbrauchte Token:\nabgelehnt in {@see \\Octi\\Plugin\\Tickets\\Service\\CsatService::submit()}."},"CurrencyOption-currency_option.read":{"type":"object","description":"Die Frage, die JEDE Beleg-Oberfläche stellt, bevor sie eine Währungsauswahl anbietet:\n**gibt es hier überhaupt mehr als eine Währung?** (Doc 25 AP 10.1)\n\nSie steht im KERNEL, nicht im International-Plugin — obwohl die Antwort von dort kommt. Drei\nGründe:\n - Die Fragenden sind Kernel-nahe Beleg-Oberflächen (Angebot, Auftrag, Rechnung). Sie dürfen\n   keinen Endpunkt eines Fachplugins kennen, sonst hinge die Rechnungsmaske an der\n   Installation von `OctiInternational`.\n - Ohne Plugin muss die Antwort trotzdem kommen — und sie lautet dann „nur EUR\". Eine\n   404-antwortende Route wäre für den Aufrufer nicht von einem Fehler zu unterscheiden.\n - Die Auswahl ist eine Eigenschaft des Belegs, nicht des Steuer-/Kurs-Moduls.\n\nBewusst **ohne eigenes Recht** (nur angemeldet, wie der Steuersatz-Katalog): wer einen Beleg\nsehen darf, darf wissen, in welchen Währungen er entstehen kann. Die Liste enthält keine\nGeschäftsdaten — nur ISO-Codes.","properties":{"id":{"type":["string","null"]},"base":{"description":"Buchwährung der Installation — sie ist immer wählbar und braucht keinen Kurs.","type":["string","null"]},"multiCurrency":{"description":"Steht mehr als die Buchwährung zur Verfügung?","type":["boolean","null"]},"currencies":{"description":"ISO-4217-Codes, aufsteigend — inklusive der Buchwährung.","type":["array","null"],"items":{"type":"string"}}}},"CurrencyOption.jsonld-currency_option.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"base":{"description":"Buchwährung der Installation — sie ist immer wählbar und braucht keinen Kurs.","type":["string","null"]},"multiCurrency":{"description":"Steht mehr als die Buchwährung zur Verfügung?","type":["boolean","null"]},"currencies":{"description":"ISO-4217-Codes, aufsteigend — inklusive der Buchwährung.","type":["array","null"],"items":{"type":"string"}}}}],"description":"Die Frage, die JEDE Beleg-Oberfläche stellt, bevor sie eine Währungsauswahl anbietet:\n**gibt es hier überhaupt mehr als eine Währung?** (Doc 25 AP 10.1)\n\nSie steht im KERNEL, nicht im International-Plugin — obwohl die Antwort von dort kommt. Drei\nGründe:\n - Die Fragenden sind Kernel-nahe Beleg-Oberflächen (Angebot, Auftrag, Rechnung). Sie dürfen\n   keinen Endpunkt eines Fachplugins kennen, sonst hinge die Rechnungsmaske an der\n   Installation von `OctiInternational`.\n - Ohne Plugin muss die Antwort trotzdem kommen — und sie lautet dann „nur EUR\". Eine\n   404-antwortende Route wäre für den Aufrufer nicht von einem Fehler zu unterscheiden.\n - Die Auswahl ist eine Eigenschaft des Belegs, nicht des Steuer-/Kurs-Moduls.\n\nBewusst **ohne eigenes Recht** (nur angemeldet, wie der Steuersatz-Katalog): wer einen Beleg\nsehen darf, darf wissen, in welchen Währungen er entstehen kann. Die Liste enthält keine\nGeschäftsdaten — nur ISO-Codes."},"CustomFieldDefinitionResource-custom_field_definition.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"entityType":{"maxLength":100,"default":"","type":"string"},"brandScope":{"description":"Marken-Scope: null = global, sonst brandId der zuständigen Marke.","type":["integer","null"]},"key":{"maxLength":100,"default":"","type":"string"},"label":{"maxLength":255,"type":["string","null"]},"type":{"maxLength":20,"enum":["text","number","decimal","date","bool","select","multiselect","entity_ref","url","email","monetary","time","time_range","date_range","address","phone","autocomplete","formula"],"default":"text","type":"string"},"refTargetEntity":{"maxLength":100,"description":"Nur für type=entity_ref: entityType des Referenzziels (z.B. „customer\", „deal\").","type":["string","null"]},"options":{"type":["array","null"],"items":{"type":"string"}},"formula":{"maxLength":2000,"description":"Nur für type=formula (Doc 26 4.2): ExpressionLanguage-Ausdruck, read-time ausgewertet.","type":["string","null"]},"materialized":{"description":"Nur für type=formula (Doc 26 4.2 v2, E7): Ergebnis zusätzlich als Sortier-/Filter-Index\nmaterialisieren — macht das Feld in Listen sortier- und filterbar (`order[cf.<key>]`, `cfMin`/`cfMax`/`cfEq`).","default":false,"type":"boolean"},"requirementRules":{"description":"Pflicht-/Wichtig-Regeln je Kontext (Doc 26 4.3): `{\"<context>\": \"required\"|\"important\"}`.","type":["object","null"],"additionalProperties":{"type":"string"}},"required":{"default":false,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"},"active":{"default":true,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["entityType","key","type"]},"CustomFieldDefinitionResource-custom_field_definition.write":{"type":"object","required":["entityType","key","type"],"properties":{"entityType":{"maxLength":100,"default":"","type":"string"},"brandScope":{"description":"Marken-Scope: null = global, sonst brandId der zuständigen Marke.","type":["integer","null"]},"key":{"maxLength":100,"default":"","type":"string"},"label":{"maxLength":255,"type":["string","null"]},"type":{"maxLength":20,"enum":["text","number","decimal","date","bool","select","multiselect","entity_ref","url","email","monetary","time","time_range","date_range","address","phone","autocomplete","formula"],"default":"text","type":"string"},"refTargetEntity":{"maxLength":100,"description":"Nur für type=entity_ref: entityType des Referenzziels (z.B. „customer\", „deal\").","type":["string","null"]},"options":{"type":["array","null"],"items":{"type":"string"}},"formula":{"maxLength":2000,"description":"Nur für type=formula (Doc 26 4.2): ExpressionLanguage-Ausdruck, read-time ausgewertet.","type":["string","null"]},"materialized":{"description":"Nur für type=formula (Doc 26 4.2 v2, E7): Ergebnis zusätzlich als Sortier-/Filter-Index\nmaterialisieren — macht das Feld in Listen sortier- und filterbar (`order[cf.<key>]`, `cfMin`/`cfMax`/`cfEq`).","default":false,"type":"boolean"},"requirementRules":{"description":"Pflicht-/Wichtig-Regeln je Kontext (Doc 26 4.3): `{\"<context>\": \"required\"|\"important\"}`.","type":["object","null"],"additionalProperties":{"type":"string"}},"required":{"default":false,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"},"active":{"default":true,"type":"boolean"}}},"CustomFieldDefinitionResource-custom_field_definition.write.jsonMergePatch":{"type":"object","properties":{"entityType":{"maxLength":100,"default":"","type":"string"},"brandScope":{"description":"Marken-Scope: null = global, sonst brandId der zuständigen Marke.","type":["integer","null"]},"key":{"maxLength":100,"default":"","type":"string"},"label":{"maxLength":255,"type":["string","null"]},"type":{"maxLength":20,"enum":["text","number","decimal","date","bool","select","multiselect","entity_ref","url","email","monetary","time","time_range","date_range","address","phone","autocomplete","formula"],"default":"text","type":"string"},"refTargetEntity":{"maxLength":100,"description":"Nur für type=entity_ref: entityType des Referenzziels (z.B. „customer\", „deal\").","type":["string","null"]},"options":{"type":["array","null"],"items":{"type":"string"}},"formula":{"maxLength":2000,"description":"Nur für type=formula (Doc 26 4.2): ExpressionLanguage-Ausdruck, read-time ausgewertet.","type":["string","null"]},"materialized":{"description":"Nur für type=formula (Doc 26 4.2 v2, E7): Ergebnis zusätzlich als Sortier-/Filter-Index\nmaterialisieren — macht das Feld in Listen sortier- und filterbar (`order[cf.<key>]`, `cfMin`/`cfMax`/`cfEq`).","default":false,"type":"boolean"},"requirementRules":{"description":"Pflicht-/Wichtig-Regeln je Kontext (Doc 26 4.3): `{\"<context>\": \"required\"|\"important\"}`.","type":["object","null"],"additionalProperties":{"type":"string"}},"required":{"default":false,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"},"active":{"default":true,"type":"boolean"}}},"CustomFieldDefinitionResource.jsonld-custom_field_definition.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"entityType":{"maxLength":100,"default":"","type":"string"},"brandScope":{"description":"Marken-Scope: null = global, sonst brandId der zuständigen Marke.","type":["integer","null"]},"key":{"maxLength":100,"default":"","type":"string"},"label":{"maxLength":255,"type":["string","null"]},"type":{"maxLength":20,"enum":["text","number","decimal","date","bool","select","multiselect","entity_ref","url","email","monetary","time","time_range","date_range","address","phone","autocomplete","formula"],"default":"text","type":"string"},"refTargetEntity":{"maxLength":100,"description":"Nur für type=entity_ref: entityType des Referenzziels (z.B. „customer\", „deal\").","type":["string","null"]},"options":{"type":["array","null"],"items":{"type":"string"}},"formula":{"maxLength":2000,"description":"Nur für type=formula (Doc 26 4.2): ExpressionLanguage-Ausdruck, read-time ausgewertet.","type":["string","null"]},"materialized":{"description":"Nur für type=formula (Doc 26 4.2 v2, E7): Ergebnis zusätzlich als Sortier-/Filter-Index\nmaterialisieren — macht das Feld in Listen sortier- und filterbar (`order[cf.<key>]`, `cfMin`/`cfMax`/`cfEq`).","default":false,"type":"boolean"},"requirementRules":{"description":"Pflicht-/Wichtig-Regeln je Kontext (Doc 26 4.3): `{\"<context>\": \"required\"|\"important\"}`.","type":["object","null"],"additionalProperties":{"type":"string"}},"required":{"default":false,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"},"active":{"default":true,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["entityType","key","type"]}]},"CustomFieldMeta-custom_field_meta.read":{"type":"object","description":"Read-only Meta-Katalog: gültige `entityType`-Ziele (Core + AKTIVE Plugins, aggregiert vom\n{@see \\App\\Platform\\CustomField\\Security\\CustomFieldTargetAccessResolver}) + zulässige Feld-`type`s\n({@see \\App\\Platform\\CustomField\\Entity\\CustomFieldDefinition::allowedTypes()}) für neue Definitionen.\n\nBackend-getrieben (keine Drift zwischen Frontend-Dropdown und serverseitiger Assert\\Choice/\nisKnownEntityType-Validierung); exponiert den Wertebereich auch für API-/MCP-Clients.","properties":{"id":{"description":"Singleton-Pseudo-Identifier (es gibt genau eine Meta-Zeile).","default":"default","type":"string"},"entityTypes":{"description":"Alle freigegebenen entityType-Maschinen-Schlüssel (Core + aktive Plugins), aufsteigend sortiert.","type":"array","items":{"type":"string"}},"fieldTypes":{"description":"Alle zulässigen Feld-Typen (CustomFieldDefinition::allowedTypes()).","type":"array","items":{"type":"string"}}}},"CustomFieldMeta.jsonld-custom_field_meta.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Singleton-Pseudo-Identifier (es gibt genau eine Meta-Zeile).","default":"default","type":"string"},"entityTypes":{"description":"Alle freigegebenen entityType-Maschinen-Schlüssel (Core + aktive Plugins), aufsteigend sortiert.","type":"array","items":{"type":"string"}},"fieldTypes":{"description":"Alle zulässigen Feld-Typen (CustomFieldDefinition::allowedTypes()).","type":"array","items":{"type":"string"}}}}],"description":"Read-only Meta-Katalog: gültige `entityType`-Ziele (Core + AKTIVE Plugins, aggregiert vom\n{@see \\App\\Platform\\CustomField\\Security\\CustomFieldTargetAccessResolver}) + zulässige Feld-`type`s\n({@see \\App\\Platform\\CustomField\\Entity\\CustomFieldDefinition::allowedTypes()}) für neue Definitionen.\n\nBackend-getrieben (keine Drift zwischen Frontend-Dropdown und serverseitiger Assert\\Choice/\nisKnownEntityType-Validierung); exponiert den Wertebereich auch für API-/MCP-Clients."},"CustomFieldValue-custom_field_value.read":{"type":"object","description":"Polymorpher Custom-Field-Wert (Modul 0). DTO über {@see \\App\\Platform\\CustomField\\Entity\\CustomFieldValue},\nverknüpft mit {@see \\App\\Platform\\CustomField\\Entity\\CustomFieldDefinition}. Identifier: `entityType`\n+ `entityId` (numerische PK des Zielobjekts) + `definitionId`.\n\n- GetCollection: alle aktiven Definitionen des Entity-Typs inkl. Wert (auch ohne gesetzten Wert),\n  fürs vollständige Formular.\n- Post: Upsert eines einzelnen Werts.\n\nKein Item-IRI (kombinierter fachlicher Schlüssel) — daher nur Collection + Post, kein Get/Patch/Delete\npro Item (vermeidet Composite-IRI-Probleme).\n\nIDOR-Schutz (strukturierte PII): `security` prüft nur Authentifizierung; die objektbezogene Prüfung\n(Recht + Marken-Scope des Zielmoduls) macht der State-Layer über den\n{@see \\App\\Platform\\CustomField\\Security\\CustomFieldTargetAccessResolver} — nur wer das Zielobjekt\nselbst lesen/bearbeiten darf. Schreibaktionen werden über die ULID der\n{@see \\App\\Platform\\CustomField\\Entity\\CustomFieldValue} vom AuditSubscriber auditiert.","properties":{"id":{"description":"Kombinierter, deterministischer Pseudo-Identifier (entityType:entityId:definitionId) für JSON-LD.","type":["string","null"]},"entityType":{"maxLength":100,"default":"","type":"string"},"entityId":{"type":["integer","null"]},"definitionId":{"type":["integer","null"]},"definitionUlid":{"description":"ULID der Definition (read-only Komfortfeld).","type":["string","null"]},"key":{"description":"Maschinen-Schlüssel der Definition (CustomFieldDefinition.name).","type":["string","null"]},"label":{"type":["string","null"]},"type":{"description":"Feldtyp (text|number|decimal|date|bool|select|multiselect|entity_ref|url|email).","type":["string","null"]},"options":{"type":["array","null"],"items":{"type":"string"}},"required":{"default":false,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"},"value":{"description":"Tatsächlicher Wert (Typ richtet sich nach `type`: string|int|float|bool|array|null).","type":["string","null"]}},"required":["entityType","entityId","definitionId"]},"CustomFieldValue-custom_field_value.write":{"type":"object","description":"Polymorpher Custom-Field-Wert (Modul 0). DTO über {@see \\App\\Platform\\CustomField\\Entity\\CustomFieldValue},\nverknüpft mit {@see \\App\\Platform\\CustomField\\Entity\\CustomFieldDefinition}. Identifier: `entityType`\n+ `entityId` (numerische PK des Zielobjekts) + `definitionId`.\n\n- GetCollection: alle aktiven Definitionen des Entity-Typs inkl. Wert (auch ohne gesetzten Wert),\n  fürs vollständige Formular.\n- Post: Upsert eines einzelnen Werts.\n\nKein Item-IRI (kombinierter fachlicher Schlüssel) — daher nur Collection + Post, kein Get/Patch/Delete\npro Item (vermeidet Composite-IRI-Probleme).\n\nIDOR-Schutz (strukturierte PII): `security` prüft nur Authentifizierung; die objektbezogene Prüfung\n(Recht + Marken-Scope des Zielmoduls) macht der State-Layer über den\n{@see \\App\\Platform\\CustomField\\Security\\CustomFieldTargetAccessResolver} — nur wer das Zielobjekt\nselbst lesen/bearbeiten darf. Schreibaktionen werden über die ULID der\n{@see \\App\\Platform\\CustomField\\Entity\\CustomFieldValue} vom AuditSubscriber auditiert.","required":["entityType","entityId","definitionId"],"properties":{"entityType":{"maxLength":100,"default":"","type":"string"},"entityId":{"type":["integer","null"]},"definitionId":{"type":["integer","null"]},"value":{"description":"Tatsächlicher Wert (Typ richtet sich nach `type`: string|int|float|bool|array|null).","type":["string","null"]}}},"CustomFieldValue.jsonld-custom_field_value.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Kombinierter, deterministischer Pseudo-Identifier (entityType:entityId:definitionId) für JSON-LD.","type":["string","null"]},"entityType":{"maxLength":100,"default":"","type":"string"},"entityId":{"type":["integer","null"]},"definitionId":{"type":["integer","null"]},"definitionUlid":{"description":"ULID der Definition (read-only Komfortfeld).","type":["string","null"]},"key":{"description":"Maschinen-Schlüssel der Definition (CustomFieldDefinition.name).","type":["string","null"]},"label":{"type":["string","null"]},"type":{"description":"Feldtyp (text|number|decimal|date|bool|select|multiselect|entity_ref|url|email).","type":["string","null"]},"options":{"type":["array","null"],"items":{"type":"string"}},"required":{"default":false,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"},"value":{"description":"Tatsächlicher Wert (Typ richtet sich nach `type`: string|int|float|bool|array|null).","type":["string","null"]}},"required":["entityType","entityId","definitionId"]}],"description":"Polymorpher Custom-Field-Wert (Modul 0). DTO über {@see \\App\\Platform\\CustomField\\Entity\\CustomFieldValue},\nverknüpft mit {@see \\App\\Platform\\CustomField\\Entity\\CustomFieldDefinition}. Identifier: `entityType`\n+ `entityId` (numerische PK des Zielobjekts) + `definitionId`.\n\n- GetCollection: alle aktiven Definitionen des Entity-Typs inkl. Wert (auch ohne gesetzten Wert),\n  fürs vollständige Formular.\n- Post: Upsert eines einzelnen Werts.\n\nKein Item-IRI (kombinierter fachlicher Schlüssel) — daher nur Collection + Post, kein Get/Patch/Delete\npro Item (vermeidet Composite-IRI-Probleme).\n\nIDOR-Schutz (strukturierte PII): `security` prüft nur Authentifizierung; die objektbezogene Prüfung\n(Recht + Marken-Scope des Zielmoduls) macht der State-Layer über den\n{@see \\App\\Platform\\CustomField\\Security\\CustomFieldTargetAccessResolver} — nur wer das Zielobjekt\nselbst lesen/bearbeiten darf. Schreibaktionen werden über die ULID der\n{@see \\App\\Platform\\CustomField\\Entity\\CustomFieldValue} vom AuditSubscriber auditiert."},"Customer-customer.delivery_block":{"type":"object","properties":{"reason":{"maxLength":255,"description":"Nur `POST …/delivery-block`: Grund der Sperre (Pflicht, solange nicht `release`).","type":["string","null"]},"release":{"description":"Nur `POST …/delivery-block`: true hebt die Sperre auf.","type":["boolean","null"]}}},"Customer-customer.merge":{"type":"object","required":["mergeLoserUlid"],"properties":{"mergeLoserUlid":{"description":"Verschmelzung (Doc 19 1b, ENT-CRM-DEDUP-01): ULID des Verlierer-Kunden — nur für `merge`.","type":["string","null"]}}},"Customer-customer.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK zusätzlich zur ULID — für Relations-Filter (customerId) und EntityPicker.","type":["integer","null"]},"type":{"enum":["business","individual"],"default":"business","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"customerNumber":{"maxLength":50,"type":["string","null"]},"vatId":{"maxLength":100,"type":["string","null"]},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"phone":{"maxLength":50,"type":["string","null"]},"website":{"maxLength":255,"type":["string","null"]},"industry":{"maxLength":100,"type":["string","null"]},"defaultLocale":{"description":"Standard-Kommunikationssprache des Kunden; Fallback für Kontakte ohne eigene Sprache.","type":["string","null"]},"statusId":{"maxLength":20,"description":"Kundenstatus/Beziehungstyp aus dem settings-pflegbaren Katalog ({@see CustomerStatusResource})\n— z.B. prospect, active, support, maintenance. Schlüssel = CustomerStatus.key.","type":["string","null"]},"brandId":{"description":"Marke des Kunden (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — das ist der\nBestand vor der Umstellung und die weiteste Reichweite überhaupt, weshalb sie zu setzen ein\nmarkenübergreifendes Verwaltungsrecht verlangt. Der Schnitt ist WEICH: Listen und Auswahl\nzeigen die eigene Marke, ein bestehender Beleg auf eine fremde bleibt lesbar.","type":["integer","null"]},"deliveryBlockedAt":{"description":"Liefersperre gesetzt? (Doc 25 AP 3.1 — gesetzt/gelöst über `POST …/delivery-block`.)","type":["string","null"]},"deliveryBlockReason":{"type":["string","null"]},"parentCustomerUlid":{"maxLength":26,"description":"Firmenhierarchie (S1-3): ULID des übergeordneten Kunden; null löst Zuordnung.","type":["string","null"]},"parentCustomerName":{"type":["string","null"]},"children":{"description":"Direkt untergeordnete Kunden (Töchter) — nur im Einzelabruf (Item-GET) befüllt.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"billingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"notes":{"type":["string","null"]},"paymentTermUlid":{"description":"Vorbelegung der Zahlungsbedingung für Belege dieses Kunden (`/v1/payment-terms`,\nDoc 25 AP 0.1). Leer = globale Vorgabe.","type":["string","null"]},"eInvoiceFormat":{"enum":["xrechnung","zugferd"],"description":"Bevorzugtes E-Rechnungs-Format: `xrechnung` (B2G) oder `zugferd` (B2B). Leer = XRechnung.","type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"emailDomains":{"description":"Identifikationsmerkmale für Mail-Eingangs-Matching (ENT-CRM-MAIL-02) — mehrere E-Mails/Domains\nje Kunde. Schreiben: Liste aus {type, value} (type ∈ email|domain); null = unverändert.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["type","name"]},"Customer-customer.write":{"type":"object","required":["type","name"],"properties":{"type":{"enum":["business","individual"],"default":"business","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"customerNumber":{"maxLength":50,"type":["string","null"]},"vatId":{"maxLength":100,"type":["string","null"]},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"phone":{"maxLength":50,"type":["string","null"]},"website":{"maxLength":255,"type":["string","null"]},"industry":{"maxLength":100,"type":["string","null"]},"defaultLocale":{"description":"Standard-Kommunikationssprache des Kunden; Fallback für Kontakte ohne eigene Sprache.","type":["string","null"]},"statusId":{"maxLength":20,"description":"Kundenstatus/Beziehungstyp aus dem settings-pflegbaren Katalog ({@see CustomerStatusResource})\n— z.B. prospect, active, support, maintenance. Schlüssel = CustomerStatus.key.","type":["string","null"]},"brandId":{"description":"Marke des Kunden (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — das ist der\nBestand vor der Umstellung und die weiteste Reichweite überhaupt, weshalb sie zu setzen ein\nmarkenübergreifendes Verwaltungsrecht verlangt. Der Schnitt ist WEICH: Listen und Auswahl\nzeigen die eigene Marke, ein bestehender Beleg auf eine fremde bleibt lesbar.","type":["integer","null"]},"parentCustomerUlid":{"maxLength":26,"description":"Firmenhierarchie (S1-3): ULID des übergeordneten Kunden; null löst Zuordnung.","type":["string","null"]},"billingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"notes":{"type":["string","null"]},"paymentTermUlid":{"description":"Vorbelegung der Zahlungsbedingung für Belege dieses Kunden (`/v1/payment-terms`,\nDoc 25 AP 0.1). Leer = globale Vorgabe.","type":["string","null"]},"eInvoiceFormat":{"enum":["xrechnung","zugferd"],"description":"Bevorzugtes E-Rechnungs-Format: `xrechnung` (B2G) oder `zugferd` (B2B). Leer = XRechnung.","type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"emailDomains":{"description":"Identifikationsmerkmale für Mail-Eingangs-Matching (ENT-CRM-MAIL-02) — mehrere E-Mails/Domains\nje Kunde. Schreiben: Liste aus {type, value} (type ∈ email|domain); null = unverändert.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"Customer-customer.write.jsonMergePatch":{"type":"object","properties":{"type":{"enum":["business","individual"],"default":"business","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"customerNumber":{"maxLength":50,"type":["string","null"]},"vatId":{"maxLength":100,"type":["string","null"]},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"phone":{"maxLength":50,"type":["string","null"]},"website":{"maxLength":255,"type":["string","null"]},"industry":{"maxLength":100,"type":["string","null"]},"defaultLocale":{"description":"Standard-Kommunikationssprache des Kunden; Fallback für Kontakte ohne eigene Sprache.","type":["string","null"]},"statusId":{"maxLength":20,"description":"Kundenstatus/Beziehungstyp aus dem settings-pflegbaren Katalog ({@see CustomerStatusResource})\n— z.B. prospect, active, support, maintenance. Schlüssel = CustomerStatus.key.","type":["string","null"]},"brandId":{"description":"Marke des Kunden (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — das ist der\nBestand vor der Umstellung und die weiteste Reichweite überhaupt, weshalb sie zu setzen ein\nmarkenübergreifendes Verwaltungsrecht verlangt. Der Schnitt ist WEICH: Listen und Auswahl\nzeigen die eigene Marke, ein bestehender Beleg auf eine fremde bleibt lesbar.","type":["integer","null"]},"parentCustomerUlid":{"maxLength":26,"description":"Firmenhierarchie (S1-3): ULID des übergeordneten Kunden; null löst Zuordnung.","type":["string","null"]},"billingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"notes":{"type":["string","null"]},"paymentTermUlid":{"description":"Vorbelegung der Zahlungsbedingung für Belege dieses Kunden (`/v1/payment-terms`,\nDoc 25 AP 0.1). Leer = globale Vorgabe.","type":["string","null"]},"eInvoiceFormat":{"enum":["xrechnung","zugferd"],"description":"Bevorzugtes E-Rechnungs-Format: `xrechnung` (B2G) oder `zugferd` (B2B). Leer = XRechnung.","type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"emailDomains":{"description":"Identifikationsmerkmale für Mail-Eingangs-Matching (ENT-CRM-MAIL-02) — mehrere E-Mails/Domains\nje Kunde. Schreiben: Liste aus {type, value} (type ∈ email|domain); null = unverändert.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"Customer.jsonld-customer.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK zusätzlich zur ULID — für Relations-Filter (customerId) und EntityPicker.","type":["integer","null"]},"type":{"enum":["business","individual"],"default":"business","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"customerNumber":{"maxLength":50,"type":["string","null"]},"vatId":{"maxLength":100,"type":["string","null"]},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"phone":{"maxLength":50,"type":["string","null"]},"website":{"maxLength":255,"type":["string","null"]},"industry":{"maxLength":100,"type":["string","null"]},"defaultLocale":{"description":"Standard-Kommunikationssprache des Kunden; Fallback für Kontakte ohne eigene Sprache.","type":["string","null"]},"statusId":{"maxLength":20,"description":"Kundenstatus/Beziehungstyp aus dem settings-pflegbaren Katalog ({@see CustomerStatusResource})\n— z.B. prospect, active, support, maintenance. Schlüssel = CustomerStatus.key.","type":["string","null"]},"brandId":{"description":"Marke des Kunden (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — das ist der\nBestand vor der Umstellung und die weiteste Reichweite überhaupt, weshalb sie zu setzen ein\nmarkenübergreifendes Verwaltungsrecht verlangt. Der Schnitt ist WEICH: Listen und Auswahl\nzeigen die eigene Marke, ein bestehender Beleg auf eine fremde bleibt lesbar.","type":["integer","null"]},"deliveryBlockedAt":{"description":"Liefersperre gesetzt? (Doc 25 AP 3.1 — gesetzt/gelöst über `POST …/delivery-block`.)","type":["string","null"]},"deliveryBlockReason":{"type":["string","null"]},"parentCustomerUlid":{"maxLength":26,"description":"Firmenhierarchie (S1-3): ULID des übergeordneten Kunden; null löst Zuordnung.","type":["string","null"]},"parentCustomerName":{"type":["string","null"]},"children":{"description":"Direkt untergeordnete Kunden (Töchter) — nur im Einzelabruf (Item-GET) befüllt.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"billingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"notes":{"type":["string","null"]},"paymentTermUlid":{"description":"Vorbelegung der Zahlungsbedingung für Belege dieses Kunden (`/v1/payment-terms`,\nDoc 25 AP 0.1). Leer = globale Vorgabe.","type":["string","null"]},"eInvoiceFormat":{"enum":["xrechnung","zugferd"],"description":"Bevorzugtes E-Rechnungs-Format: `xrechnung` (B2G) oder `zugferd` (B2B). Leer = XRechnung.","type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"emailDomains":{"description":"Identifikationsmerkmale für Mail-Eingangs-Matching (ENT-CRM-MAIL-02) — mehrere E-Mails/Domains\nje Kunde. Schreiben: Liste aus {type, value} (type ∈ email|domain); null = unverändert.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["type","name"]}]},"CustomerActivity-customer_activity.read":{"type":"object","description":"Kunden-360-Kommunikationssicht (10-kommunikation-integration, AP-4.2) — read-only Zeitachse der\nLÜCKENLOSEN Historie, drei Quellen zusammengeführt:\n - Vorgänge: {@see \\App\\WorkItem\\Entity\\WorkItemMessage} mit customerId = Kunde (B1)\n - CRM-Threads: {@see \\App\\Platform\\Communication\\Entity\\CommunicationMessage} vorgangs-loser\n   Stamm-/CRM-Objekte (Kunde, Kontakte, Deals, Projekte)\n - Plugin-Berührungspunkte: {@see \\App\\Platform\\Customer\\Contract\\CustomerTouchpointProviderInterface}\n   (protokollierte Anrufe, Termine, Notizen aus Plugin-Tabellen).\n\nJede Zeile trägt neben dem Roh-Typ die normalisierte Berührungsart `touchpointType`\n({@see \\App\\Platform\\Customer\\Service\\CustomerTouchpointType}) — EIN Vokabular über alle drei\nQuellen; `?types=` schneidet darauf.\n\nMarken-Scope: NICHT über den Kunden (markenlose Stammdaten) — Provider filtert über die\nNachrichtenzeilen auf zugängliche Marken (IDOR-Schutz bei geteiltem Kunden).\n\n`?customerUlid=…` Pflicht (analog {@see \\Octi\\Plugin\\Projects\\ApiResource\\ProjectActivityResource})\n— erzwingt objektbezogenen Scope, kein markenübergreifender Voll-Scan.","properties":{"id":{"description":"Eintrags-ULID (Message-ULID der Quelle); Identifier des Aggregations-Eintrags.","default":"","type":"string"},"source":{"description":"'workitem' | 'crm' — woher der Eintrag stammt (steuert das Sprungziel).","default":"workitem","type":"string"},"sourceType":{"description":"Feinerer Typ der Quelle:\n - source=workitem → 'task' | 'ticket' (WorkItem-kind),\n - source=crm      → 'customer' | 'contact' | 'deal' | 'project' (CommunicationMessage-subjectType).","type":["string","null"]},"sourceUlid":{"description":"Öffentliche ULID des Quell-Objekts (Sprungziel in der UI; null wenn nicht navigierbar).","type":["string","null"]},"sourceRef":{"description":"Kurzreferenz des Quell-Objekts (z.B. Vorgangs-Ref „TCK-12\"); null wenn keine.","type":["string","null"]},"sourceLabel":{"description":"Anzeigetitel des Quell-Objekts (Vorgangstitel, Deal-Titel, Kontakt-/Projektname …).","type":["string","null"]},"type":{"description":"comment | note | email | call | meeting | system | … (kanal-/typabhängig, Roh-Typ der Quelle).","default":"comment","type":"string"},"touchpointType":{"description":"Normalisierte BERÜHRUNGSART über alle Quellen hinweg: email | call | meeting | note | chat |\ncomment | task | system. Medium schlägt Typ (Chat-/WhatsApp-/SMS-Kanal ⇒ `chat`).","default":"comment","type":"string"},"channel":{"description":"Medium des Beitrags, wenn kanalgeführt (`email`/`chat`/`whatsapp`/`sms`/…); null = kein Kanal.","type":["string","null"]},"direction":{"description":"in | out | internal | null.","type":["string","null"]},"internal":{"default":true,"type":"boolean"},"subject":{"type":["string","null"]},"body":{"type":["string","null"]},"authorId":{"description":"Autor: Mitarbeiter (Employee.id) bzw. User-ID, je nach Quelle.","type":["integer","null"]},"occurredAt":{"type":["string","null"]}}},"CustomerActivity.jsonld-customer_activity.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Eintrags-ULID (Message-ULID der Quelle); Identifier des Aggregations-Eintrags.","default":"","type":"string"},"source":{"description":"'workitem' | 'crm' — woher der Eintrag stammt (steuert das Sprungziel).","default":"workitem","type":"string"},"sourceType":{"description":"Feinerer Typ der Quelle:\n - source=workitem → 'task' | 'ticket' (WorkItem-kind),\n - source=crm      → 'customer' | 'contact' | 'deal' | 'project' (CommunicationMessage-subjectType).","type":["string","null"]},"sourceUlid":{"description":"Öffentliche ULID des Quell-Objekts (Sprungziel in der UI; null wenn nicht navigierbar).","type":["string","null"]},"sourceRef":{"description":"Kurzreferenz des Quell-Objekts (z.B. Vorgangs-Ref „TCK-12\"); null wenn keine.","type":["string","null"]},"sourceLabel":{"description":"Anzeigetitel des Quell-Objekts (Vorgangstitel, Deal-Titel, Kontakt-/Projektname …).","type":["string","null"]},"type":{"description":"comment | note | email | call | meeting | system | … (kanal-/typabhängig, Roh-Typ der Quelle).","default":"comment","type":"string"},"touchpointType":{"description":"Normalisierte BERÜHRUNGSART über alle Quellen hinweg: email | call | meeting | note | chat |\ncomment | task | system. Medium schlägt Typ (Chat-/WhatsApp-/SMS-Kanal ⇒ `chat`).","default":"comment","type":"string"},"channel":{"description":"Medium des Beitrags, wenn kanalgeführt (`email`/`chat`/`whatsapp`/`sms`/…); null = kein Kanal.","type":["string","null"]},"direction":{"description":"in | out | internal | null.","type":["string","null"]},"internal":{"default":true,"type":"boolean"},"subject":{"type":["string","null"]},"body":{"type":["string","null"]},"authorId":{"description":"Autor: Mitarbeiter (Employee.id) bzw. User-ID, je nach Quelle.","type":["integer","null"]},"occurredAt":{"type":["string","null"]}}}],"description":"Kunden-360-Kommunikationssicht (10-kommunikation-integration, AP-4.2) — read-only Zeitachse der\nLÜCKENLOSEN Historie, drei Quellen zusammengeführt:\n - Vorgänge: {@see \\App\\WorkItem\\Entity\\WorkItemMessage} mit customerId = Kunde (B1)\n - CRM-Threads: {@see \\App\\Platform\\Communication\\Entity\\CommunicationMessage} vorgangs-loser\n   Stamm-/CRM-Objekte (Kunde, Kontakte, Deals, Projekte)\n - Plugin-Berührungspunkte: {@see \\App\\Platform\\Customer\\Contract\\CustomerTouchpointProviderInterface}\n   (protokollierte Anrufe, Termine, Notizen aus Plugin-Tabellen).\n\nJede Zeile trägt neben dem Roh-Typ die normalisierte Berührungsart `touchpointType`\n({@see \\App\\Platform\\Customer\\Service\\CustomerTouchpointType}) — EIN Vokabular über alle drei\nQuellen; `?types=` schneidet darauf.\n\nMarken-Scope: NICHT über den Kunden (markenlose Stammdaten) — Provider filtert über die\nNachrichtenzeilen auf zugängliche Marken (IDOR-Schutz bei geteiltem Kunden).\n\n`?customerUlid=…` Pflicht (analog {@see \\Octi\\Plugin\\Projects\\ApiResource\\ProjectActivityResource})\n— erzwingt objektbezogenen Scope, kein markenübergreifender Voll-Scan."},"CustomerDuplicateGroup-customer_duplicate.read":{"type":"object","description":"Vorschlagsliste erkannter Kunden-Dubletten (Doc 26 3.2): jede Zeile ist ein Cluster\nverdächtig gleicher Kunden mit den auslösenden Gründen (`vat` · `email` · `name_domain`).\nLesen erfordert `customer.read`; das eigentliche Zusammenführen läuft über\n`POST /v1/customers/{ulid}/merge` (`customer.merge`).","properties":{"key":{"default":"","type":"string"},"reasons":{"description":"Auslösende Regeln (`vat` · `email` · `name_domain`).","type":"array","items":{"type":"string"}},"members":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"CustomerDuplicateGroup.jsonld-customer_duplicate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"default":"","type":"string"},"reasons":{"description":"Auslösende Regeln (`vat` · `email` · `name_domain`).","type":"array","items":{"type":"string"}},"members":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Vorschlagsliste erkannter Kunden-Dubletten (Doc 26 3.2): jede Zeile ist ein Cluster\nverdächtig gleicher Kunden mit den auslösenden Gründen (`vat` · `email` · `name_domain`).\nLesen erfordert `customer.read`; das eigentliche Zusammenführen läuft über\n`POST /v1/customers/{ulid}/merge` (`customer.merge`)."},"CustomerGroup-customer_group.read":{"type":"object","description":"CRUD Kundengruppe (04-26 §8); Mitglieder/Preisregeln/Sichtbarkeiten als Sub-Resources\nunter /v1/customer-groups/{ulid}/…. DELETE = Soft-Delete (wirkt nicht mehr in\nPreisauflösung, Mitglieder/Regeln bleiben erhalten).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"name":{"maxLength":100,"type":["string","null"]},"key":{"maxLength":50,"description":"Stabiler technischer Schlüssel (eindeutig) — Pflicht bei Anlage.","type":["string","null"]},"active":{"type":["boolean","null"]},"defaultDiscountPct":{"description":"Pauschalrabatt in Prozent (decimal-String, z. B. \"10.50\") — Fallback ohne Preisregel.","type":["string","null"]},"priceListId":{"minimum":0,"exclusiveMinimum":0,"description":"RESERVIERT (Audit R18 #70): Gruppen-Preisliste, noch ohne Wirkung in der Preisauflösung.","type":["integer","null"]},"taxDisplay":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung: net (B2B, Netto+USt) | gross (B2C, Brutto) | tax_free (Ausland, ohne USt).","type":["string","null"]},"autoAssignRule":{"description":"Regel der automatischen Zuordnung (04-26 KG5) — seit `R44-17` WIRKSAM.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"autoMembersRemoved":{"readOnly":true,"description":"Nur in der Antwort auf das Entfernen der Regel: wie viele automatisch zugeordnete\nMitglieder mit ihr gegangen sind. Sonst `null`. Nicht schreibbar.","type":["integer","null"]}}},"CustomerGroup-customer_group.write":{"type":"object","description":"CRUD Kundengruppe (04-26 §8); Mitglieder/Preisregeln/Sichtbarkeiten als Sub-Resources\nunter /v1/customer-groups/{ulid}/…. DELETE = Soft-Delete (wirkt nicht mehr in\nPreisauflösung, Mitglieder/Regeln bleiben erhalten).","properties":{"name":{"maxLength":100,"type":["string","null"]},"key":{"maxLength":50,"description":"Stabiler technischer Schlüssel (eindeutig) — Pflicht bei Anlage.","type":["string","null"]},"active":{"type":["boolean","null"]},"defaultDiscountPct":{"description":"Pauschalrabatt in Prozent (decimal-String, z. B. \"10.50\") — Fallback ohne Preisregel.","type":["string","null"]},"priceListId":{"minimum":0,"exclusiveMinimum":0,"description":"RESERVIERT (Audit R18 #70): Gruppen-Preisliste, noch ohne Wirkung in der Preisauflösung.","type":["integer","null"]},"taxDisplay":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung: net (B2B, Netto+USt) | gross (B2C, Brutto) | tax_free (Ausland, ohne USt).","type":["string","null"]},"autoAssignRule":{"description":"Regel der automatischen Zuordnung (04-26 KG5) — seit `R44-17` WIRKSAM.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"CustomerGroup-customer_group.write.jsonMergePatch":{"type":"object","description":"CRUD Kundengruppe (04-26 §8); Mitglieder/Preisregeln/Sichtbarkeiten als Sub-Resources\nunter /v1/customer-groups/{ulid}/…. DELETE = Soft-Delete (wirkt nicht mehr in\nPreisauflösung, Mitglieder/Regeln bleiben erhalten).","properties":{"name":{"maxLength":100,"type":["string","null"]},"key":{"maxLength":50,"description":"Stabiler technischer Schlüssel (eindeutig) — Pflicht bei Anlage.","type":["string","null"]},"active":{"type":["boolean","null"]},"defaultDiscountPct":{"description":"Pauschalrabatt in Prozent (decimal-String, z. B. \"10.50\") — Fallback ohne Preisregel.","type":["string","null"]},"priceListId":{"minimum":0,"exclusiveMinimum":0,"description":"RESERVIERT (Audit R18 #70): Gruppen-Preisliste, noch ohne Wirkung in der Preisauflösung.","type":["integer","null"]},"taxDisplay":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung: net (B2B, Netto+USt) | gross (B2C, Brutto) | tax_free (Ausland, ohne USt).","type":["string","null"]},"autoAssignRule":{"description":"Regel der automatischen Zuordnung (04-26 KG5) — seit `R44-17` WIRKSAM.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"CustomerGroup.RulePreviewResource-customer_group.read":{"type":"object","description":"CRUD Kundengruppe (04-26 §8); Mitglieder/Preisregeln/Sichtbarkeiten als Sub-Resources\nunter /v1/customer-groups/{ulid}/…. DELETE = Soft-Delete (wirkt nicht mehr in\nPreisauflösung, Mitglieder/Regeln bleiben erhalten).","properties":{"matchCount":{"description":"Wie viele Kunden die Regel treffen wuerde (bis zur Obergrenze der Vorschau).","default":0,"type":"integer"},"truncated":{"description":"True, wenn die Obergrenze erreicht wurde — es sind dann MEHR als `matchCount`.","default":false,"type":"boolean"},"sample":{"description":"Stichprobe der Treffer (Name + Kundennummer), hoechstens 20 — genug zum Erkennen,\nwenig genug fuer eine Antwort.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"CustomerGroup.RulePreviewResource.jsonld-customer_group.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"matchCount":{"description":"Wie viele Kunden die Regel treffen wuerde (bis zur Obergrenze der Vorschau).","default":0,"type":"integer"},"truncated":{"description":"True, wenn die Obergrenze erreicht wurde — es sind dann MEHR als `matchCount`.","default":false,"type":"boolean"},"sample":{"description":"Stichprobe der Treffer (Name + Kundennummer), hoechstens 20 — genug zum Erkennen,\nwenig genug fuer eine Antwort.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"CRUD Kundengruppe (04-26 §8); Mitglieder/Preisregeln/Sichtbarkeiten als Sub-Resources\nunter /v1/customer-groups/{ulid}/…. DELETE = Soft-Delete (wirkt nicht mehr in\nPreisauflösung, Mitglieder/Regeln bleiben erhalten)."},"CustomerGroup.jsonld-customer_group.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"name":{"maxLength":100,"type":["string","null"]},"key":{"maxLength":50,"description":"Stabiler technischer Schlüssel (eindeutig) — Pflicht bei Anlage.","type":["string","null"]},"active":{"type":["boolean","null"]},"defaultDiscountPct":{"description":"Pauschalrabatt in Prozent (decimal-String, z. B. \"10.50\") — Fallback ohne Preisregel.","type":["string","null"]},"priceListId":{"minimum":0,"exclusiveMinimum":0,"description":"RESERVIERT (Audit R18 #70): Gruppen-Preisliste, noch ohne Wirkung in der Preisauflösung.","type":["integer","null"]},"taxDisplay":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung: net (B2B, Netto+USt) | gross (B2C, Brutto) | tax_free (Ausland, ohne USt).","type":["string","null"]},"autoAssignRule":{"description":"Regel der automatischen Zuordnung (04-26 KG5) — seit `R44-17` WIRKSAM.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"autoMembersRemoved":{"readOnly":true,"description":"Nur in der Antwort auf das Entfernen der Regel: wie viele automatisch zugeordnete\nMitglieder mit ihr gegangen sind. Sonst `null`. Nicht schreibbar.","type":["integer","null"]}}}],"description":"CRUD Kundengruppe (04-26 §8); Mitglieder/Preisregeln/Sichtbarkeiten als Sub-Resources\nunter /v1/customer-groups/{ulid}/…. DELETE = Soft-Delete (wirkt nicht mehr in\nPreisauflösung, Mitglieder/Regeln bleiben erhalten)."},"CustomerGroupMember-customer_group_member.read":{"type":"object","description":"Sub-Resource /v1/customer-groups/{ulid}/members (04-26 §4).\n- POST: Zuordnung per customerUlid, idempotent je (Gruppe, Kunde)\n- DELETE: entfernt Zuordnung hart (Muster SupplierArticle).","properties":{"ulid":{"type":["string","null"]},"groupUlid":{"description":"ULID der Gruppe (read-only, aus dem Pfad).","type":["string","null"]},"customerUlid":{"maxLength":26,"description":"Kunden-ULID — Pflicht beim POST.","type":["string","null"]},"customerId":{"description":"Interne Kunden-ID (read-only).","type":["integer","null"]},"since":{"description":"Mitglied seit (Y-m-d, optional).","type":["string","null"]},"assignedBy":{"description":"manual | auto (read-only — API-Zuordnung ist immer manual).","type":["string","null"]}}},"CustomerGroupMember-customer_group_member.write":{"type":"object","description":"Sub-Resource /v1/customer-groups/{ulid}/members (04-26 §4).\n- POST: Zuordnung per customerUlid, idempotent je (Gruppe, Kunde)\n- DELETE: entfernt Zuordnung hart (Muster SupplierArticle).","properties":{"customerUlid":{"maxLength":26,"description":"Kunden-ULID — Pflicht beim POST.","type":["string","null"]},"since":{"description":"Mitglied seit (Y-m-d, optional).","type":["string","null"]}}},"CustomerGroupMember.jsonld-customer_group_member.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"groupUlid":{"description":"ULID der Gruppe (read-only, aus dem Pfad).","type":["string","null"]},"customerUlid":{"maxLength":26,"description":"Kunden-ULID — Pflicht beim POST.","type":["string","null"]},"customerId":{"description":"Interne Kunden-ID (read-only).","type":["integer","null"]},"since":{"description":"Mitglied seit (Y-m-d, optional).","type":["string","null"]},"assignedBy":{"description":"manual | auto (read-only — API-Zuordnung ist immer manual).","type":["string","null"]}}}],"description":"Sub-Resource /v1/customer-groups/{ulid}/members (04-26 §4).\n- POST: Zuordnung per customerUlid, idempotent je (Gruppe, Kunde)\n- DELETE: entfernt Zuordnung hart (Muster SupplierArticle)."},"CustomerGroupPriceRule-customer_group_price_rule.read":{"type":"object","description":"Sub-Resource /v1/customer-groups/{ulid}/price-rules (04-26 §5/§6), CRUD light.\nvalue-Semantik: percent → Prozent×100 (1050 = 10,50 %), fixed → Stückpreis in Cent.","properties":{"ulid":{"type":["string","null"]},"groupUlid":{"description":"ULID der Gruppe (read-only, aus dem Pfad).","type":["string","null"]},"scope":{"enum":["global","category","product"],"description":"global | category | product (Default global).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (Produkt-/Kategorie-ID); Pflicht bei scope != global.","type":["integer","null"]},"rateType":{"enum":["percent","fixed"],"description":"percent | fixed — Pflicht bei Anlage.","type":["string","null"]},"value":{"minimum":0,"description":"percent: Prozent×100 (1050 = 10,50 %) · fixed: Stückpreis in Cent — Pflicht bei Anlage.","type":["integer","null"]},"basis":{"enum":["list","net"],"description":"Rabatt-Basis: list | net (v1 rechnet auf dem Listenpreis).","type":["string","null"]},"priority":{"description":"Auflösungs-Priorität innerhalb gleicher Spezifität — höher gewinnt.","type":["integer","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]}}},"CustomerGroupPriceRule-customer_group_price_rule.write":{"type":"object","description":"Sub-Resource /v1/customer-groups/{ulid}/price-rules (04-26 §5/§6), CRUD light.\nvalue-Semantik: percent → Prozent×100 (1050 = 10,50 %), fixed → Stückpreis in Cent.","properties":{"scope":{"enum":["global","category","product"],"description":"global | category | product (Default global).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (Produkt-/Kategorie-ID); Pflicht bei scope != global.","type":["integer","null"]},"rateType":{"enum":["percent","fixed"],"description":"percent | fixed — Pflicht bei Anlage.","type":["string","null"]},"value":{"minimum":0,"description":"percent: Prozent×100 (1050 = 10,50 %) · fixed: Stückpreis in Cent — Pflicht bei Anlage.","type":["integer","null"]},"basis":{"enum":["list","net"],"description":"Rabatt-Basis: list | net (v1 rechnet auf dem Listenpreis).","type":["string","null"]},"priority":{"description":"Auflösungs-Priorität innerhalb gleicher Spezifität — höher gewinnt.","type":["integer","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]}}},"CustomerGroupPriceRule-customer_group_price_rule.write.jsonMergePatch":{"type":"object","description":"Sub-Resource /v1/customer-groups/{ulid}/price-rules (04-26 §5/§6), CRUD light.\nvalue-Semantik: percent → Prozent×100 (1050 = 10,50 %), fixed → Stückpreis in Cent.","properties":{"scope":{"enum":["global","category","product"],"description":"global | category | product (Default global).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (Produkt-/Kategorie-ID); Pflicht bei scope != global.","type":["integer","null"]},"rateType":{"enum":["percent","fixed"],"description":"percent | fixed — Pflicht bei Anlage.","type":["string","null"]},"value":{"minimum":0,"description":"percent: Prozent×100 (1050 = 10,50 %) · fixed: Stückpreis in Cent — Pflicht bei Anlage.","type":["integer","null"]},"basis":{"enum":["list","net"],"description":"Rabatt-Basis: list | net (v1 rechnet auf dem Listenpreis).","type":["string","null"]},"priority":{"description":"Auflösungs-Priorität innerhalb gleicher Spezifität — höher gewinnt.","type":["integer","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]}}},"CustomerGroupPriceRule.jsonld-customer_group_price_rule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"groupUlid":{"description":"ULID der Gruppe (read-only, aus dem Pfad).","type":["string","null"]},"scope":{"enum":["global","category","product"],"description":"global | category | product (Default global).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (Produkt-/Kategorie-ID); Pflicht bei scope != global.","type":["integer","null"]},"rateType":{"enum":["percent","fixed"],"description":"percent | fixed — Pflicht bei Anlage.","type":["string","null"]},"value":{"minimum":0,"description":"percent: Prozent×100 (1050 = 10,50 %) · fixed: Stückpreis in Cent — Pflicht bei Anlage.","type":["integer","null"]},"basis":{"enum":["list","net"],"description":"Rabatt-Basis: list | net (v1 rechnet auf dem Listenpreis).","type":["string","null"]},"priority":{"description":"Auflösungs-Priorität innerhalb gleicher Spezifität — höher gewinnt.","type":["integer","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]}}}],"description":"Sub-Resource /v1/customer-groups/{ulid}/price-rules (04-26 §5/§6), CRUD light.\nvalue-Semantik: percent → Prozent×100 (1050 = 10,50 %), fixed → Stückpreis in Cent."},"CustomerGroupVisibility-customer_group_visibility.read":{"type":"object","description":"Sub-Resource /v1/customer-groups/{ulid}/visibility (04-26 §5/KG2).\n- POST: Upsert je (Gruppe, Scope, Referenz), setzt `visible` neu\n- DELETE: entfernt die Zeile.","properties":{"ulid":{"type":["string","null"]},"groupUlid":{"description":"ULID der Gruppe (read-only, aus dem Pfad).","type":["string","null"]},"scope":{"enum":["product","category"],"description":"product | category — Pflicht beim POST.","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (Produkt-/Kategorie-ID) — Pflicht beim POST.","type":["integer","null"]},"visible":{"description":"Sichtbar (true) oder ausgeblendet (false); Default true.","type":["boolean","null"]}}},"CustomerGroupVisibility-customer_group_visibility.write":{"type":"object","description":"Sub-Resource /v1/customer-groups/{ulid}/visibility (04-26 §5/KG2).\n- POST: Upsert je (Gruppe, Scope, Referenz), setzt `visible` neu\n- DELETE: entfernt die Zeile.","properties":{"scope":{"enum":["product","category"],"description":"product | category — Pflicht beim POST.","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (Produkt-/Kategorie-ID) — Pflicht beim POST.","type":["integer","null"]},"visible":{"description":"Sichtbar (true) oder ausgeblendet (false); Default true.","type":["boolean","null"]}}},"CustomerGroupVisibility.jsonld-customer_group_visibility.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"groupUlid":{"description":"ULID der Gruppe (read-only, aus dem Pfad).","type":["string","null"]},"scope":{"enum":["product","category"],"description":"product | category — Pflicht beim POST.","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (Produkt-/Kategorie-ID) — Pflicht beim POST.","type":["integer","null"]},"visible":{"description":"Sichtbar (true) oder ausgeblendet (false); Default true.","type":["boolean","null"]}}}],"description":"Sub-Resource /v1/customer-groups/{ulid}/visibility (04-26 §5/KG2).\n- POST: Upsert je (Gruppe, Scope, Referenz), setzt `visible` neu\n- DELETE: entfernt die Zeile."},"CustomerInteractionFrequency-customer_frequency.read":{"type":"object","description":"Interaktions-Frequenz eines Kunden je Monat (Doc 26 3.4) — verdichtet die Kunden-360-Kommunikation\n({@see CustomerActivityResource}) zu einer Zeitreihe für die Frequenz-Visualisierung: je Monat die\nZahl der Kontakte insgesamt sowie ein-/ausgehend. Read-only, `?customerUlid=…` Pflicht.","properties":{"month":{"description":"Monat als `YYYY-MM` (zugleich Identifier).","default":"","type":"string"},"total":{"default":0,"type":"integer"},"inbound":{"default":0,"type":"integer"},"outbound":{"default":0,"type":"integer"}}},"CustomerInteractionFrequency.jsonld-customer_frequency.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"month":{"description":"Monat als `YYYY-MM` (zugleich Identifier).","default":"","type":"string"},"total":{"default":0,"type":"integer"},"inbound":{"default":0,"type":"integer"},"outbound":{"default":0,"type":"integer"}}}],"description":"Interaktions-Frequenz eines Kunden je Monat (Doc 26 3.4) — verdichtet die Kunden-360-Kommunikation\n({@see CustomerActivityResource}) zu einer Zeitreihe für die Frequenz-Visualisierung: je Monat die\nZahl der Kontakte insgesamt sowie ein-/ausgehend. Read-only, `?customerUlid=…` Pflicht."},"CustomerPriceList-customer_price_list.read":{"type":"object","description":"Kundenindividuelle Preisliste inkl. Konditionen (04-28 §5/§8).\n- POST: legt Liste + `prices` an\n- PATCH: aktualisiert Felder, ersetzt `prices` bei Angabe vollständig\n- DELETE: Soft-Delete\n- `value`: price → Cent, percent → Prozent×100 (1050 = 10,50 %).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"customerUlid":{"maxLength":26,"description":"Kunden-ULID — Pflicht bei Anlage (Kunde ist danach fix).","type":["string","null"]},"customerId":{"description":"Interne Kunden-ID (read-only; Collection-Filter `customerId`).","type":["integer","null"]},"name":{"maxLength":100,"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]},"approvedBy":{"description":"Freigebender User (ULID, read-only — Freigabe-Workflow KI1 folgt).","type":["string","null"]},"note":{"type":["string","null"]},"prices":{"description":"Konditionen (Sync-Liste).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"CustomerPriceList-customer_price_list.write":{"type":"object","description":"Kundenindividuelle Preisliste inkl. Konditionen (04-28 §5/§8).\n- POST: legt Liste + `prices` an\n- PATCH: aktualisiert Felder, ersetzt `prices` bei Angabe vollständig\n- DELETE: Soft-Delete\n- `value`: price → Cent, percent → Prozent×100 (1050 = 10,50 %).","properties":{"customerUlid":{"maxLength":26,"description":"Kunden-ULID — Pflicht bei Anlage (Kunde ist danach fix).","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]},"note":{"type":["string","null"]},"prices":{"description":"Konditionen (Sync-Liste).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"CustomerPriceList-customer_price_list.write.jsonMergePatch":{"type":"object","description":"Kundenindividuelle Preisliste inkl. Konditionen (04-28 §5/§8).\n- POST: legt Liste + `prices` an\n- PATCH: aktualisiert Felder, ersetzt `prices` bei Angabe vollständig\n- DELETE: Soft-Delete\n- `value`: price → Cent, percent → Prozent×100 (1050 = 10,50 %).","properties":{"customerUlid":{"maxLength":26,"description":"Kunden-ULID — Pflicht bei Anlage (Kunde ist danach fix).","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]},"note":{"type":["string","null"]},"prices":{"description":"Konditionen (Sync-Liste).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"CustomerPriceList.jsonld-customer_price_list.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"customerUlid":{"maxLength":26,"description":"Kunden-ULID — Pflicht bei Anlage (Kunde ist danach fix).","type":["string","null"]},"customerId":{"description":"Interne Kunden-ID (read-only; Collection-Filter `customerId`).","type":["integer","null"]},"name":{"maxLength":100,"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]},"approvedBy":{"description":"Freigebender User (ULID, read-only — Freigabe-Workflow KI1 folgt).","type":["string","null"]},"note":{"type":["string","null"]},"prices":{"description":"Konditionen (Sync-Liste).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Kundenindividuelle Preisliste inkl. Konditionen (04-28 §5/§8).\n- POST: legt Liste + `prices` an\n- PATCH: aktualisiert Felder, ersetzt `prices` bei Angabe vollständig\n- DELETE: Soft-Delete\n- `value`: price → Cent, percent → Prozent×100 (1050 = 10,50 %)."},"CustomerRelation-customer_relation.read":{"type":"object","description":"Gleichrangige Organisations-Beziehungen eines Kunden (Doc 26 3.9). GET listet die verbundenen\nOrganisationen; POST verknüpft (`relatedUlid`), DELETE löst die Verknüpfung — beides symmetrisch.\nLesen `customer.read`; Pflege `customer.update`.","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]}}},"CustomerRelation-customer_relation.write":{"type":"object","description":"Gleichrangige Organisations-Beziehungen eines Kunden (Doc 26 3.9). GET listet die verbundenen\nOrganisationen; POST verknüpft (`relatedUlid`), DELETE löst die Verknüpfung — beides symmetrisch.\nLesen `customer.read`; Pflege `customer.update`.","required":["relatedUlid"],"properties":{"relatedUlid":{"description":"Ziel-Organisation (ULID) beim Verknüpfen.","type":["string","null"]}}},"CustomerRelation.jsonld-customer_relation.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]}}}],"description":"Gleichrangige Organisations-Beziehungen eines Kunden (Doc 26 3.9). GET listet die verbundenen\nOrganisationen; POST verknüpft (`relatedUlid`), DELETE löst die Verknüpfung — beides symmetrisch.\nLesen `customer.read`; Pflege `customer.update`."},"CustomerStatus-customer_status.read":{"type":"object","description":"Kunden-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in\nCustomer.statusId. `isWon`/`isLost` markieren Gewinn-/Verlust-Status.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isWon":{"type":["boolean","null"]},"isLost":{"type":["boolean","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"CustomerStatus-customer_status.update.jsonMergePatch":{"type":"object","description":"Kunden-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in\nCustomer.statusId. `isWon`/`isLost` markieren Gewinn-/Verlust-Status.","properties":{"label":{"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isWon":{"type":["boolean","null"]},"isLost":{"type":["boolean","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"CustomerStatus-customer_status.write":{"type":"object","description":"Kunden-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in\nCustomer.statusId. `isWon`/`isLost` markieren Gewinn-/Verlust-Status.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isWon":{"type":["boolean","null"]},"isLost":{"type":["boolean","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"CustomerStatus.jsonld-customer_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isWon":{"type":["boolean","null"]},"isLost":{"type":["boolean","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Kunden-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in\nCustomer.statusId. `isWon`/`isLost` markieren Gewinn-/Verlust-Status."},"Deal-deal.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — u. a. entityId für den polymorphen Benutzerfeld-Editor.","type":["integer","null"]},"title":{"maxLength":500,"default":"","type":"string"},"customerId":{"type":["integer","null"]},"customerName":{"type":["string","null"]},"primaryContactId":{"type":["integer","null"]},"primaryContactName":{"type":["string","null"]},"pipelineId":{"description":"Ziel-Pipeline; fehlt sie (mit {@see $stageId}), weist {@see \\Octi\\Plugin\\Crm\\Service\\PipelineRouter} die Default-Pipeline zu.","type":["integer","null"]},"pipelineName":{"type":["string","null"]},"stageId":{"type":["integer","null"]},"stageName":{"type":["string","null"]},"stageType":{"type":["string","null"]},"valueAmount":{"minimum":0,"description":"Wert in Cent","default":0,"type":"integer"},"mrrAmount":{"minimum":0,"description":"Monatlich wiederkehrender Umsatz in Cent (MRR, Doc 26 3.6).","default":0,"type":"integer"},"arrAmount":{"description":"Abgeleiteter jährlich wiederkehrender Umsatz (ARR = MRR × 12), Cent — read-only.","default":0,"type":"integer"},"weightedValue":{"default":0,"type":"integer"},"probability":{"minimum":0,"maximum":100,"default":50,"type":"integer"},"expectedCloseDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"forecastCategory":{"enum":["pipeline","best_case","worst_case","commit"],"default":"pipeline","type":"string"},"ownerId":{"type":["integer","null"]},"sourceId":{"type":["integer","null"]},"sourceLabel":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"lostReasonId":{"type":["integer","null"]},"lostReasonLabel":{"type":["string","null"]},"notes":{"type":["string","null"]},"followUpType":{"enum":["quote","project","contract","license"],"description":"Folgeobjekt bei Deal = won (quote|project|contract|license). Pflicht beim Wechsel in\n\"won\"-Stage (§6/AC9), Trigger für Automation via {@see \\App\\Crm\\Event\\DealWon}.","type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"formulaFields":{"description":"Materialisierte Formelfelder (Doc 26 4.2 v2, E7): Feld-Schlüssel => read-time berechneter Wert.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"history":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdQuoteUlid":{"description":"ULID des per create-quote-Aktion erzeugten Angebots (nur in der Aktions-Response gesetzt).","type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["title"]},"Deal-deal.write":{"type":"object","required":["title"],"properties":{"title":{"maxLength":500,"default":"","type":"string"},"customerId":{"type":["integer","null"]},"primaryContactId":{"type":["integer","null"]},"pipelineId":{"description":"Ziel-Pipeline; fehlt sie (mit {@see $stageId}), weist {@see \\Octi\\Plugin\\Crm\\Service\\PipelineRouter} die Default-Pipeline zu.","type":["integer","null"]},"stageId":{"type":["integer","null"]},"valueAmount":{"minimum":0,"description":"Wert in Cent","default":0,"type":"integer"},"mrrAmount":{"minimum":0,"description":"Monatlich wiederkehrender Umsatz in Cent (MRR, Doc 26 3.6).","default":0,"type":"integer"},"probability":{"minimum":0,"maximum":100,"default":50,"type":"integer"},"expectedCloseDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"forecastCategory":{"enum":["pipeline","best_case","worst_case","commit"],"default":"pipeline","type":"string"},"ownerId":{"type":["integer","null"]},"sourceId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"lostReasonId":{"type":["integer","null"]},"notes":{"type":["string","null"]},"followUpType":{"enum":["quote","project","contract","license"],"description":"Folgeobjekt bei Deal = won (quote|project|contract|license). Pflicht beim Wechsel in\n\"won\"-Stage (§6/AC9), Trigger für Automation via {@see \\App\\Crm\\Event\\DealWon}.","type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}}}},"Deal-deal.write.jsonMergePatch":{"type":"object","properties":{"title":{"maxLength":500,"default":"","type":"string"},"customerId":{"type":["integer","null"]},"primaryContactId":{"type":["integer","null"]},"pipelineId":{"description":"Ziel-Pipeline; fehlt sie (mit {@see $stageId}), weist {@see \\Octi\\Plugin\\Crm\\Service\\PipelineRouter} die Default-Pipeline zu.","type":["integer","null"]},"stageId":{"type":["integer","null"]},"valueAmount":{"minimum":0,"description":"Wert in Cent","default":0,"type":"integer"},"mrrAmount":{"minimum":0,"description":"Monatlich wiederkehrender Umsatz in Cent (MRR, Doc 26 3.6).","default":0,"type":"integer"},"probability":{"minimum":0,"maximum":100,"default":50,"type":"integer"},"expectedCloseDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"forecastCategory":{"enum":["pipeline","best_case","worst_case","commit"],"default":"pipeline","type":"string"},"ownerId":{"type":["integer","null"]},"sourceId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"lostReasonId":{"type":["integer","null"]},"notes":{"type":["string","null"]},"followUpType":{"enum":["quote","project","contract","license"],"description":"Folgeobjekt bei Deal = won (quote|project|contract|license). Pflicht beim Wechsel in\n\"won\"-Stage (§6/AC9), Trigger für Automation via {@see \\App\\Crm\\Event\\DealWon}.","type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}}}},"Deal.jsonld-deal.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — u. a. entityId für den polymorphen Benutzerfeld-Editor.","type":["integer","null"]},"title":{"maxLength":500,"default":"","type":"string"},"customerId":{"type":["integer","null"]},"customerName":{"type":["string","null"]},"primaryContactId":{"type":["integer","null"]},"primaryContactName":{"type":["string","null"]},"pipelineId":{"description":"Ziel-Pipeline; fehlt sie (mit {@see $stageId}), weist {@see \\Octi\\Plugin\\Crm\\Service\\PipelineRouter} die Default-Pipeline zu.","type":["integer","null"]},"pipelineName":{"type":["string","null"]},"stageId":{"type":["integer","null"]},"stageName":{"type":["string","null"]},"stageType":{"type":["string","null"]},"valueAmount":{"minimum":0,"description":"Wert in Cent","default":0,"type":"integer"},"mrrAmount":{"minimum":0,"description":"Monatlich wiederkehrender Umsatz in Cent (MRR, Doc 26 3.6).","default":0,"type":"integer"},"arrAmount":{"description":"Abgeleiteter jährlich wiederkehrender Umsatz (ARR = MRR × 12), Cent — read-only.","default":0,"type":"integer"},"weightedValue":{"default":0,"type":"integer"},"probability":{"minimum":0,"maximum":100,"default":50,"type":"integer"},"expectedCloseDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"forecastCategory":{"enum":["pipeline","best_case","worst_case","commit"],"default":"pipeline","type":"string"},"ownerId":{"type":["integer","null"]},"sourceId":{"type":["integer","null"]},"sourceLabel":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"lostReasonId":{"type":["integer","null"]},"lostReasonLabel":{"type":["string","null"]},"notes":{"type":["string","null"]},"followUpType":{"enum":["quote","project","contract","license"],"description":"Folgeobjekt bei Deal = won (quote|project|contract|license). Pflicht beim Wechsel in\n\"won\"-Stage (§6/AC9), Trigger für Automation via {@see \\App\\Crm\\Event\\DealWon}.","type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"formulaFields":{"description":"Materialisierte Formelfelder (Doc 26 4.2 v2, E7): Feld-Schlüssel => read-time berechneter Wert.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"history":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdQuoteUlid":{"description":"ULID des per create-quote-Aktion erzeugten Angebots (nur in der Aktions-Response gesetzt).","type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["title"]}]},"DeliveryAvis-delivery_avis.read":{"type":"object","description":"Lieferavis (Doc 25 AP 7.3, B1 (b)): der Lieferant sagt an, was kommt und in welchen Paketen.\n\n**Der Weg, für den es gebaut ist, hat drei Schritte:** Paket scannen (`resolve`) → Vorschlag\nansehen (`proposal`) → buchen (`receive`). Gebucht wird über denselben Wareneingangs-Pfad wie\nalles andere; ein eigener Buchungsweg wäre ein zweiter Ort, an dem Bestand entsteht.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"maxLength":60,"description":"Avisnummer des Lieferanten — seine Papiere, nicht unser Nummernkreis.","type":["string","null"]},"goodsOrderUlid":{"description":"Bestellung, auf die sich das Avis bezieht (ULID, nur bei Anlage).","type":["string","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderNumber":{"type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"expectedAt":{"description":"Voraussichtliches Lieferdatum (YYYY-MM-DD).","type":["string","null"]},"status":{"description":"announced|received|cancelled (read-only — gesetzt wird über `receive`/`cancel`).","type":["string","null"]},"goodsReceiptId":{"type":["integer","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"packages":{"description":"Packstücke: `{identifier, trackingNumber, trackingUrl, weightGrams}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"items":{"description":"Positionen: `{orderItemUlid, productId, description, qty, batchRef, expiresAt, serialRef, packageIdentifier}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"proposal":{"description":"Einbuchungs-Vorschlag (read-only, nur bei `resolve` und im Detail): je Zeile `bookable` und\n— wenn nicht — der Grund. Eine Zeile, die still fehlt, fällt erst auf, wenn der Bestand\nnicht stimmt.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"DeliveryAvis-delivery_avis.write":{"type":"object","description":"Lieferavis (Doc 25 AP 7.3, B1 (b)): der Lieferant sagt an, was kommt und in welchen Paketen.\n\n**Der Weg, für den es gebaut ist, hat drei Schritte:** Paket scannen (`resolve`) → Vorschlag\nansehen (`proposal`) → buchen (`receive`). Gebucht wird über denselben Wareneingangs-Pfad wie\nalles andere; ein eigener Buchungsweg wäre ein zweiter Ort, an dem Bestand entsteht.","properties":{"number":{"maxLength":60,"description":"Avisnummer des Lieferanten — seine Papiere, nicht unser Nummernkreis.","type":["string","null"]},"goodsOrderUlid":{"description":"Bestellung, auf die sich das Avis bezieht (ULID, nur bei Anlage).","type":["string","null"]},"expectedAt":{"description":"Voraussichtliches Lieferdatum (YYYY-MM-DD).","type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"packages":{"description":"Packstücke: `{identifier, trackingNumber, trackingUrl, weightGrams}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"items":{"description":"Positionen: `{orderItemUlid, productId, description, qty, batchRef, expiresAt, serialRef, packageIdentifier}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"DeliveryAvis-delivery_avis.write.jsonMergePatch":{"type":"object","description":"Lieferavis (Doc 25 AP 7.3, B1 (b)): der Lieferant sagt an, was kommt und in welchen Paketen.\n\n**Der Weg, für den es gebaut ist, hat drei Schritte:** Paket scannen (`resolve`) → Vorschlag\nansehen (`proposal`) → buchen (`receive`). Gebucht wird über denselben Wareneingangs-Pfad wie\nalles andere; ein eigener Buchungsweg wäre ein zweiter Ort, an dem Bestand entsteht.","properties":{"number":{"maxLength":60,"description":"Avisnummer des Lieferanten — seine Papiere, nicht unser Nummernkreis.","type":["string","null"]},"goodsOrderUlid":{"description":"Bestellung, auf die sich das Avis bezieht (ULID, nur bei Anlage).","type":["string","null"]},"expectedAt":{"description":"Voraussichtliches Lieferdatum (YYYY-MM-DD).","type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"packages":{"description":"Packstücke: `{identifier, trackingNumber, trackingUrl, weightGrams}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"items":{"description":"Positionen: `{orderItemUlid, productId, description, qty, batchRef, expiresAt, serialRef, packageIdentifier}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"DeliveryAvis.jsonld-delivery_avis.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"maxLength":60,"description":"Avisnummer des Lieferanten — seine Papiere, nicht unser Nummernkreis.","type":["string","null"]},"goodsOrderUlid":{"description":"Bestellung, auf die sich das Avis bezieht (ULID, nur bei Anlage).","type":["string","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderNumber":{"type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"expectedAt":{"description":"Voraussichtliches Lieferdatum (YYYY-MM-DD).","type":["string","null"]},"status":{"description":"announced|received|cancelled (read-only — gesetzt wird über `receive`/`cancel`).","type":["string","null"]},"goodsReceiptId":{"type":["integer","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"packages":{"description":"Packstücke: `{identifier, trackingNumber, trackingUrl, weightGrams}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"items":{"description":"Positionen: `{orderItemUlid, productId, description, qty, batchRef, expiresAt, serialRef, packageIdentifier}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"proposal":{"description":"Einbuchungs-Vorschlag (read-only, nur bei `resolve` und im Detail): je Zeile `bookable` und\n— wenn nicht — der Grund. Eine Zeile, die still fehlt, fällt erst auf, wenn der Bestand\nnicht stimmt.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Lieferavis (Doc 25 AP 7.3, B1 (b)): der Lieferant sagt an, was kommt und in welchen Paketen.\n\n**Der Weg, für den es gebaut ist, hat drei Schritte:** Paket scannen (`resolve`) → Vorschlag\nansehen (`proposal`) → buchen (`receive`). Gebucht wird über denselben Wareneingangs-Pfad wie\nalles andere; ein eigener Buchungsweg wäre ein zweiter Ort, an dem Bestand entsteht."},"DeliveryNote-delivery_note.read":{"type":"object","description":"Lieferschein-Resource (04-22 §8).\n- Erzeugung: POST /v1/delivery-notes {orderUlid, items?}\n- Aktionen: pick, ship (Sendung+Packstücke, Carrier-Label via Kernel-SPI, Bestandsabbuchung, Event), delivered\n- PDF ohne Preise\n- ULID-Routen: Format-Requirement wie SalesOrder.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"number":{"type":["string","null"]},"orderId":{"type":["integer","null"]},"orderNumber":{"description":"Quell-Auftragsnummer, read-only, gebatcht statt Client-Katalog (Audit R20 PERF-2); null falls OctiSalesOrder inaktiv/Auftrag entfernt.","type":["string","null"]},"status":{"description":"Lebenszyklus-Status draft/picked/shipped/delivered (read-only — Übergänge über die Aktionen).","type":["string","null"]},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customsRequired":{"description":"Braucht diese Lieferung Zollpapiere? (Lieferanschrift außerhalb des Zollgebiets der Union —\ninklusive der deutschen Enklaven Helgoland/Büsingen, Doc 25 AP 3.6.) Read-only: die Antwort\ngibt der Kernel, damit die Oberfläche keine zweite Länderliste führt.","type":["boolean","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"deliveredAt":{"type":["string","null"]},"createdAt":{"description":"Anlagedatum (ISO-8601) — Listenspalte + Default-Sortierung der Lieferschein-Liste.","type":["string","null"]},"brandId":{"type":["integer","null"]},"customerId":{"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}}}},"DeliveryNote-delivery_note.write":{"type":"object","description":"Lieferschein-Resource (04-22 §8).\n- Erzeugung: POST /v1/delivery-notes {orderUlid, items?}\n- Aktionen: pick, ship (Sendung+Packstücke, Carrier-Label via Kernel-SPI, Bestandsabbuchung, Event), delivered\n- PDF ohne Preise\n- ULID-Routen: Format-Requirement wie SalesOrder.","properties":{"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"orderUlid":{"description":"Auftrags-ULID für die Erzeugung (POST).","type":["string","null"]},"carrierKey":{"maxLength":50,"description":"Carrier-Schlüssel für ship-Aktion (null = ohne Label).","type":["string","null"]},"service":{"maxLength":50,"description":"Carrier-Service/Produkt für die ship-Aktion (z. B. \"standard\", \"express\").","type":["string","null"]},"packages":{"description":"Packstücke für die ship-Aktion: Liste von {weightGrams, lengthMm?, widthMm?,\nheightMm?, content?}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"DeliveryNote.jsonld-delivery_note.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"number":{"type":["string","null"]},"orderId":{"type":["integer","null"]},"orderNumber":{"description":"Quell-Auftragsnummer, read-only, gebatcht statt Client-Katalog (Audit R20 PERF-2); null falls OctiSalesOrder inaktiv/Auftrag entfernt.","type":["string","null"]},"status":{"description":"Lebenszyklus-Status draft/picked/shipped/delivered (read-only — Übergänge über die Aktionen).","type":["string","null"]},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customsRequired":{"description":"Braucht diese Lieferung Zollpapiere? (Lieferanschrift außerhalb des Zollgebiets der Union —\ninklusive der deutschen Enklaven Helgoland/Büsingen, Doc 25 AP 3.6.) Read-only: die Antwort\ngibt der Kernel, damit die Oberfläche keine zweite Länderliste führt.","type":["boolean","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"deliveredAt":{"type":["string","null"]},"createdAt":{"description":"Anlagedatum (ISO-8601) — Listenspalte + Default-Sortierung der Lieferschein-Liste.","type":["string","null"]},"brandId":{"type":["integer","null"]},"customerId":{"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}}}}],"description":"Lieferschein-Resource (04-22 §8).\n- Erzeugung: POST /v1/delivery-notes {orderUlid, items?}\n- Aktionen: pick, ship (Sendung+Packstücke, Carrier-Label via Kernel-SPI, Bestandsabbuchung, Event), delivered\n- PDF ohne Preise\n- ULID-Routen: Format-Requirement wie SalesOrder."},"DispatchStatus-dispatch_status.read":{"type":"object","description":"E-Mail-Kampagnen-Status als Daten: in Settings ohne Code konfigurierbar.\n`key` entspricht den Dispatch::STATUS_*-Werten.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"DispatchStatus-dispatch_status.update.jsonMergePatch":{"type":"object","description":"E-Mail-Kampagnen-Status als Daten: in Settings ohne Code konfigurierbar.\n`key` entspricht den Dispatch::STATUS_*-Werten.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"DispatchStatus-dispatch_status.write":{"type":"object","description":"E-Mail-Kampagnen-Status als Daten: in Settings ohne Code konfigurierbar.\n`key` entspricht den Dispatch::STATUS_*-Werten.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"DispatchStatus.jsonld-dispatch_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"E-Mail-Kampagnen-Status als Daten: in Settings ohne Code konfigurierbar.\n`key` entspricht den Dispatch::STATUS_*-Werten."},"DocTopic-doc_topic.read":{"type":"object","description":"Doku-/Hilfe-Thema (Programm 23 H9). Lesen = jeder angemeldete Nutzer; Pflege = `platform.docs.manage`.\n\n- Die COLLECTION ist der Index OHNE Body (R1: ~250 Zeilen je Session) — `bodyHtml`/`bodyMarkdown`\n  traegt nur das Item.\n- Der oeffentliche Identifier ist die ULID, NICHT der `key`. Der Key traegt einen Punkt\n  (`crm.deals`), und ein Punkt im API-Platform-Identifier bricht die IRI-Erzeugung\n  („Unable to generate an IRI\", 400). Wer per Key sucht, filtert die Collection (`key=`) —\n  die Oberflaeche haelt den Index ohnehin und loest den Deep-Link damit selbst auf.\n- K4/K5 (developer/reference) sind Generat: `editable=false`, Schreiben antwortet 403.\n- Modul-Gate serverseitig: ein Thema mit `moduleKey` eines deaktivierten Moduls ist unsichtbar (S4).","properties":{"ulid":{"type":["string","null"]},"key":{"maxLength":120,"pattern":"^([a-z0-9]+\\.[a-z0-9-]+)$","description":"Stabiler Schluessel `<namensraum>.<slug>` — Deep-Link-Ziel der Oberflaeche.","default":"","type":"string"},"namespace":{"default":"","type":"string"},"kind":{"enum":["guide","module","admin","developer","reference"],"default":"guide","type":"string"},"area":{"default":"handbuch","type":"string"},"audience":{"enum":["staff","portal","both"],"default":"staff","type":"string"},"channels":{"default":["app","web"],"type":"array","items":{"type":"string"}},"visibility":{"enum":["public","internal"],"default":"public","type":"string"},"status":{"enum":["draft","review","published"],"default":"draft","type":"string"},"moduleKey":{"type":["string","null"]},"routeNames":{"type":"array","items":{"type":"string"}},"pathPrefixes":{"type":"array","items":{"type":"string"}},"sortOrder":{"default":100,"type":"integer"},"since":{"type":["string","null"]},"deprecatedIn":{"type":["string","null"]},"related":{"type":"array","items":{"type":"string"}},"providerKey":{"default":"docs","type":"string"},"editable":{"default":true,"type":"boolean"},"customized":{"default":false,"type":"boolean"},"active":{"default":true,"type":"boolean"},"locale":{"description":"Sprache der gelieferten Variante; im Schreibpfad die ZU AENDERNDE Sprache.","default":"de","type":"string"},"locales":{"description":"Sprachen, in denen dieses Thema vorliegt.","type":"array","items":{"type":"string"}},"title":{"description":"SSoT ist der H1 des Inhalts (H3) — deshalb nur lesbar, nie geschrieben.","default":"","type":"string"},"summary":{"default":"","type":"string"},"bodyHtml":{"description":"Render-SSoT der Oberflaeche — nur im Einzelabruf gefuellt (R1).","type":["string","null"]},"bodyMarkdown":{"description":"Schreibpfad fuer Markdown-Quellen (API/MCP); im Lesepfad nur im Einzelabruf.","type":["string","null"]},"seo":{"type":"object","additionalProperties":{"type":["string","null"]}},"keywords":{"type":"array","items":{"type":"string"}},"variantCustomized":{"description":"Diese SPRACHE ist ueberschrieben — der Sync laesst sie in Ruhe.","default":false,"type":"boolean"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["key"]},"DocTopic-doc_topic.write":{"type":"object","description":"Doku-/Hilfe-Thema (Programm 23 H9). Lesen = jeder angemeldete Nutzer; Pflege = `platform.docs.manage`.\n\n- Die COLLECTION ist der Index OHNE Body (R1: ~250 Zeilen je Session) — `bodyHtml`/`bodyMarkdown`\n  traegt nur das Item.\n- Der oeffentliche Identifier ist die ULID, NICHT der `key`. Der Key traegt einen Punkt\n  (`crm.deals`), und ein Punkt im API-Platform-Identifier bricht die IRI-Erzeugung\n  („Unable to generate an IRI\", 400). Wer per Key sucht, filtert die Collection (`key=`) —\n  die Oberflaeche haelt den Index ohnehin und loest den Deep-Link damit selbst auf.\n- K4/K5 (developer/reference) sind Generat: `editable=false`, Schreiben antwortet 403.\n- Modul-Gate serverseitig: ein Thema mit `moduleKey` eines deaktivierten Moduls ist unsichtbar (S4).","required":["key"],"properties":{"key":{"maxLength":120,"pattern":"^([a-z0-9]+\\.[a-z0-9-]+)$","description":"Stabiler Schluessel `<namensraum>.<slug>` — Deep-Link-Ziel der Oberflaeche.","default":"","type":"string"},"kind":{"enum":["guide","module","admin","developer","reference"],"default":"guide","type":"string"},"audience":{"enum":["staff","portal","both"],"default":"staff","type":"string"},"channels":{"default":["app","web"],"type":"array","items":{"type":"string"}},"visibility":{"enum":["public","internal"],"default":"public","type":"string"},"status":{"enum":["draft","review","published"],"default":"draft","type":"string"},"moduleKey":{"type":["string","null"]},"routeNames":{"type":"array","items":{"type":"string"}},"pathPrefixes":{"type":"array","items":{"type":"string"}},"sortOrder":{"default":100,"type":"integer"},"active":{"default":true,"type":"boolean"},"locale":{"description":"Sprache der gelieferten Variante; im Schreibpfad die ZU AENDERNDE Sprache.","default":"de","type":"string"},"bodyHtml":{"description":"Render-SSoT der Oberflaeche — nur im Einzelabruf gefuellt (R1).","type":["string","null"]},"bodyMarkdown":{"description":"Schreibpfad fuer Markdown-Quellen (API/MCP); im Lesepfad nur im Einzelabruf.","type":["string","null"]}}},"DocTopic-doc_topic.write.jsonMergePatch":{"type":"object","description":"Doku-/Hilfe-Thema (Programm 23 H9). Lesen = jeder angemeldete Nutzer; Pflege = `platform.docs.manage`.\n\n- Die COLLECTION ist der Index OHNE Body (R1: ~250 Zeilen je Session) — `bodyHtml`/`bodyMarkdown`\n  traegt nur das Item.\n- Der oeffentliche Identifier ist die ULID, NICHT der `key`. Der Key traegt einen Punkt\n  (`crm.deals`), und ein Punkt im API-Platform-Identifier bricht die IRI-Erzeugung\n  („Unable to generate an IRI\", 400). Wer per Key sucht, filtert die Collection (`key=`) —\n  die Oberflaeche haelt den Index ohnehin und loest den Deep-Link damit selbst auf.\n- K4/K5 (developer/reference) sind Generat: `editable=false`, Schreiben antwortet 403.\n- Modul-Gate serverseitig: ein Thema mit `moduleKey` eines deaktivierten Moduls ist unsichtbar (S4).","properties":{"key":{"maxLength":120,"pattern":"^([a-z0-9]+\\.[a-z0-9-]+)$","description":"Stabiler Schluessel `<namensraum>.<slug>` — Deep-Link-Ziel der Oberflaeche.","default":"","type":"string"},"kind":{"enum":["guide","module","admin","developer","reference"],"default":"guide","type":"string"},"audience":{"enum":["staff","portal","both"],"default":"staff","type":"string"},"channels":{"default":["app","web"],"type":"array","items":{"type":"string"}},"visibility":{"enum":["public","internal"],"default":"public","type":"string"},"status":{"enum":["draft","review","published"],"default":"draft","type":"string"},"moduleKey":{"type":["string","null"]},"routeNames":{"type":"array","items":{"type":"string"}},"pathPrefixes":{"type":"array","items":{"type":"string"}},"sortOrder":{"default":100,"type":"integer"},"active":{"default":true,"type":"boolean"},"locale":{"description":"Sprache der gelieferten Variante; im Schreibpfad die ZU AENDERNDE Sprache.","default":"de","type":"string"},"bodyHtml":{"description":"Render-SSoT der Oberflaeche — nur im Einzelabruf gefuellt (R1).","type":["string","null"]},"bodyMarkdown":{"description":"Schreibpfad fuer Markdown-Quellen (API/MCP); im Lesepfad nur im Einzelabruf.","type":["string","null"]}}},"DocTopic.jsonld-doc_topic.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"key":{"maxLength":120,"pattern":"^([a-z0-9]+\\.[a-z0-9-]+)$","description":"Stabiler Schluessel `<namensraum>.<slug>` — Deep-Link-Ziel der Oberflaeche.","default":"","type":"string"},"namespace":{"default":"","type":"string"},"kind":{"enum":["guide","module","admin","developer","reference"],"default":"guide","type":"string"},"area":{"default":"handbuch","type":"string"},"audience":{"enum":["staff","portal","both"],"default":"staff","type":"string"},"channels":{"default":["app","web"],"type":"array","items":{"type":"string"}},"visibility":{"enum":["public","internal"],"default":"public","type":"string"},"status":{"enum":["draft","review","published"],"default":"draft","type":"string"},"moduleKey":{"type":["string","null"]},"routeNames":{"type":"array","items":{"type":"string"}},"pathPrefixes":{"type":"array","items":{"type":"string"}},"sortOrder":{"default":100,"type":"integer"},"since":{"type":["string","null"]},"deprecatedIn":{"type":["string","null"]},"related":{"type":"array","items":{"type":"string"}},"providerKey":{"default":"docs","type":"string"},"editable":{"default":true,"type":"boolean"},"customized":{"default":false,"type":"boolean"},"active":{"default":true,"type":"boolean"},"locale":{"description":"Sprache der gelieferten Variante; im Schreibpfad die ZU AENDERNDE Sprache.","default":"de","type":"string"},"locales":{"description":"Sprachen, in denen dieses Thema vorliegt.","type":"array","items":{"type":"string"}},"title":{"description":"SSoT ist der H1 des Inhalts (H3) — deshalb nur lesbar, nie geschrieben.","default":"","type":"string"},"summary":{"default":"","type":"string"},"bodyHtml":{"description":"Render-SSoT der Oberflaeche — nur im Einzelabruf gefuellt (R1).","type":["string","null"]},"bodyMarkdown":{"description":"Schreibpfad fuer Markdown-Quellen (API/MCP); im Lesepfad nur im Einzelabruf.","type":["string","null"]},"seo":{"type":"object","additionalProperties":{"type":["string","null"]}},"keywords":{"type":"array","items":{"type":"string"}},"variantCustomized":{"description":"Diese SPRACHE ist ueberschrieben — der Sync laesst sie in Ruhe.","default":false,"type":"boolean"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["key"]}],"description":"Doku-/Hilfe-Thema (Programm 23 H9). Lesen = jeder angemeldete Nutzer; Pflege = `platform.docs.manage`.\n\n- Die COLLECTION ist der Index OHNE Body (R1: ~250 Zeilen je Session) — `bodyHtml`/`bodyMarkdown`\n  traegt nur das Item.\n- Der oeffentliche Identifier ist die ULID, NICHT der `key`. Der Key traegt einen Punkt\n  (`crm.deals`), und ein Punkt im API-Platform-Identifier bricht die IRI-Erzeugung\n  („Unable to generate an IRI\", 400). Wer per Key sucht, filtert die Collection (`key=`) —\n  die Oberflaeche haelt den Index ohnehin und loest den Deep-Link damit selbst auf.\n- K4/K5 (developer/reference) sind Generat: `editable=false`, Schreiben antwortet 403.\n- Modul-Gate serverseitig: ein Thema mit `moduleKey` eines deaktivierten Moduls ist unsichtbar (S4)."},"DocumentPreview-document_preview.read":{"type":"object","description":"Zustandslose Editor-Vorschau (15 §7): Twig/Blockstruktur + Beispiel-Variablen → HTML,\nohne Speichern. Sandbox-/Syntaxfehler → 422.","properties":{"id":{"type":["string","null"]},"compiledBody":{"description":"Kompilierter Twig-Quelltext (bei editorMode=visual, read-only).","type":["string","null"]},"html":{"type":["string","null"]}}},"DocumentPreview-document_preview.write":{"type":"object","description":"Zustandslose Editor-Vorschau (15 §7): Twig/Blockstruktur + Beispiel-Variablen → HTML,\nohne Speichern. Sandbox-/Syntaxfehler → 422.","required":["docType"],"properties":{"docType":{"type":["string","null"]},"editorMode":{"enum":["visual","twig"],"type":["string","null"]},"body":{"type":["string","null"]},"blocks":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"DocumentPreview.jsonld-document_preview.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"compiledBody":{"description":"Kompilierter Twig-Quelltext (bei editorMode=visual, read-only).","type":["string","null"]},"html":{"type":["string","null"]}}}],"description":"Zustandslose Editor-Vorschau (15 §7): Twig/Blockstruktur + Beispiel-Variablen → HTML,\nohne Speichern. Sandbox-/Syntaxfehler → 422."},"DocumentStandingAttachment-document_attachment.read":{"type":"object","description":"Feste Beleg-Beilagen (Doc 40): welche Datei automatisch an welche Belegart welcher Marke gehängt\nwird. Stammdaten der Einstellungen — Recht wie bei den Belegvorlagen.","properties":{"ulid":{"type":["string","null"]},"label":{"description":"Anzeigename; leer ⇒ Dateiname der referenzierten Datei.","type":["string","null"]},"fileUlid":{"description":"Datei aus der Ablage (`/v1/platform/files`), ULID.","type":["string","null"]},"fileName":{"description":"Dateiname der referenzierten Datei — read-only, für die Anzeige.","type":["string","null"]},"brandId":{"description":"Marke; leer ⇒ gilt für jede Marke.","type":["integer","null"]},"documentKinds":{"description":"Belegarten (`quote`, `invoice`, `order`); leere Liste ⇒ alle.","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"position":{"type":["integer","null"]}}},"DocumentStandingAttachment-document_attachment.write":{"type":"object","description":"Feste Beleg-Beilagen (Doc 40): welche Datei automatisch an welche Belegart welcher Marke gehängt\nwird. Stammdaten der Einstellungen — Recht wie bei den Belegvorlagen.","properties":{"label":{"description":"Anzeigename; leer ⇒ Dateiname der referenzierten Datei.","type":["string","null"]},"fileUlid":{"description":"Datei aus der Ablage (`/v1/platform/files`), ULID.","type":["string","null"]},"brandId":{"description":"Marke; leer ⇒ gilt für jede Marke.","type":["integer","null"]},"documentKinds":{"description":"Belegarten (`quote`, `invoice`, `order`); leere Liste ⇒ alle.","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"position":{"type":["integer","null"]}}},"DocumentStandingAttachment-document_attachment.write.jsonMergePatch":{"type":"object","description":"Feste Beleg-Beilagen (Doc 40): welche Datei automatisch an welche Belegart welcher Marke gehängt\nwird. Stammdaten der Einstellungen — Recht wie bei den Belegvorlagen.","properties":{"label":{"description":"Anzeigename; leer ⇒ Dateiname der referenzierten Datei.","type":["string","null"]},"fileUlid":{"description":"Datei aus der Ablage (`/v1/platform/files`), ULID.","type":["string","null"]},"brandId":{"description":"Marke; leer ⇒ gilt für jede Marke.","type":["integer","null"]},"documentKinds":{"description":"Belegarten (`quote`, `invoice`, `order`); leere Liste ⇒ alle.","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"position":{"type":["integer","null"]}}},"DocumentStandingAttachment.jsonld-document_attachment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"label":{"description":"Anzeigename; leer ⇒ Dateiname der referenzierten Datei.","type":["string","null"]},"fileUlid":{"description":"Datei aus der Ablage (`/v1/platform/files`), ULID.","type":["string","null"]},"fileName":{"description":"Dateiname der referenzierten Datei — read-only, für die Anzeige.","type":["string","null"]},"brandId":{"description":"Marke; leer ⇒ gilt für jede Marke.","type":["integer","null"]},"documentKinds":{"description":"Belegarten (`quote`, `invoice`, `order`); leere Liste ⇒ alle.","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"position":{"type":["integer","null"]}}}],"description":"Feste Beleg-Beilagen (Doc 40): welche Datei automatisch an welche Belegart welcher Marke gehängt\nwird. Stammdaten der Einstellungen — Recht wie bei den Belegvorlagen."},"DocumentTemplate-document_template.read":{"type":"object","description":"Belegvorlagen-Verwaltung (15 §7, ENT-ERP-DOCTPL-01): je Marke × Belegtyp × Sprache,\nEditor-Modi visual/twig, 1..n Logos, optionales Briefbogen-PDF — ohne Deploy. Nur\nregistrierte Belegtypen (fail-closed). Filter: docType, brandId.","properties":{"ulid":{"type":["string","null"]},"docType":{"description":"Registrierter Belegtyp (Variablen-Registry) — nach Anlage unveränderlich.","type":["string","null"]},"docTypeLabel":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"locale":{"maxLength":10,"description":"Sprache dieser Vorlage — gegen die Laufzeit-Registry validiert (wie Marke/Partner), damit ein\ninstalliertes Sprachpaket pflegbar ist und kein Tippfehler eine nie auflösbare Vorlage anlegt\n({@see \\App\\Platform\\Commerce\\Document\\DocumentTemplateResolver} sucht exakt nach diesem Code).","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"editorMode":{"enum":["visual","twig"],"type":["string","null"]},"body":{"description":"Twig-Quelltext (Zielrepräsentation; im visual-Modus aus den Blöcken kompiliert, read-only).","type":["string","null"]},"blocks":{"description":"Visual-Editor-Blockstruktur","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"backgroundPdfFileId":{"description":"Briefbogen-PDF (File-Modul, mime application/pdf) als Seiten-Hintergrund.","type":["integer","null"]},"logos":{"description":"Logo-Platzierungen","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"DocumentTemplate-document_template.write":{"type":"object","description":"Belegvorlagen-Verwaltung (15 §7, ENT-ERP-DOCTPL-01): je Marke × Belegtyp × Sprache,\nEditor-Modi visual/twig, 1..n Logos, optionales Briefbogen-PDF — ohne Deploy. Nur\nregistrierte Belegtypen (fail-closed). Filter: docType, brandId.","properties":{"docType":{"description":"Registrierter Belegtyp (Variablen-Registry) — nach Anlage unveränderlich.","type":["string","null"]},"brandId":{"type":["integer","null"]},"locale":{"maxLength":10,"description":"Sprache dieser Vorlage — gegen die Laufzeit-Registry validiert (wie Marke/Partner), damit ein\ninstalliertes Sprachpaket pflegbar ist und kein Tippfehler eine nie auflösbare Vorlage anlegt\n({@see \\App\\Platform\\Commerce\\Document\\DocumentTemplateResolver} sucht exakt nach diesem Code).","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"editorMode":{"enum":["visual","twig"],"type":["string","null"]},"body":{"description":"Twig-Quelltext (Zielrepräsentation; im visual-Modus aus den Blöcken kompiliert, read-only).","type":["string","null"]},"blocks":{"description":"Visual-Editor-Blockstruktur","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"backgroundPdfFileId":{"description":"Briefbogen-PDF (File-Modul, mime application/pdf) als Seiten-Hintergrund.","type":["integer","null"]},"logos":{"description":"Logo-Platzierungen","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"DocumentTemplate-document_template.write.jsonMergePatch":{"type":"object","description":"Belegvorlagen-Verwaltung (15 §7, ENT-ERP-DOCTPL-01): je Marke × Belegtyp × Sprache,\nEditor-Modi visual/twig, 1..n Logos, optionales Briefbogen-PDF — ohne Deploy. Nur\nregistrierte Belegtypen (fail-closed). Filter: docType, brandId.","properties":{"docType":{"description":"Registrierter Belegtyp (Variablen-Registry) — nach Anlage unveränderlich.","type":["string","null"]},"brandId":{"type":["integer","null"]},"locale":{"maxLength":10,"description":"Sprache dieser Vorlage — gegen die Laufzeit-Registry validiert (wie Marke/Partner), damit ein\ninstalliertes Sprachpaket pflegbar ist und kein Tippfehler eine nie auflösbare Vorlage anlegt\n({@see \\App\\Platform\\Commerce\\Document\\DocumentTemplateResolver} sucht exakt nach diesem Code).","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"editorMode":{"enum":["visual","twig"],"type":["string","null"]},"body":{"description":"Twig-Quelltext (Zielrepräsentation; im visual-Modus aus den Blöcken kompiliert, read-only).","type":["string","null"]},"blocks":{"description":"Visual-Editor-Blockstruktur","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"backgroundPdfFileId":{"description":"Briefbogen-PDF (File-Modul, mime application/pdf) als Seiten-Hintergrund.","type":["integer","null"]},"logos":{"description":"Logo-Platzierungen","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"DocumentTemplate.jsonld-document_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"docType":{"description":"Registrierter Belegtyp (Variablen-Registry) — nach Anlage unveränderlich.","type":["string","null"]},"docTypeLabel":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"locale":{"maxLength":10,"description":"Sprache dieser Vorlage — gegen die Laufzeit-Registry validiert (wie Marke/Partner), damit ein\ninstalliertes Sprachpaket pflegbar ist und kein Tippfehler eine nie auflösbare Vorlage anlegt\n({@see \\App\\Platform\\Commerce\\Document\\DocumentTemplateResolver} sucht exakt nach diesem Code).","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"editorMode":{"enum":["visual","twig"],"type":["string","null"]},"body":{"description":"Twig-Quelltext (Zielrepräsentation; im visual-Modus aus den Blöcken kompiliert, read-only).","type":["string","null"]},"blocks":{"description":"Visual-Editor-Blockstruktur","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"backgroundPdfFileId":{"description":"Briefbogen-PDF (File-Modul, mime application/pdf) als Seiten-Hintergrund.","type":["integer","null"]},"logos":{"description":"Logo-Platzierungen","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Belegvorlagen-Verwaltung (15 §7, ENT-ERP-DOCTPL-01): je Marke × Belegtyp × Sprache,\nEditor-Modi visual/twig, 1..n Logos, optionales Briefbogen-PDF — ohne Deploy. Nur\nregistrierte Belegtypen (fail-closed). Filter: docType, brandId."},"DocumentVariable-document_variable.read":{"type":"object","description":"Read-only-Variablen-Katalog (15 §7): Variablen (dot-Pfad, Label, Beispielwert) je\nBelegtyp, aggregiert aus DocumentVariableProvider-Beiträgen aktiver Module. Ohne\ndocType-Filter: registrierte Belegtypen (key = docType, label = Typ-Label).","properties":{"id":{"type":["string","null"]},"docType":{"type":["string","null"]},"key":{"type":["string","null"]},"label":{"type":["string","null"]},"example":{"type":["string","null"]}}},"DocumentVariable.jsonld-document_variable.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"docType":{"type":["string","null"]},"key":{"type":["string","null"]},"label":{"type":["string","null"]},"example":{"type":["string","null"]}}}],"description":"Read-only-Variablen-Katalog (15 §7): Variablen (dot-Pfad, Label, Beispielwert) je\nBelegtyp, aggregiert aus DocumentVariableProvider-Beiträgen aktiver Module. Ohne\ndocType-Filter: registrierte Belegtypen (key = docType, label = Typ-Label)."},"DropshipDispatch-purchasing_dispatch.read":{"type":"object","description":"Versandmeldungen im Streckengeschäft (Doc 25 AP 7.6).\n\n**Der Filter `sourceSalesOrderId` ist der eigentliche Zweck der Liste:** die Frage, die im Alltag\ngestellt wird, lautet nicht „was hat Lieferant X gemeldet\", sondern „wo ist das Paket meines\n * Kunden\". Ohne diesen Filter müsste jede Auftragsansicht erst alle Strecken-Bestellungen suchen.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderUlid":{"type":["string","null"]},"goodsOrderNumber":{"type":["string","null"]},"sourceSalesOrderId":{"type":["integer","null"]},"trackingNumber":{"type":["string","null"]},"carrier":{"type":["string","null"]},"trackingUrl":{"type":["string","null"]},"shippedAt":{"type":["string","null"]},"note":{"type":["string","null"]},"items":{"description":"Gemeldete Positionen: `{itemUlid, orderItemId, productId, qty}`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"DropshipDispatch-purchasing_dispatch.write":{"type":"object","description":"Versandmeldungen im Streckengeschäft (Doc 25 AP 7.6).\n\n**Der Filter `sourceSalesOrderId` ist der eigentliche Zweck der Liste:** die Frage, die im Alltag\ngestellt wird, lautet nicht „was hat Lieferant X gemeldet\", sondern „wo ist das Paket meines\n * Kunden\". Ohne diesen Filter müsste jede Auftragsansicht erst alle Strecken-Bestellungen suchen."},"DropshipDispatch.jsonld-purchasing_dispatch.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderUlid":{"type":["string","null"]},"goodsOrderNumber":{"type":["string","null"]},"sourceSalesOrderId":{"type":["integer","null"]},"trackingNumber":{"type":["string","null"]},"carrier":{"type":["string","null"]},"trackingUrl":{"type":["string","null"]},"shippedAt":{"type":["string","null"]},"note":{"type":["string","null"]},"items":{"description":"Gemeldete Positionen: `{itemUlid, orderItemId, productId, qty}`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Versandmeldungen im Streckengeschäft (Doc 25 AP 7.6).\n\n**Der Filter `sourceSalesOrderId` ist der eigentliche Zweck der Liste:** die Frage, die im Alltag\ngestellt wird, lautet nicht „was hat Lieferant X gemeldet\", sondern „wo ist das Paket meines\n * Kunden\". Ohne diesen Filter müsste jede Auftragsansicht erst alle Strecken-Bestellungen suchen."},"DsgvoDataRequest-dsgvo_request.read":{"type":"object","description":"Betroffenen-Anfrage nach DSGVO (Art. 15/16/17).\n- `/export`: Auskunfts-JSON; `/erase`: Anonymisierung/Löschung; Status open → processing → done.\n- Schlüssel = `ulid`. Lesen: `platform.dsgvo.view`; Mutation/Export/Löschung: `platform.dsgvo.manage`\n  (objektbezogen über {@see \\App\\Platform\\DSGVO\\Security\\DsgvoRequestVoter}).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"type":{"description":"access | rectification | deletion ({@see \\App\\Platform\\DSGVO\\Entity\\DataRequest}::TYPE_*).","type":["string","null"]},"status":{"description":"open | processing | done | rejected (read-only; Übergänge via Aktionen).","type":["string","null"]},"subjectEmail":{"type":["string","null"]},"subjectName":{"type":["string","null"]},"notes":{"type":["string","null"]},"exportPath":{"type":["string","null"]},"export":{"description":"Eingebettetes Auskunfts-JSON (nur bei /export im Response gesetzt).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"eraseResult":{"description":"Ergebnis-Statistik der Löschung (nur bei /erase gesetzt).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"rectifyResult":{"description":"Ergebnis der Berichtigung (nur bei /rectify gesetzt): `applied` = angewandte Felder,\n`updated` = Trefferzahl je Typ (Kern-Stammdaten UND plugin-eigene Bestände),\n`failed` = ausgefallene Modul-/Plugin-Beiträge (leer = vollständig berichtigt, `R41-62`).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"dueAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"DsgvoDataRequest-dsgvo_request.rectify":{"type":"object","description":"Betroffenen-Anfrage nach DSGVO (Art. 15/16/17).\n- `/export`: Auskunfts-JSON; `/erase`: Anonymisierung/Löschung; Status open → processing → done.\n- Schlüssel = `ulid`. Lesen: `platform.dsgvo.view`; Mutation/Export/Löschung: `platform.dsgvo.manage`\n  (objektbezogen über {@see \\App\\Platform\\DSGVO\\Security\\DsgvoRequestVoter}).","properties":{"corrections":{"description":"Korrektur-Felder für /rectify (Art. 16) — nur im rectify-Request.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"DsgvoDataRequest-dsgvo_request.write":{"type":"object","description":"Betroffenen-Anfrage nach DSGVO (Art. 15/16/17).\n- `/export`: Auskunfts-JSON; `/erase`: Anonymisierung/Löschung; Status open → processing → done.\n- Schlüssel = `ulid`. Lesen: `platform.dsgvo.view`; Mutation/Export/Löschung: `platform.dsgvo.manage`\n  (objektbezogen über {@see \\App\\Platform\\DSGVO\\Security\\DsgvoRequestVoter}).","properties":{"type":{"description":"access | rectification | deletion ({@see \\App\\Platform\\DSGVO\\Entity\\DataRequest}::TYPE_*).","type":["string","null"]},"subjectEmail":{"type":["string","null"]},"subjectName":{"type":["string","null"]},"notes":{"type":["string","null"]}}},"DsgvoDataRequest-dsgvo_request.write.jsonMergePatch":{"type":"object","description":"Betroffenen-Anfrage nach DSGVO (Art. 15/16/17).\n- `/export`: Auskunfts-JSON; `/erase`: Anonymisierung/Löschung; Status open → processing → done.\n- Schlüssel = `ulid`. Lesen: `platform.dsgvo.view`; Mutation/Export/Löschung: `platform.dsgvo.manage`\n  (objektbezogen über {@see \\App\\Platform\\DSGVO\\Security\\DsgvoRequestVoter}).","properties":{"type":{"description":"access | rectification | deletion ({@see \\App\\Platform\\DSGVO\\Entity\\DataRequest}::TYPE_*).","type":["string","null"]},"subjectEmail":{"type":["string","null"]},"subjectName":{"type":["string","null"]},"notes":{"type":["string","null"]}}},"DsgvoDataRequest.jsonld-dsgvo_request.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"type":{"description":"access | rectification | deletion ({@see \\App\\Platform\\DSGVO\\Entity\\DataRequest}::TYPE_*).","type":["string","null"]},"status":{"description":"open | processing | done | rejected (read-only; Übergänge via Aktionen).","type":["string","null"]},"subjectEmail":{"type":["string","null"]},"subjectName":{"type":["string","null"]},"notes":{"type":["string","null"]},"exportPath":{"type":["string","null"]},"export":{"description":"Eingebettetes Auskunfts-JSON (nur bei /export im Response gesetzt).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"eraseResult":{"description":"Ergebnis-Statistik der Löschung (nur bei /erase gesetzt).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"rectifyResult":{"description":"Ergebnis der Berichtigung (nur bei /rectify gesetzt): `applied` = angewandte Felder,\n`updated` = Trefferzahl je Typ (Kern-Stammdaten UND plugin-eigene Bestände),\n`failed` = ausgefallene Modul-/Plugin-Beiträge (leer = vollständig berichtigt, `R41-62`).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"dueAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Betroffenen-Anfrage nach DSGVO (Art. 15/16/17).\n- `/export`: Auskunfts-JSON; `/erase`: Anonymisierung/Löschung; Status open → processing → done.\n- Schlüssel = `ulid`. Lesen: `platform.dsgvo.view`; Mutation/Export/Löschung: `platform.dsgvo.manage`\n  (objektbezogen über {@see \\App\\Platform\\DSGVO\\Security\\DsgvoRequestVoter})."},"DsgvoRetentionEntityTypeCatalog-dsgvo_retention_types.read":{"type":"object","description":"Read-only Katalog der ANBIETBAREN `entityType`-Werte für {@see RetentionPolicyResource}.\n- Core-Typen ({@see \\App\\Platform\\DSGVO\\Entity\\RetentionPolicy::ENTITY_TYPES}) + Typen aktiver\n  Plugin-`RetentionPolicyProvider` (Enablement-gefiltert, Muster AutomationCatalog).\n- Bewusst STRENGER als die Schreib-Validierung: {@see \\App\\Platform\\DSGVO\\Service\\RetentionEntityTypeRegistry}\n  validiert enablement-AGNOSTISCH (Policies deaktivierter Module bleiben pflegbar); dieser\n  Katalog ist nur die Angebots-Fläche für UI/MCP.\n- Labels liefert die SPA (`dsgvoAdmin.retention.entity<PascalCase(typ)>`, Plugin-Labels via\n  `locales`-Manifest; unbekannte Schlüssel zeigen den Roh-Typ).","properties":{"id":{"description":"Singleton-Pseudo-Identifier (es gibt genau eine Katalog-Zeile).","default":"default","type":"string"},"types":{"description":"Anbietbare `entityType`-Werte: Core-Typen in Katalog-Reihenfolge, danach die Typen aktiver\nPlugins (dedupliziert, deterministisch).","type":"array","items":{"type":"string"}}}},"DsgvoRetentionEntityTypeCatalog.jsonld-dsgvo_retention_types.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Singleton-Pseudo-Identifier (es gibt genau eine Katalog-Zeile).","default":"default","type":"string"},"types":{"description":"Anbietbare `entityType`-Werte: Core-Typen in Katalog-Reihenfolge, danach die Typen aktiver\nPlugins (dedupliziert, deterministisch).","type":"array","items":{"type":"string"}}}}],"description":"Read-only Katalog der ANBIETBAREN `entityType`-Werte für {@see RetentionPolicyResource}.\n- Core-Typen ({@see \\App\\Platform\\DSGVO\\Entity\\RetentionPolicy::ENTITY_TYPES}) + Typen aktiver\n  Plugin-`RetentionPolicyProvider` (Enablement-gefiltert, Muster AutomationCatalog).\n- Bewusst STRENGER als die Schreib-Validierung: {@see \\App\\Platform\\DSGVO\\Service\\RetentionEntityTypeRegistry}\n  validiert enablement-AGNOSTISCH (Policies deaktivierter Module bleiben pflegbar); dieser\n  Katalog ist nur die Angebots-Fläche für UI/MCP.\n- Labels liefert die SPA (`dsgvoAdmin.retention.entity<PascalCase(typ)>`, Plugin-Labels via\n  `locales`-Manifest; unbekannte Schlüssel zeigen den Roh-Typ)."},"DsgvoRetentionPolicy-dsgvo_retention.read":{"type":"object","description":"Settings-pflegbare Aufbewahrungs-Richtlinie (00 Fundament, DSGVO Art. 17). Schlüssel = `ulid`.\nLesen erfordert `platform.dsgvo.view`, Schreiben `platform.dsgvo.manage`.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"entityType":{"description":"Ein Core-Typ ({@see RetentionPolicy::ENTITY_TYPES}) oder ein von einem Plugin-\nRetentionPolicyProvider beigetragener Typ (z. B. lead/pages_trash/sched_invitee) —\nvalidiert gegen die {@see \\App\\Platform\\DSGVO\\Service\\RetentionEntityTypeRegistry}.","type":["string","null"]},"retentionDays":{"minimum":0,"type":["integer","null"]},"action":{"enum":["anonymize","delete","seal"],"description":"anonymize | delete | seal (Verarbeitungseinschränkung; nur Customer/Contact).","type":["string","null"]},"active":{"type":["boolean","null"]},"description":{"type":["string","null"]},"lastRunAt":{"type":["string","null"]}}},"DsgvoRetentionPolicy-dsgvo_retention.write":{"type":"object","description":"Settings-pflegbare Aufbewahrungs-Richtlinie (00 Fundament, DSGVO Art. 17). Schlüssel = `ulid`.\nLesen erfordert `platform.dsgvo.view`, Schreiben `platform.dsgvo.manage`.","required":["entityType","retentionDays"],"properties":{"entityType":{"description":"Ein Core-Typ ({@see RetentionPolicy::ENTITY_TYPES}) oder ein von einem Plugin-\nRetentionPolicyProvider beigetragener Typ (z. B. lead/pages_trash/sched_invitee) —\nvalidiert gegen die {@see \\App\\Platform\\DSGVO\\Service\\RetentionEntityTypeRegistry}.","type":["string","null"]},"retentionDays":{"minimum":0,"type":["integer","null"]},"action":{"enum":["anonymize","delete","seal"],"description":"anonymize | delete | seal (Verarbeitungseinschränkung; nur Customer/Contact).","type":["string","null"]},"active":{"type":["boolean","null"]},"description":{"type":["string","null"]}}},"DsgvoRetentionPolicy-dsgvo_retention.write.jsonMergePatch":{"type":"object","description":"Settings-pflegbare Aufbewahrungs-Richtlinie (00 Fundament, DSGVO Art. 17). Schlüssel = `ulid`.\nLesen erfordert `platform.dsgvo.view`, Schreiben `platform.dsgvo.manage`.","properties":{"entityType":{"description":"Ein Core-Typ ({@see RetentionPolicy::ENTITY_TYPES}) oder ein von einem Plugin-\nRetentionPolicyProvider beigetragener Typ (z. B. lead/pages_trash/sched_invitee) —\nvalidiert gegen die {@see \\App\\Platform\\DSGVO\\Service\\RetentionEntityTypeRegistry}.","type":["string","null"]},"retentionDays":{"minimum":0,"type":["integer","null"]},"action":{"enum":["anonymize","delete","seal"],"description":"anonymize | delete | seal (Verarbeitungseinschränkung; nur Customer/Contact).","type":["string","null"]},"active":{"type":["boolean","null"]},"description":{"type":["string","null"]}}},"DsgvoRetentionPolicy.jsonld-dsgvo_retention.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"entityType":{"description":"Ein Core-Typ ({@see RetentionPolicy::ENTITY_TYPES}) oder ein von einem Plugin-\nRetentionPolicyProvider beigetragener Typ (z. B. lead/pages_trash/sched_invitee) —\nvalidiert gegen die {@see \\App\\Platform\\DSGVO\\Service\\RetentionEntityTypeRegistry}.","type":["string","null"]},"retentionDays":{"minimum":0,"type":["integer","null"]},"action":{"enum":["anonymize","delete","seal"],"description":"anonymize | delete | seal (Verarbeitungseinschränkung; nur Customer/Contact).","type":["string","null"]},"active":{"type":["boolean","null"]},"description":{"type":["string","null"]},"lastRunAt":{"type":["string","null"]}}}],"description":"Settings-pflegbare Aufbewahrungs-Richtlinie (00 Fundament, DSGVO Art. 17). Schlüssel = `ulid`.\nLesen erfordert `platform.dsgvo.view`, Schreiben `platform.dsgvo.manage`."},"DunningLevel-dunning_level.read":{"type":"object","description":"Mahnstufen-Konfiguration (04-21 §3/§7): CRUD je Marke (brandId NULL = markenübergreifender Fallback).\nEindeutig je (brandId, level); Mahnlauf ({@see \\Octi\\Plugin\\Invoicing\\Service\\DunningService}) eskaliert stufengerecht.","properties":{"ulid":{"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"level":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"label":{"maxLength":100,"type":["string","null"]},"daysAfterDue":{"minimum":0,"description":"Tage nach Fälligkeit, ab denen diese Stufe greift.","type":["integer","null"]},"feeAmount":{"minimum":0,"description":"Mahngebühr in Cent der Buchwährung (EUR); der Mahnlauf rechnet sie in die Belegwährung um.","type":["integer","null"]},"interestPercent":{"description":"Verzugszins in Prozent auf den offenen Betrag (z. B. \"5.00\").","type":["string","null"]},"active":{"type":["boolean","null"]}}},"DunningLevel-dunning_level.write":{"type":"object","description":"Mahnstufen-Konfiguration (04-21 §3/§7): CRUD je Marke (brandId NULL = markenübergreifender Fallback).\nEindeutig je (brandId, level); Mahnlauf ({@see \\Octi\\Plugin\\Invoicing\\Service\\DunningService}) eskaliert stufengerecht.","properties":{"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"level":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"label":{"maxLength":100,"type":["string","null"]},"daysAfterDue":{"minimum":0,"description":"Tage nach Fälligkeit, ab denen diese Stufe greift.","type":["integer","null"]},"feeAmount":{"minimum":0,"description":"Mahngebühr in Cent der Buchwährung (EUR); der Mahnlauf rechnet sie in die Belegwährung um.","type":["integer","null"]},"interestPercent":{"description":"Verzugszins in Prozent auf den offenen Betrag (z. B. \"5.00\").","type":["string","null"]},"active":{"type":["boolean","null"]}}},"DunningLevel-dunning_level.write.jsonMergePatch":{"type":"object","description":"Mahnstufen-Konfiguration (04-21 §3/§7): CRUD je Marke (brandId NULL = markenübergreifender Fallback).\nEindeutig je (brandId, level); Mahnlauf ({@see \\Octi\\Plugin\\Invoicing\\Service\\DunningService}) eskaliert stufengerecht.","properties":{"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"level":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"label":{"maxLength":100,"type":["string","null"]},"daysAfterDue":{"minimum":0,"description":"Tage nach Fälligkeit, ab denen diese Stufe greift.","type":["integer","null"]},"feeAmount":{"minimum":0,"description":"Mahngebühr in Cent der Buchwährung (EUR); der Mahnlauf rechnet sie in die Belegwährung um.","type":["integer","null"]},"interestPercent":{"description":"Verzugszins in Prozent auf den offenen Betrag (z. B. \"5.00\").","type":["string","null"]},"active":{"type":["boolean","null"]}}},"DunningLevel.jsonld-dunning_level.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"level":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"label":{"maxLength":100,"type":["string","null"]},"daysAfterDue":{"minimum":0,"description":"Tage nach Fälligkeit, ab denen diese Stufe greift.","type":["integer","null"]},"feeAmount":{"minimum":0,"description":"Mahngebühr in Cent der Buchwährung (EUR); der Mahnlauf rechnet sie in die Belegwährung um.","type":["integer","null"]},"interestPercent":{"description":"Verzugszins in Prozent auf den offenen Betrag (z. B. \"5.00\").","type":["string","null"]},"active":{"type":["boolean","null"]}}}],"description":"Mahnstufen-Konfiguration (04-21 §3/§7): CRUD je Marke (brandId NULL = markenübergreifender Fallback).\nEindeutig je (brandId, level); Mahnlauf ({@see \\Octi\\Plugin\\Invoicing\\Service\\DunningService}) eskaliert stufengerecht."},"Employee-employee.read":{"type":"object","description":"Mitarbeiter-Resource (04-08 §4, API-First) — SSoT für „wer ist verfügbar, kann was, kostet wie viel\".\n- CRUD + Lebenszyklus (Eintritt/Austritt/aktiv/inaktiv) + datierte Kostensatz-Pflege + Skill-Pflege\n- Verschlüsselte Kontaktablage + Anstoß der Onboarding-Checkliste\n- Kostensatz/Kontaktdaten/Dokumente nur mit Spezialrecht sichtbar.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische interne ID — für markenübergreifende Verknüpfungen (z.B. Personaldokumente, Abwesenheiten).","type":["integer","null"]},"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"displayName":{"type":["string","null"]},"personnelNumber":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"jobTitle":{"type":["string","null"]},"signatureHtml":{"maxLength":50000,"description":"Persoenlicher Signaturblock (HTML) fuer Aussenkommunikation — aufgeloest als\n{@code {{ bearbeiter_signatur }}} / `agent_signature`.","type":["string","null"]},"userUlid":{"maxLength":26,"description":"Verknüpftes Benutzerkonto (Login), ULID. Setzen/Ändern/Lösen (null) erfordert\n`platform.user.manage`; ein Konto nur einem Mitarbeiter zuordenbar.","type":["string","null"]},"userEmail":{"description":"Read-only Anzeige des verknüpften Kontos (Login-E-Mail).","type":["string","null"]},"userDisplayName":{"description":"Read-only Anzeige des verknüpften Kontos (Anzeigename).","type":["string","null"]},"employmentType":{"enum":["internal","freelancer"],"description":"internal | freelancer.","type":["string","null"]},"contractType":{"type":["string","null"]},"status":{"type":["string","null"]},"weeklyHours":{"type":["string","null"]},"workSchedule":{"type":["object","null"],"additionalProperties":{"type":"number"}},"hiredAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"terminatedAt":{"type":["string","null"]},"probationUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"vacationEntitlementDays":{"type":["string","null"]},"vacationAccountEnabled":{"type":["boolean","null"]},"timezone":{"type":["string","null"]},"holidayRegion":{"type":["string","null"]},"supervisorId":{"type":["integer","null"]},"brandScope":{"type":["array","null"],"items":{"type":"integer"}},"costRateAmount":{"description":"Nur mit hr.employee.view_cost sichtbar (Cent).","type":["integer","null"]},"costRateValidFrom":{"type":["string","null"]},"skills":{"description":"Skills (Item-Detail): list von {code, name, level, primary}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"currentBalance":{"description":"Aktuelles Urlaubskonto (Item-Detail).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"privateContact":{"description":"Verschlüsselte Kontaktdaten — nur mit Spezialrecht (Item-Detail).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"privateContactError":{"description":"TRUE = Kontaktdaten nicht entschlüsselbar (Schlüssel-/Datenproblem, ENT-ARCH-CRYPTO-01) — unterscheidbar von NULL („keine Daten\").","type":["boolean","null"]},"checklists":{"description":"On-/Offboarding-Checklisten (Item-Detail).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Employee-employee.write":{"type":"object","description":"Mitarbeiter-Resource (04-08 §4, API-First) — SSoT für „wer ist verfügbar, kann was, kostet wie viel\".\n- CRUD + Lebenszyklus (Eintritt/Austritt/aktiv/inaktiv) + datierte Kostensatz-Pflege + Skill-Pflege\n- Verschlüsselte Kontaktablage + Anstoß der Onboarding-Checkliste\n- Kostensatz/Kontaktdaten/Dokumente nur mit Spezialrecht sichtbar.","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"displayName":{"type":["string","null"]},"personnelNumber":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"jobTitle":{"type":["string","null"]},"signatureHtml":{"maxLength":50000,"description":"Persoenlicher Signaturblock (HTML) fuer Aussenkommunikation — aufgeloest als\n{@code {{ bearbeiter_signatur }}} / `agent_signature`.","type":["string","null"]},"userUlid":{"maxLength":26,"description":"Verknüpftes Benutzerkonto (Login), ULID. Setzen/Ändern/Lösen (null) erfordert\n`platform.user.manage`; ein Konto nur einem Mitarbeiter zuordenbar.","type":["string","null"]},"employmentType":{"enum":["internal","freelancer"],"description":"internal | freelancer.","type":["string","null"]},"contractType":{"type":["string","null"]},"weeklyHours":{"type":["string","null"]},"workSchedule":{"type":["object","null"],"additionalProperties":{"type":"number"}},"hiredAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"probationUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"vacationEntitlementDays":{"type":["string","null"]},"vacationAccountEnabled":{"type":["boolean","null"]},"timezone":{"type":["string","null"]},"holidayRegion":{"type":["string","null"]},"supervisorId":{"type":["integer","null"]},"brandScope":{"type":["array","null"],"items":{"type":"integer"}},"terminatedAtInput":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"costRateAmountInput":{"minimum":0,"description":"Interner Kostensatz in Cent — nie negativ (sonst invertiert sich die Margen-Rechnung).","type":["integer","null"]},"costRateValidFromInput":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"costRateNote":{"type":["string","null"]},"skillCode":{"type":["string","null"]},"skillLevel":{"type":["integer","null"]},"skillPrimary":{"type":["boolean","null"]},"skillCertifiedAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"skillExpiresAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"privateContactInput":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"onboardingMode":{"type":["string","null"]}}},"Employee-employee.write.jsonMergePatch":{"type":"object","description":"Mitarbeiter-Resource (04-08 §4, API-First) — SSoT für „wer ist verfügbar, kann was, kostet wie viel\".\n- CRUD + Lebenszyklus (Eintritt/Austritt/aktiv/inaktiv) + datierte Kostensatz-Pflege + Skill-Pflege\n- Verschlüsselte Kontaktablage + Anstoß der Onboarding-Checkliste\n- Kostensatz/Kontaktdaten/Dokumente nur mit Spezialrecht sichtbar.","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"displayName":{"type":["string","null"]},"personnelNumber":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"jobTitle":{"type":["string","null"]},"signatureHtml":{"maxLength":50000,"description":"Persoenlicher Signaturblock (HTML) fuer Aussenkommunikation — aufgeloest als\n{@code {{ bearbeiter_signatur }}} / `agent_signature`.","type":["string","null"]},"userUlid":{"maxLength":26,"description":"Verknüpftes Benutzerkonto (Login), ULID. Setzen/Ändern/Lösen (null) erfordert\n`platform.user.manage`; ein Konto nur einem Mitarbeiter zuordenbar.","type":["string","null"]},"employmentType":{"enum":["internal","freelancer"],"description":"internal | freelancer.","type":["string","null"]},"contractType":{"type":["string","null"]},"weeklyHours":{"type":["string","null"]},"workSchedule":{"type":["object","null"],"additionalProperties":{"type":"number"}},"hiredAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"probationUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"vacationEntitlementDays":{"type":["string","null"]},"vacationAccountEnabled":{"type":["boolean","null"]},"timezone":{"type":["string","null"]},"holidayRegion":{"type":["string","null"]},"supervisorId":{"type":["integer","null"]},"brandScope":{"type":["array","null"],"items":{"type":"integer"}},"terminatedAtInput":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"costRateAmountInput":{"minimum":0,"description":"Interner Kostensatz in Cent — nie negativ (sonst invertiert sich die Margen-Rechnung).","type":["integer","null"]},"costRateValidFromInput":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"costRateNote":{"type":["string","null"]},"skillCode":{"type":["string","null"]},"skillLevel":{"type":["integer","null"]},"skillPrimary":{"type":["boolean","null"]},"skillCertifiedAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"skillExpiresAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"privateContactInput":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"onboardingMode":{"type":["string","null"]}}},"Employee.jsonld-employee.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische interne ID — für markenübergreifende Verknüpfungen (z.B. Personaldokumente, Abwesenheiten).","type":["integer","null"]},"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"displayName":{"type":["string","null"]},"personnelNumber":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"jobTitle":{"type":["string","null"]},"signatureHtml":{"maxLength":50000,"description":"Persoenlicher Signaturblock (HTML) fuer Aussenkommunikation — aufgeloest als\n{@code {{ bearbeiter_signatur }}} / `agent_signature`.","type":["string","null"]},"userUlid":{"maxLength":26,"description":"Verknüpftes Benutzerkonto (Login), ULID. Setzen/Ändern/Lösen (null) erfordert\n`platform.user.manage`; ein Konto nur einem Mitarbeiter zuordenbar.","type":["string","null"]},"userEmail":{"description":"Read-only Anzeige des verknüpften Kontos (Login-E-Mail).","type":["string","null"]},"userDisplayName":{"description":"Read-only Anzeige des verknüpften Kontos (Anzeigename).","type":["string","null"]},"employmentType":{"enum":["internal","freelancer"],"description":"internal | freelancer.","type":["string","null"]},"contractType":{"type":["string","null"]},"status":{"type":["string","null"]},"weeklyHours":{"type":["string","null"]},"workSchedule":{"type":["object","null"],"additionalProperties":{"type":"number"}},"hiredAt":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"terminatedAt":{"type":["string","null"]},"probationUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"vacationEntitlementDays":{"type":["string","null"]},"vacationAccountEnabled":{"type":["boolean","null"]},"timezone":{"type":["string","null"]},"holidayRegion":{"type":["string","null"]},"supervisorId":{"type":["integer","null"]},"brandScope":{"type":["array","null"],"items":{"type":"integer"}},"costRateAmount":{"description":"Nur mit hr.employee.view_cost sichtbar (Cent).","type":["integer","null"]},"costRateValidFrom":{"type":["string","null"]},"skills":{"description":"Skills (Item-Detail): list von {code, name, level, primary}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"currentBalance":{"description":"Aktuelles Urlaubskonto (Item-Detail).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"privateContact":{"description":"Verschlüsselte Kontaktdaten — nur mit Spezialrecht (Item-Detail).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"privateContactError":{"description":"TRUE = Kontaktdaten nicht entschlüsselbar (Schlüssel-/Datenproblem, ENT-ARCH-CRYPTO-01) — unterscheidbar von NULL („keine Daten\").","type":["boolean","null"]},"checklists":{"description":"On-/Offboarding-Checklisten (Item-Detail).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Mitarbeiter-Resource (04-08 §4, API-First) — SSoT für „wer ist verfügbar, kann was, kostet wie viel\".\n- CRUD + Lebenszyklus (Eintritt/Austritt/aktiv/inaktiv) + datierte Kostensatz-Pflege + Skill-Pflege\n- Verschlüsselte Kontaktablage + Anstoß der Onboarding-Checkliste\n- Kostensatz/Kontaktdaten/Dokumente nur mit Spezialrecht sichtbar."},"EmployeeCalendarConnection-emp_cal.read":{"type":"object","description":"HR-Verwaltungssicht auf cal_connection-Zeilen des Calendar-Kernels (ownerType=employee, 04-08 §8).\nDieselben Verbindungen wie OctiScheduling-OAuth-Self-Service; POST legt Google-Verbindung manuell an.\nrefresh_token write-only, verschlüsselt in IntegrationCredentialStore. /sync = sofortiger Kernel-Abgleich.","properties":{"ulid":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"employeeUlid":{"type":["string","null"]},"employeeName":{"type":["string","null"]},"employeeEmail":{"type":["string","null"]},"provider":{"description":"Anbieter der Kernel-Verbindung (google|microsoft|caldav|ics); manuell angelegte sind google.","type":["string","null"]},"calendarId":{"type":["string","null"]},"syncOutbound":{"default":true,"type":"boolean"},"syncInbound":{"default":true,"type":"boolean"},"active":{"default":true,"type":"boolean"},"hasRefreshToken":{"default":false,"type":"boolean"},"lastSyncedAt":{"type":["string","null"],"format":"date-time"},"inboundEventCount":{"default":0,"type":"integer"}},"required":["employeeUlid","calendarId"]},"EmployeeCalendarConnection-emp_cal.write":{"type":"object","description":"HR-Verwaltungssicht auf cal_connection-Zeilen des Calendar-Kernels (ownerType=employee, 04-08 §8).\nDieselben Verbindungen wie OctiScheduling-OAuth-Self-Service; POST legt Google-Verbindung manuell an.\nrefresh_token write-only, verschlüsselt in IntegrationCredentialStore. /sync = sofortiger Kernel-Abgleich.","required":["employeeUlid","calendarId"],"properties":{"employeeUlid":{"type":["string","null"]},"calendarId":{"type":["string","null"]},"syncOutbound":{"default":true,"type":"boolean"},"syncInbound":{"default":true,"type":"boolean"},"active":{"default":true,"type":"boolean"},"refreshToken":{"description":"Write-only OAuth refresh_token, verschlüsselt gespeichert, nie ausgelesen.","type":["string","null"]}}},"EmployeeCalendarConnection-emp_cal.write.jsonMergePatch":{"type":"object","description":"HR-Verwaltungssicht auf cal_connection-Zeilen des Calendar-Kernels (ownerType=employee, 04-08 §8).\nDieselben Verbindungen wie OctiScheduling-OAuth-Self-Service; POST legt Google-Verbindung manuell an.\nrefresh_token write-only, verschlüsselt in IntegrationCredentialStore. /sync = sofortiger Kernel-Abgleich.","properties":{"employeeUlid":{"type":["string","null"]},"calendarId":{"type":["string","null"]},"syncOutbound":{"default":true,"type":"boolean"},"syncInbound":{"default":true,"type":"boolean"},"active":{"default":true,"type":"boolean"},"refreshToken":{"description":"Write-only OAuth refresh_token, verschlüsselt gespeichert, nie ausgelesen.","type":["string","null"]}}},"EmployeeCalendarConnection.jsonld-emp_cal.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"employeeUlid":{"type":["string","null"]},"employeeName":{"type":["string","null"]},"employeeEmail":{"type":["string","null"]},"provider":{"description":"Anbieter der Kernel-Verbindung (google|microsoft|caldav|ics); manuell angelegte sind google.","type":["string","null"]},"calendarId":{"type":["string","null"]},"syncOutbound":{"default":true,"type":"boolean"},"syncInbound":{"default":true,"type":"boolean"},"active":{"default":true,"type":"boolean"},"hasRefreshToken":{"default":false,"type":"boolean"},"lastSyncedAt":{"type":["string","null"],"format":"date-time"},"inboundEventCount":{"default":0,"type":"integer"}},"required":["employeeUlid","calendarId"]}],"description":"HR-Verwaltungssicht auf cal_connection-Zeilen des Calendar-Kernels (ownerType=employee, 04-08 §8).\nDieselben Verbindungen wie OctiScheduling-OAuth-Self-Service; POST legt Google-Verbindung manuell an.\nrefresh_token write-only, verschlüsselt in IntegrationCredentialStore. /sync = sofortiger Kernel-Abgleich."},"EmployeeDirectory-employee_directory.read":{"type":"object","description":"Schlankes Mitarbeiter-Verzeichnis für Picker/Namensauflösung (Employee.id → Name).\n- Pendant zu {@see \\App\\Platform\\Auth\\ApiResource\\MemberResource} (User-basiert)\n- Nötig, da employeeId-Felder (TimeEntry, TimesheetApproval) NICHT über `/members` auflösbar sind\n- Zugriff: ROLE_USER (analog `/members`) — Kollegennamen nicht sensibler als dortige Kontonamen\n- Sensible HR-Daten (Kostensatz/Vertrag/Kontakt) bleiben in {@see EmployeeResource}.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Employee.id — der ID-Raum mitarbeiterbezogener Referenzen (Zeiterfassung etc.).","type":["integer","null"]},"displayName":{"type":["string","null"]},"email":{"type":["string","null"]},"active":{"description":"true = laufendes Beschäftigungsverhältnis (aktiv/onboarding) — für Picker-Vorfilterung.","default":false,"type":"boolean"}}},"EmployeeDirectory.jsonld-employee_directory.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Employee.id — der ID-Raum mitarbeiterbezogener Referenzen (Zeiterfassung etc.).","type":["integer","null"]},"displayName":{"type":["string","null"]},"email":{"type":["string","null"]},"active":{"description":"true = laufendes Beschäftigungsverhältnis (aktiv/onboarding) — für Picker-Vorfilterung.","default":false,"type":"boolean"}}}],"description":"Schlankes Mitarbeiter-Verzeichnis für Picker/Namensauflösung (Employee.id → Name).\n- Pendant zu {@see \\App\\Platform\\Auth\\ApiResource\\MemberResource} (User-basiert)\n- Nötig, da employeeId-Felder (TimeEntry, TimesheetApproval) NICHT über `/members` auflösbar sind\n- Zugriff: ROLE_USER (analog `/members`) — Kollegennamen nicht sensibler als dortige Kontonamen\n- Sensible HR-Daten (Kostensatz/Vertrag/Kontakt) bleiben in {@see EmployeeResource}."},"Error":{"type":"object","description":"A representation of common errors.","properties":{"title":{"readOnly":true,"description":"A short, human-readable summary of the problem.","type":["string","null"]},"detail":{"readOnly":true,"description":"A human-readable explanation specific to this occurrence of the problem.","type":["string","null"]},"status":{"type":["integer","null"],"examples":[404],"default":400},"instance":{"readOnly":true,"description":"A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.","type":["string","null"]},"type":{"readOnly":true,"description":"A URI reference that identifies the problem type","type":"string"}}},"ExchangeRate-exchange_rate.read":{"type":"object","description":"Kursbuch (Doc 25 AP 10.1, Spec 04-51 §2).\n\n**Der Wert ist immer „Fremdwährungseinheiten je 1 EUR\"** — genau so, wie die EZB ihn\nveröffentlicht. Wer 1 USD = 0,92 EUR eintragen will, trägt den Kehrwert ein und bekommt einen\nBeleg, der um den Faktor 1,4 danebenliegt; deshalb steht die Richtung in jeder Beschreibung.\n\nKein Marken-Scope: Kurse sind Marktdaten, keine Firmierung — jede Marke rechnet mit denselben.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO 4217 (z. B. `USD`).","type":["string","null"]},"rateDate":{"description":"Kurstag (Y-m-d); für einen Beleg gilt der letzte Kurs an oder vor seinem Belegdatum.","type":["string","null"]},"rate":{"description":"Fremdwährungseinheiten je 1 EUR.","type":["string","null"]},"source":{"description":"`ecb` (importiert) | `manual` (von Hand gepflegt).","type":["string","null"]}}},"ExchangeRate-exchange_rate.write":{"type":"object","description":"Kursbuch (Doc 25 AP 10.1, Spec 04-51 §2).\n\n**Der Wert ist immer „Fremdwährungseinheiten je 1 EUR\"** — genau so, wie die EZB ihn\nveröffentlicht. Wer 1 USD = 0,92 EUR eintragen will, trägt den Kehrwert ein und bekommt einen\nBeleg, der um den Faktor 1,4 danebenliegt; deshalb steht die Richtung in jeder Beschreibung.\n\nKein Marken-Scope: Kurse sind Marktdaten, keine Firmierung — jede Marke rechnet mit denselben.","properties":{"currency":{"minLength":3,"maxLength":3,"description":"ISO 4217 (z. B. `USD`).","type":["string","null"]},"rateDate":{"description":"Kurstag (Y-m-d); für einen Beleg gilt der letzte Kurs an oder vor seinem Belegdatum.","type":["string","null"]},"rate":{"description":"Fremdwährungseinheiten je 1 EUR.","type":["string","null"]}}},"ExchangeRate.ExchangeRateImportResult-exchange_rate.read":{"type":"object","description":"Kursbuch (Doc 25 AP 10.1, Spec 04-51 §2).\n\n**Der Wert ist immer „Fremdwährungseinheiten je 1 EUR\"** — genau so, wie die EZB ihn\nveröffentlicht. Wer 1 USD = 0,92 EUR eintragen will, trägt den Kehrwert ein und bekommt einen\nBeleg, der um den Faktor 1,4 danebenliegt; deshalb steht die Richtung in jeder Beschreibung.\n\nKein Marken-Scope: Kurse sind Marktdaten, keine Firmierung — jede Marke rechnet mit denselben.","properties":{"rateDate":{"description":"Kurstag des Feeds (Y-m-d).","type":"string"},"imported":{"description":"Neu angelegte Kurse.","type":"integer"},"updated":{"description":"Vorhandene EZB-Kurse mit geaendertem Wert.","type":"integer"},"skipped":{"description":"Uebersprungen, weil handgepflegt — der Mensch hat das letzte Wort.","type":"integer"},"currencies":{"type":"array","items":{"type":"string"}}}},"ExchangeRate.ExchangeRateImportResult.jsonld-exchange_rate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"rateDate":{"description":"Kurstag des Feeds (Y-m-d).","type":"string"},"imported":{"description":"Neu angelegte Kurse.","type":"integer"},"updated":{"description":"Vorhandene EZB-Kurse mit geaendertem Wert.","type":"integer"},"skipped":{"description":"Uebersprungen, weil handgepflegt — der Mensch hat das letzte Wort.","type":"integer"},"currencies":{"type":"array","items":{"type":"string"}}}}],"description":"Kursbuch (Doc 25 AP 10.1, Spec 04-51 §2).\n\n**Der Wert ist immer „Fremdwährungseinheiten je 1 EUR\"** — genau so, wie die EZB ihn\nveröffentlicht. Wer 1 USD = 0,92 EUR eintragen will, trägt den Kehrwert ein und bekommt einen\nBeleg, der um den Faktor 1,4 danebenliegt; deshalb steht die Richtung in jeder Beschreibung.\n\nKein Marken-Scope: Kurse sind Marktdaten, keine Firmierung — jede Marke rechnet mit denselben."},"ExchangeRate.jsonld-exchange_rate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO 4217 (z. B. `USD`).","type":["string","null"]},"rateDate":{"description":"Kurstag (Y-m-d); für einen Beleg gilt der letzte Kurs an oder vor seinem Belegdatum.","type":["string","null"]},"rate":{"description":"Fremdwährungseinheiten je 1 EUR.","type":["string","null"]},"source":{"description":"`ecb` (importiert) | `manual` (von Hand gepflegt).","type":["string","null"]}}}],"description":"Kursbuch (Doc 25 AP 10.1, Spec 04-51 §2).\n\n**Der Wert ist immer „Fremdwährungseinheiten je 1 EUR\"** — genau so, wie die EZB ihn\nveröffentlicht. Wer 1 USD = 0,92 EUR eintragen will, trägt den Kehrwert ein und bekommt einen\nBeleg, der um den Faktor 1,4 danebenliegt; deshalb steht die Richtung in jeder Beschreibung.\n\nKein Marken-Scope: Kurse sind Marktdaten, keine Firmierung — jede Marke rechnet mit denselben."},"ExternalTimeEntry-external_time_entry.read":{"type":"object","description":"Zeiterfassung EXTERNER Mitwirkender (Doc 27 Stufe 7, E-5 · ENT-PM-PAR-13).\n\nWarum eine EIGENE Ressource statt Serialisierungsgruppen an {@see TimeEntryResource}: Sätze und\nKosten (`rateAmount`, `costRateAmount`) hängen an derselben Entität wie die Zeitdaten. „Externe\nerfassen Zeit ohne Sätze\" ist damit keine Rechte-, sondern eine Serialisierungsfrage — und eine\n * Gruppen-Konfiguration an einer geteilten Ressource vergisst man beim nächsten Feld. Hier gibt es\n * die Felder schlicht nicht; sie können nicht vergessen werden.\n *\n * Die Route liegt unter dem plugin-eigenen Segment `time` (`/v1/time/external-entries`) und nicht\n * unter einem generischen `/v1/external`: Segmente sind Eigentum, und „external\" gehoert keinem\nModul allein — es waere ein Name, den das naechste Modul genauso beanspruchen wuerde. Damit greift\nzugleich das fail-closed Modul-Gating von OctiTime.\n\nDer Schnitt ist doppelt: nur EIGENE Einträge (Employee = angemeldeter Nutzer) und nur auf\nVorgängen, die der Externen-Schnitt ohnehin freigibt\n({@see \\App\\WorkItem\\Contract\\ExternalWorkItemScopeInterface}). Für Mitarbeiter ist die Ressource\nerreichbar, aber uninteressant — sie sehen dasselbe reicher unter `/v1/time-entries`.","properties":{"ulid":{"type":["string","null"]},"workItemUlid":{"description":"Ziel-Vorgang per ULID — Externe kennen keine internen PKs.","type":["string","null"]},"workItemRef":{"type":["string","null"]},"workItemTitle":{"type":["string","null"]},"projectName":{"type":["string","null"]},"workDate":{"description":"Arbeitsdatum (YYYY-MM-DD); leer = heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"durationMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"description":{"maxLength":2000,"type":["string","null"]},"status":{"description":"Freigabe-Status (draft/submitted/approved/locked) — read-only. Der Externe sieht, ob sein\nEintrag noch änderbar ist; entscheiden tut das der Freigabe-Workflow, nicht er.","type":["string","null"]}}},"ExternalTimeEntry-external_time_entry.write":{"type":"object","description":"Zeiterfassung EXTERNER Mitwirkender (Doc 27 Stufe 7, E-5 · ENT-PM-PAR-13).\n\nWarum eine EIGENE Ressource statt Serialisierungsgruppen an {@see TimeEntryResource}: Sätze und\nKosten (`rateAmount`, `costRateAmount`) hängen an derselben Entität wie die Zeitdaten. „Externe\nerfassen Zeit ohne Sätze\" ist damit keine Rechte-, sondern eine Serialisierungsfrage — und eine\n * Gruppen-Konfiguration an einer geteilten Ressource vergisst man beim nächsten Feld. Hier gibt es\n * die Felder schlicht nicht; sie können nicht vergessen werden.\n *\n * Die Route liegt unter dem plugin-eigenen Segment `time` (`/v1/time/external-entries`) und nicht\n * unter einem generischen `/v1/external`: Segmente sind Eigentum, und „external\" gehoert keinem\nModul allein — es waere ein Name, den das naechste Modul genauso beanspruchen wuerde. Damit greift\nzugleich das fail-closed Modul-Gating von OctiTime.\n\nDer Schnitt ist doppelt: nur EIGENE Einträge (Employee = angemeldeter Nutzer) und nur auf\nVorgängen, die der Externen-Schnitt ohnehin freigibt\n({@see \\App\\WorkItem\\Contract\\ExternalWorkItemScopeInterface}). Für Mitarbeiter ist die Ressource\nerreichbar, aber uninteressant — sie sehen dasselbe reicher unter `/v1/time-entries`.","properties":{"workItemUlid":{"description":"Ziel-Vorgang per ULID — Externe kennen keine internen PKs.","type":["string","null"]},"workDate":{"description":"Arbeitsdatum (YYYY-MM-DD); leer = heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"durationMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"durationHours":{"minimum":0,"exclusiveMinimum":0,"description":"Alternative Eingabe zu {@see $durationMinutes} (S3-2); intern immer Minuten.","type":["number","null"]},"description":{"maxLength":2000,"type":["string","null"]}}},"ExternalTimeEntry-external_time_entry.write.jsonMergePatch":{"type":"object","description":"Zeiterfassung EXTERNER Mitwirkender (Doc 27 Stufe 7, E-5 · ENT-PM-PAR-13).\n\nWarum eine EIGENE Ressource statt Serialisierungsgruppen an {@see TimeEntryResource}: Sätze und\nKosten (`rateAmount`, `costRateAmount`) hängen an derselben Entität wie die Zeitdaten. „Externe\nerfassen Zeit ohne Sätze\" ist damit keine Rechte-, sondern eine Serialisierungsfrage — und eine\n * Gruppen-Konfiguration an einer geteilten Ressource vergisst man beim nächsten Feld. Hier gibt es\n * die Felder schlicht nicht; sie können nicht vergessen werden.\n *\n * Die Route liegt unter dem plugin-eigenen Segment `time` (`/v1/time/external-entries`) und nicht\n * unter einem generischen `/v1/external`: Segmente sind Eigentum, und „external\" gehoert keinem\nModul allein — es waere ein Name, den das naechste Modul genauso beanspruchen wuerde. Damit greift\nzugleich das fail-closed Modul-Gating von OctiTime.\n\nDer Schnitt ist doppelt: nur EIGENE Einträge (Employee = angemeldeter Nutzer) und nur auf\nVorgängen, die der Externen-Schnitt ohnehin freigibt\n({@see \\App\\WorkItem\\Contract\\ExternalWorkItemScopeInterface}). Für Mitarbeiter ist die Ressource\nerreichbar, aber uninteressant — sie sehen dasselbe reicher unter `/v1/time-entries`.","properties":{"workItemUlid":{"description":"Ziel-Vorgang per ULID — Externe kennen keine internen PKs.","type":["string","null"]},"workDate":{"description":"Arbeitsdatum (YYYY-MM-DD); leer = heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"durationMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"durationHours":{"minimum":0,"exclusiveMinimum":0,"description":"Alternative Eingabe zu {@see $durationMinutes} (S3-2); intern immer Minuten.","type":["number","null"]},"description":{"maxLength":2000,"type":["string","null"]}}},"ExternalTimeEntry.jsonld-external_time_entry.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"workItemUlid":{"description":"Ziel-Vorgang per ULID — Externe kennen keine internen PKs.","type":["string","null"]},"workItemRef":{"type":["string","null"]},"workItemTitle":{"type":["string","null"]},"projectName":{"type":["string","null"]},"workDate":{"description":"Arbeitsdatum (YYYY-MM-DD); leer = heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"durationMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"description":{"maxLength":2000,"type":["string","null"]},"status":{"description":"Freigabe-Status (draft/submitted/approved/locked) — read-only. Der Externe sieht, ob sein\nEintrag noch änderbar ist; entscheiden tut das der Freigabe-Workflow, nicht er.","type":["string","null"]}}}],"description":"Zeiterfassung EXTERNER Mitwirkender (Doc 27 Stufe 7, E-5 · ENT-PM-PAR-13).\n\nWarum eine EIGENE Ressource statt Serialisierungsgruppen an {@see TimeEntryResource}: Sätze und\nKosten (`rateAmount`, `costRateAmount`) hängen an derselben Entität wie die Zeitdaten. „Externe\nerfassen Zeit ohne Sätze\" ist damit keine Rechte-, sondern eine Serialisierungsfrage — und eine\n * Gruppen-Konfiguration an einer geteilten Ressource vergisst man beim nächsten Feld. Hier gibt es\n * die Felder schlicht nicht; sie können nicht vergessen werden.\n *\n * Die Route liegt unter dem plugin-eigenen Segment `time` (`/v1/time/external-entries`) und nicht\n * unter einem generischen `/v1/external`: Segmente sind Eigentum, und „external\" gehoert keinem\nModul allein — es waere ein Name, den das naechste Modul genauso beanspruchen wuerde. Damit greift\nzugleich das fail-closed Modul-Gating von OctiTime.\n\nDer Schnitt ist doppelt: nur EIGENE Einträge (Employee = angemeldeter Nutzer) und nur auf\nVorgängen, die der Externen-Schnitt ohnehin freigibt\n({@see \\App\\WorkItem\\Contract\\ExternalWorkItemScopeInterface}). Für Mitarbeiter ist die Ressource\nerreichbar, aber uninteressant — sie sehen dasselbe reicher unter `/v1/time-entries`."},"FeatureFlag-feature_flag.read":{"type":"object","required":["name"],"properties":{"name":{"maxLength":100,"default":"","type":"string"},"enabled":{"default":false,"type":"boolean"},"description":{"maxLength":255,"type":["string","null"]},"config":{"description":"Config-Payload (Rollout-Schlüssel etc.) — nur für Verwalter lesbar (platform.settings.manage),\nsonst nur name/enabled/description sichtbar.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}}},"FeatureFlag-feature_flag.write":{"type":"object","required":["name"],"properties":{"name":{"maxLength":100,"default":"","type":"string"},"enabled":{"default":false,"type":"boolean"},"description":{"maxLength":255,"type":["string","null"]},"config":{"description":"Config-Payload (Rollout-Schlüssel etc.) — nur für Verwalter lesbar (platform.settings.manage),\nsonst nur name/enabled/description sichtbar.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"FeatureFlag-feature_flag.write.jsonMergePatch":{"type":"object","properties":{"name":{"maxLength":100,"default":"","type":"string"},"enabled":{"default":false,"type":"boolean"},"description":{"maxLength":255,"type":["string","null"]},"config":{"description":"Config-Payload (Rollout-Schlüssel etc.) — nur für Verwalter lesbar (platform.settings.manage),\nsonst nur name/enabled/description sichtbar.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"FeatureFlag.jsonld-feature_flag.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["name"],"properties":{"name":{"maxLength":100,"default":"","type":"string"},"enabled":{"default":false,"type":"boolean"},"description":{"maxLength":255,"type":["string","null"]},"config":{"description":"Config-Payload (Rollout-Schlüssel etc.) — nur für Verwalter lesbar (platform.settings.manage),\nsonst nur name/enabled/description sichtbar.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}}}]},"File-file.move":{"type":"object","description":"DMS-Datei (04-00 §4.6).\n- Upload: Base64-JSON. Download: Byte-Stream über Controller mit {@see \\App\\Platform\\File\\Security\\FileVoter}-Check.\n- Marken-/Objekt-Scope in State-Layer + Voter erzwungen (IDOR-Schutz).","properties":{"folderId":{"type":["integer","null"]}}},"File-file.read":{"type":"object","description":"DMS-Datei (04-00 §4.6).\n- Upload: Base64-JSON. Download: Byte-Stream über Controller mit {@see \\App\\Platform\\File\\Security\\FileVoter}-Check.\n- Marken-/Objekt-Scope in State-Layer + Voter erzwungen (IDOR-Schutz).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"filename":{"maxLength":255,"type":["string","null"]},"folderId":{"type":["integer","null"]},"folderName":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"ownerType":{"maxLength":20,"description":"Polymorphe Eigentümer-Referenz (Doc 19 1d): bindet Datei an beliebiges Objekt\n(ownerType z. B. „deal\"/„lead\"/„customer\" + numerische ID). Nur gemeinsam wirksam,\nfilterbar über ownerType+ownerId. Zugriff bleibt über platform.file.* + Marken-Scope\ngeregelt ({@see \\App\\Platform\\File\\Security\\FileVoter}), kein neues Recht je Objekttyp.","type":["string","null"]},"ownerId":{"type":["integer","null"]},"mimeType":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"checksum":{"type":["string","null"]},"storage":{"type":["string","null"]},"versionCount":{"type":["integer","null"]},"currentVersion":{"type":["integer","null"]},"visibleToPortal":{"description":"Expliziter Portal-Freigabe-Marker (04-12 §4.8): nur Dateien mit true sind im Kundenportal sicht-/ladbar.","type":["boolean","null"]},"isSensitive":{"description":"Markierung sensibler Dateien (04-00 §4.6): bleiben unabhängig vom Portal-Flag aus dem Kundenportal ausgeschlossen.","type":["boolean","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"versions":{"description":"Versionsverlauf (nur /versions); eingebettete Plain-Daten, keine eigene IRI-Ressource. Neueste zuerst.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}},"File-file.write":{"type":"object","description":"DMS-Datei (04-00 §4.6).\n- Upload: Base64-JSON. Download: Byte-Stream über Controller mit {@see \\App\\Platform\\File\\Security\\FileVoter}-Check.\n- Marken-/Objekt-Scope in State-Layer + Voter erzwungen (IDOR-Schutz).","properties":{"contentBase64":{"description":"Datei-Inhalt Base64 (Upload-Pflicht); Größe/MIME/Integrität prüft FileUploadValidator (Magic-Byte/Whitelist).","type":["string","null"]},"declaredMime":{"description":"Optionaler deklarierter MIME-Typ (wird gegen Magic Bytes geprüft, nicht vertraut).","type":["string","null"]},"comment":{"maxLength":255,"description":"Optionaler Versionskommentar (beim Anlegen einer weiteren Version bzw. beim Wiederherstellen).","type":["string","null"]},"restoreVersion":{"minimum":0,"exclusiveMinimum":0,"description":"Wiederherzustellende Versionsnummer (nur restore-version, append-only); ≥ 1, nicht die aktuelle Version.","type":["integer","null"]},"visibleToPortal":{"description":"Expliziter Portal-Freigabe-Marker (04-12 §4.8): nur Dateien mit true sind im Kundenportal sicht-/ladbar.","type":["boolean","null"]},"isSensitive":{"description":"Markierung sensibler Dateien (04-00 §4.6): bleiben unabhängig vom Portal-Flag aus dem Kundenportal ausgeschlossen.","type":["boolean","null"]}}},"File-file.write.jsonMergePatch":{"type":"object","description":"DMS-Datei (04-00 §4.6).\n- Upload: Base64-JSON. Download: Byte-Stream über Controller mit {@see \\App\\Platform\\File\\Security\\FileVoter}-Check.\n- Marken-/Objekt-Scope in State-Layer + Voter erzwungen (IDOR-Schutz).","properties":{"contentBase64":{"description":"Datei-Inhalt Base64 (Upload-Pflicht); Größe/MIME/Integrität prüft FileUploadValidator (Magic-Byte/Whitelist).","type":["string","null"]},"declaredMime":{"description":"Optionaler deklarierter MIME-Typ (wird gegen Magic Bytes geprüft, nicht vertraut).","type":["string","null"]},"comment":{"maxLength":255,"description":"Optionaler Versionskommentar (beim Anlegen einer weiteren Version bzw. beim Wiederherstellen).","type":["string","null"]},"restoreVersion":{"minimum":0,"exclusiveMinimum":0,"description":"Wiederherzustellende Versionsnummer (nur restore-version, append-only); ≥ 1, nicht die aktuelle Version.","type":["integer","null"]},"visibleToPortal":{"description":"Expliziter Portal-Freigabe-Marker (04-12 §4.8): nur Dateien mit true sind im Kundenportal sicht-/ladbar.","type":["boolean","null"]},"isSensitive":{"description":"Markierung sensibler Dateien (04-00 §4.6): bleiben unabhängig vom Portal-Flag aus dem Kundenportal ausgeschlossen.","type":["boolean","null"]}}},"File-file.write_file.create":{"type":"object","description":"DMS-Datei (04-00 §4.6).\n- Upload: Base64-JSON. Download: Byte-Stream über Controller mit {@see \\App\\Platform\\File\\Security\\FileVoter}-Check.\n- Marken-/Objekt-Scope in State-Layer + Voter erzwungen (IDOR-Schutz).","properties":{"contentBase64":{"description":"Datei-Inhalt Base64 (Upload-Pflicht); Größe/MIME/Integrität prüft FileUploadValidator (Magic-Byte/Whitelist).","type":["string","null"]},"filename":{"maxLength":255,"type":["string","null"]},"folderId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"ownerType":{"maxLength":20,"description":"Polymorphe Eigentümer-Referenz (Doc 19 1d): bindet Datei an beliebiges Objekt\n(ownerType z. B. „deal\"/„lead\"/„customer\" + numerische ID). Nur gemeinsam wirksam,\nfilterbar über ownerType+ownerId. Zugriff bleibt über platform.file.* + Marken-Scope\ngeregelt ({@see \\App\\Platform\\File\\Security\\FileVoter}), kein neues Recht je Objekttyp.","type":["string","null"]},"ownerId":{"type":["integer","null"]},"declaredMime":{"description":"Optionaler deklarierter MIME-Typ (wird gegen Magic Bytes geprüft, nicht vertraut).","type":["string","null"]},"comment":{"maxLength":255,"description":"Optionaler Versionskommentar (beim Anlegen einer weiteren Version bzw. beim Wiederherstellen).","type":["string","null"]},"restoreVersion":{"minimum":0,"exclusiveMinimum":0,"description":"Wiederherzustellende Versionsnummer (nur restore-version, append-only); ≥ 1, nicht die aktuelle Version.","type":["integer","null"]},"visibleToPortal":{"description":"Expliziter Portal-Freigabe-Marker (04-12 §4.8): nur Dateien mit true sind im Kundenportal sicht-/ladbar.","type":["boolean","null"]},"isSensitive":{"description":"Markierung sensibler Dateien (04-00 §4.6): bleiben unabhängig vom Portal-Flag aus dem Kundenportal ausgeschlossen.","type":["boolean","null"]}}},"File.jsonld-file.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"filename":{"maxLength":255,"type":["string","null"]},"folderId":{"type":["integer","null"]},"folderName":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"ownerType":{"maxLength":20,"description":"Polymorphe Eigentümer-Referenz (Doc 19 1d): bindet Datei an beliebiges Objekt\n(ownerType z. B. „deal\"/„lead\"/„customer\" + numerische ID). Nur gemeinsam wirksam,\nfilterbar über ownerType+ownerId. Zugriff bleibt über platform.file.* + Marken-Scope\ngeregelt ({@see \\App\\Platform\\File\\Security\\FileVoter}), kein neues Recht je Objekttyp.","type":["string","null"]},"ownerId":{"type":["integer","null"]},"mimeType":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"checksum":{"type":["string","null"]},"storage":{"type":["string","null"]},"versionCount":{"type":["integer","null"]},"currentVersion":{"type":["integer","null"]},"visibleToPortal":{"description":"Expliziter Portal-Freigabe-Marker (04-12 §4.8): nur Dateien mit true sind im Kundenportal sicht-/ladbar.","type":["boolean","null"]},"isSensitive":{"description":"Markierung sensibler Dateien (04-00 §4.6): bleiben unabhängig vom Portal-Flag aus dem Kundenportal ausgeschlossen.","type":["boolean","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"versions":{"description":"Versionsverlauf (nur /versions); eingebettete Plain-Daten, keine eigene IRI-Ressource. Neueste zuerst.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}}],"description":"DMS-Datei (04-00 §4.6).\n- Upload: Base64-JSON. Download: Byte-Stream über Controller mit {@see \\App\\Platform\\File\\Security\\FileVoter}-Check.\n- Marken-/Objekt-Scope in State-Layer + Voter erzwungen (IDOR-Schutz)."},"FinanceBankAccount-finance_bank_account.read":{"type":"object","description":"Bankkonten-Resource: CRUD der Konto-Stammdaten.\n- IBAN nur beim Schreiben (verschlüsselt); Lesen nur maskiert (`ibanMasked`, letzte 4 Stellen)\n- Löschen soft\n- `brandId` NULL = markenübergreifend (Schreiben braucht uneingeschränkten Marken-Scope, Muster DunningLevel).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":200,"type":["string","null"]},"ibanMasked":{"description":"Maskierte IBAN für die Anzeige (nur letzte 4 Stellen), z. B. \"•••• 2051\".","type":["string","null"]},"bic":{"maxLength":11,"type":["string","null"]},"bankName":{"maxLength":200,"type":["string","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO-4217-Code (Default EUR).","type":["string","null"]},"openingBalanceAmount":{"description":"Anfangssaldo in Cent (signiert) zum openingBalanceDate.","type":["integer","null"]},"openingBalanceDate":{"description":"Y-m-d.","type":["string","null"]},"connectionType":{"description":"Adapter-Schlüssel der Konto-Anbindung (read-only — aktuell immer `manual`).","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"FinanceBankAccount-finance_bank_account.write":{"type":"object","description":"Bankkonten-Resource: CRUD der Konto-Stammdaten.\n- IBAN nur beim Schreiben (verschlüsselt); Lesen nur maskiert (`ibanMasked`, letzte 4 Stellen)\n- Löschen soft\n- `brandId` NULL = markenübergreifend (Schreiben braucht uneingeschränkten Marken-Scope, Muster DunningLevel).","properties":{"name":{"maxLength":200,"type":["string","null"]},"iban":{"maxLength":50,"description":"Volle IBAN, nur beim Schreiben (verschlüsselt). Leerstring löscht (''-löscht-Konvention). Lesen: {@see $ibanMasked}.","type":["string","null"]},"bic":{"maxLength":11,"type":["string","null"]},"bankName":{"maxLength":200,"type":["string","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO-4217-Code (Default EUR).","type":["string","null"]},"openingBalanceAmount":{"description":"Anfangssaldo in Cent (signiert) zum openingBalanceDate.","type":["integer","null"]},"openingBalanceDate":{"description":"Y-m-d.","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"FinanceBankAccount-finance_bank_account.write.jsonMergePatch":{"type":"object","description":"Bankkonten-Resource: CRUD der Konto-Stammdaten.\n- IBAN nur beim Schreiben (verschlüsselt); Lesen nur maskiert (`ibanMasked`, letzte 4 Stellen)\n- Löschen soft\n- `brandId` NULL = markenübergreifend (Schreiben braucht uneingeschränkten Marken-Scope, Muster DunningLevel).","properties":{"name":{"maxLength":200,"type":["string","null"]},"iban":{"maxLength":50,"description":"Volle IBAN, nur beim Schreiben (verschlüsselt). Leerstring löscht (''-löscht-Konvention). Lesen: {@see $ibanMasked}.","type":["string","null"]},"bic":{"maxLength":11,"type":["string","null"]},"bankName":{"maxLength":200,"type":["string","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO-4217-Code (Default EUR).","type":["string","null"]},"openingBalanceAmount":{"description":"Anfangssaldo in Cent (signiert) zum openingBalanceDate.","type":["integer","null"]},"openingBalanceDate":{"description":"Y-m-d.","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"FinanceBankAccount.jsonld-finance_bank_account.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":200,"type":["string","null"]},"ibanMasked":{"description":"Maskierte IBAN für die Anzeige (nur letzte 4 Stellen), z. B. \"•••• 2051\".","type":["string","null"]},"bic":{"maxLength":11,"type":["string","null"]},"bankName":{"maxLength":200,"type":["string","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO-4217-Code (Default EUR).","type":["string","null"]},"openingBalanceAmount":{"description":"Anfangssaldo in Cent (signiert) zum openingBalanceDate.","type":["integer","null"]},"openingBalanceDate":{"description":"Y-m-d.","type":["string","null"]},"connectionType":{"description":"Adapter-Schlüssel der Konto-Anbindung (read-only — aktuell immer `manual`).","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}}],"description":"Bankkonten-Resource: CRUD der Konto-Stammdaten.\n- IBAN nur beim Schreiben (verschlüsselt); Lesen nur maskiert (`ibanMasked`, letzte 4 Stellen)\n- Löschen soft\n- `brandId` NULL = markenübergreifend (Schreiben braucht uneingeschränkten Marken-Scope, Muster DunningLevel)."},"FinanceBankConnection-finance_bank_connection.read":{"type":"object","description":"Bank-Verknüpfung über einen Aggregator-Adapter (Doc 25 AP 5.3, G12).\n\n**Kein PATCH.** Was an einer Verknüpfung veränderlich ist, gehört dem ANBIETER: Zustand, Ablauf\nder Einwilligung, Kontenliste. Sie hier bearbeitbar zu machen hiesse, eine zweite Wahrheit über\ndieselbe Einwilligung zu führen. Geändert wird die Zuordnung — und die hängt am Konto\n({@see BankConnectionAccountResource}).\n\nDrei Aktionen: `begin` startet (oder erneuert) Zustimmung/SCA, `refresh` holt Zustand und\nKontenliste beim Anbieter, `sync` ruft die Umsätze ab. Alle drei sind eigene Operationen und\ndamit auch für Automation und MCP erreichbar (P-1/P-2) — der periodische Abruf ist genau das.","properties":{"ulid":{"type":["string","null"]},"providerKey":{"maxLength":40,"description":"Anbieter-Schlüssel (Pflicht beim Anlegen, danach unveränderlich).","type":["string","null"]},"providerName":{"description":"Anzeigename des Anbieters, aus dem Adapter.","type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"status":{"description":"draft | pending | active | expired | error | unknown.","type":["string","null"]},"consentExpiresAt":{"description":"ISO-8601; NULL = der Anbieter macht keine Angabe zum Ablauf der Einwilligung.","type":["string","null"]},"lastSyncAt":{"type":["string","null"]},"lastError":{"type":["string","null"]},"accounts":{"description":"Konten hinter dieser Verknüpfung (aus `refresh` befüllt).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"authUrl":{"description":"Antwort von `begin`: die URL, auf die der Nutzer für Zustimmung/SCA zu leiten ist.","type":["string","null"]},"result":{"description":"Antwort von `sync`: Zählwerte des Laufs (accounts/imported/duplicates/failed/status).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"FinanceBankConnection-finance_bank_connection.write":{"type":"object","description":"Bank-Verknüpfung über einen Aggregator-Adapter (Doc 25 AP 5.3, G12).\n\n**Kein PATCH.** Was an einer Verknüpfung veränderlich ist, gehört dem ANBIETER: Zustand, Ablauf\nder Einwilligung, Kontenliste. Sie hier bearbeitbar zu machen hiesse, eine zweite Wahrheit über\ndieselbe Einwilligung zu führen. Geändert wird die Zuordnung — und die hängt am Konto\n({@see BankConnectionAccountResource}).\n\nDrei Aktionen: `begin` startet (oder erneuert) Zustimmung/SCA, `refresh` holt Zustand und\nKontenliste beim Anbieter, `sync` ruft die Umsätze ab. Alle drei sind eigene Operationen und\ndamit auch für Automation und MCP erreichbar (P-1/P-2) — der periodische Abruf ist genau das.","properties":{"providerKey":{"maxLength":40,"description":"Anbieter-Schlüssel (Pflicht beim Anlegen, danach unveränderlich).","type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"returnUrl":{"maxLength":500,"description":"Rücksprungziel nach erteilter Zustimmung (nur für `begin`).","type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"FinanceBankConnection.jsonld-finance_bank_connection.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"providerKey":{"maxLength":40,"description":"Anbieter-Schlüssel (Pflicht beim Anlegen, danach unveränderlich).","type":["string","null"]},"providerName":{"description":"Anzeigename des Anbieters, aus dem Adapter.","type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"status":{"description":"draft | pending | active | expired | error | unknown.","type":["string","null"]},"consentExpiresAt":{"description":"ISO-8601; NULL = der Anbieter macht keine Angabe zum Ablauf der Einwilligung.","type":["string","null"]},"lastSyncAt":{"type":["string","null"]},"lastError":{"type":["string","null"]},"accounts":{"description":"Konten hinter dieser Verknüpfung (aus `refresh` befüllt).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"authUrl":{"description":"Antwort von `begin`: die URL, auf die der Nutzer für Zustimmung/SCA zu leiten ist.","type":["string","null"]},"result":{"description":"Antwort von `sync`: Zählwerte des Laufs (accounts/imported/duplicates/failed/status).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}}],"description":"Bank-Verknüpfung über einen Aggregator-Adapter (Doc 25 AP 5.3, G12).\n\n**Kein PATCH.** Was an einer Verknüpfung veränderlich ist, gehört dem ANBIETER: Zustand, Ablauf\nder Einwilligung, Kontenliste. Sie hier bearbeitbar zu machen hiesse, eine zweite Wahrheit über\ndieselbe Einwilligung zu führen. Geändert wird die Zuordnung — und die hängt am Konto\n({@see BankConnectionAccountResource}).\n\nDrei Aktionen: `begin` startet (oder erneuert) Zustimmung/SCA, `refresh` holt Zustand und\nKontenliste beim Anbieter, `sync` ruft die Umsätze ab. Alle drei sind eigene Operationen und\ndamit auch für Automation und MCP erreichbar (P-1/P-2) — der periodische Abruf ist genau das."},"FinanceBankConnectionAccount-finance_bank_connection_account.read":{"type":"object","description":"Ein Konto hinter einer Bank-Verknüpfung und seine Zuordnung zum eigenen Bankkonto\n(Doc 25 AP 5.3).\n\nDie Zeilen entstehen ausschliesslich aus dem `refresh` der Verknüpfung — sie beschreiben, was\nbeim Anbieter liegt. Veränderlich ist deshalb genau ein Feld: `bankAccountUlid`. Das ist die\nEntscheidung des Betreibers, welches fremde Konto in die eigene Buchhaltung läuft; alles andere\ngehört der Bank.","properties":{"ulid":{"type":["string","null"]},"connectionUlid":{"type":["string","null"]},"externalRef":{"description":"Kennung des Kontos beim Anbieter.","type":["string","null"]},"name":{"type":["string","null"]},"ibanMasked":{"description":"Maskierte IBAN zur Wiedererkennung, z. B. \"•••• 2051\".","type":["string","null"]},"currency":{"type":["string","null"]},"bankAccountUlid":{"description":"Zugeordnetes eigenes Bankkonto; Leerstring/NULL löst die Zuordnung (''-löscht-Konvention).","type":["string","null"]},"bankAccountName":{"type":["string","null"]},"syncedThrough":{"description":"Buchungstag, bis zu dem abgerufen wurde (Y-m-d); NULL = noch nie abgerufen.","type":["string","null"]}}},"FinanceBankConnectionAccount-finance_bank_connection_account.write.jsonMergePatch":{"type":"object","description":"Ein Konto hinter einer Bank-Verknüpfung und seine Zuordnung zum eigenen Bankkonto\n(Doc 25 AP 5.3).\n\nDie Zeilen entstehen ausschliesslich aus dem `refresh` der Verknüpfung — sie beschreiben, was\nbeim Anbieter liegt. Veränderlich ist deshalb genau ein Feld: `bankAccountUlid`. Das ist die\nEntscheidung des Betreibers, welches fremde Konto in die eigene Buchhaltung läuft; alles andere\ngehört der Bank.","properties":{"bankAccountUlid":{"description":"Zugeordnetes eigenes Bankkonto; Leerstring/NULL löst die Zuordnung (''-löscht-Konvention).","type":["string","null"]}}},"FinanceBankConnectionAccount.jsonld-finance_bank_connection_account.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"connectionUlid":{"type":["string","null"]},"externalRef":{"description":"Kennung des Kontos beim Anbieter.","type":["string","null"]},"name":{"type":["string","null"]},"ibanMasked":{"description":"Maskierte IBAN zur Wiedererkennung, z. B. \"•••• 2051\".","type":["string","null"]},"currency":{"type":["string","null"]},"bankAccountUlid":{"description":"Zugeordnetes eigenes Bankkonto; Leerstring/NULL löst die Zuordnung (''-löscht-Konvention).","type":["string","null"]},"bankAccountName":{"type":["string","null"]},"syncedThrough":{"description":"Buchungstag, bis zu dem abgerufen wurde (Y-m-d); NULL = noch nie abgerufen.","type":["string","null"]}}}],"description":"Ein Konto hinter einer Bank-Verknüpfung und seine Zuordnung zum eigenen Bankkonto\n(Doc 25 AP 5.3).\n\nDie Zeilen entstehen ausschliesslich aus dem `refresh` der Verknüpfung — sie beschreiben, was\nbeim Anbieter liegt. Veränderlich ist deshalb genau ein Feld: `bankAccountUlid`. Das ist die\nEntscheidung des Betreibers, welches fremde Konto in die eigene Buchhaltung läuft; alles andere\ngehört der Bank."},"FinanceBankConnectionProvider-finance_bank_provider.read":{"type":"object","description":"Die verfügbaren Bank-Adapter (Doc 25 AP 5.3).\n\n**Warum das eine API-Operation ist und keine Liste im Frontend:** welcher Anbieter verfügbar\nist, hängt vom installierten und aktivierten Plugin-Set ab. Stünde die Liste in der Oberfläche,\nbekäme ein Adapter aus einem fremden Plugin nie einen Eintrag — und die Zusage „ein neuer\nAnbieter ist ein neues Plugin\" gälte nur für den Abruf, nicht für das Einrichten.\n\n`configured` sagt, ob die Zugangsdaten des Anbieters hinterlegt sind. Ein nicht eingerichteter\nAdapter bleibt SICHTBAR — sonst sucht der Betreiber die Anbindung, die er gerade installiert hat.","properties":{"providerKey":{"type":["string","null"]},"displayName":{"type":["string","null"]},"configured":{"description":"Zugangsdaten hinterlegt? Ohne das führt „Verknüpfen\" beim Anbieter in eine Fehlerseite.","type":["boolean","null"]}}},"FinanceBankConnectionProvider.jsonld-finance_bank_provider.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"providerKey":{"type":["string","null"]},"displayName":{"type":["string","null"]},"configured":{"description":"Zugangsdaten hinterlegt? Ohne das führt „Verknüpfen\" beim Anbieter in eine Fehlerseite.","type":["boolean","null"]}}}],"description":"Die verfügbaren Bank-Adapter (Doc 25 AP 5.3).\n\n**Warum das eine API-Operation ist und keine Liste im Frontend:** welcher Anbieter verfügbar\nist, hängt vom installierten und aktivierten Plugin-Set ab. Stünde die Liste in der Oberfläche,\nbekäme ein Adapter aus einem fremden Plugin nie einen Eintrag — und die Zusage „ein neuer\nAnbieter ist ein neues Plugin\" gälte nur für den Abruf, nicht für das Einrichten.\n\n`configured` sagt, ob die Zugangsdaten des Anbieters hinterlegt sind. Ein nicht eingerichteter\nAdapter bleibt SICHTBAR — sonst sucht der Betreiber die Anbindung, die er gerade installiert hat."},"FinanceBankStatementImport-finance_statement_import.read":{"type":"object","description":"Kontoauszugs-Import je Konto (04-34 §4.1).\n- POST .../bank-accounts/{ulid}/import, Body {format: camt053|mt940|auto, content: base64} (Muster FileUploadProcessor, kein Multipart)\n- Antwort: Lauf-Ergebnis {format, imported, duplicates, failed, unmatchedTotal} (JsonResponse, kein Item, Muster DunningRun)\n- Idempotent: Re-Import derselben Datei erzeugt keine Dubletten (Import-Hash-Dedup), zählt `duplicates` hoch.","properties":{"ulid":{"description":"Synthetische Kennung (Aggregat-Antwort ohne Entity).","type":["string","null"]}}},"FinanceBankStatementImport-finance_statement_import.write":{"type":"object","description":"Kontoauszugs-Import je Konto (04-34 §4.1).\n- POST .../bank-accounts/{ulid}/import, Body {format: camt053|mt940|auto, content: base64} (Muster FileUploadProcessor, kein Multipart)\n- Antwort: Lauf-Ergebnis {format, imported, duplicates, failed, unmatchedTotal} (JsonResponse, kein Item, Muster DunningRun)\n- Idempotent: Re-Import derselben Datei erzeugt keine Dubletten (Import-Hash-Dedup), zählt `duplicates` hoch.","properties":{"format":{"enum":["camt053","mt940","auto"],"description":"Dateiformat: `camt053` | `mt940` | `auto` (Default — Inhalts-Sniffing).","type":["string","null"]},"content":{"description":"Dateiinhalt Base64-kodiert (Pflicht).","type":["string","null"]}}},"FinanceBankStatementImport.jsonld-finance_statement_import.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische Kennung (Aggregat-Antwort ohne Entity).","type":["string","null"]}}}],"description":"Kontoauszugs-Import je Konto (04-34 §4.1).\n- POST .../bank-accounts/{ulid}/import, Body {format: camt053|mt940|auto, content: base64} (Muster FileUploadProcessor, kein Multipart)\n- Antwort: Lauf-Ergebnis {format, imported, duplicates, failed, unmatchedTotal} (JsonResponse, kein Item, Muster DunningRun)\n- Idempotent: Re-Import derselben Datei erzeugt keine Dubletten (Import-Hash-Dedup), zählt `duplicates` hoch."},"FinanceBankTransaction-finance_bank_transaction.read":{"type":"object","description":"Kontoumsatz-Resource: listen/lesen, manuell erfassen, Zahlungsabgleich als Aktionen.\n- Manuell erfassen: source `manual`, Dedup je Konto über Import-Hash (Duplikat → 409)\n- Aktionen: `auto-match` (Engine über offene Umsätze des Scopes), `match` (Ausgangsrechnungs-Zuordnungen ODER Eingangsrechnung), `ignore`/`unignore` (reversibel)\n- Umsätze ab Erfassung unveränderlich: kein PATCH/DELETE (405); MATCH ist endgültig, kein Unmatch (GoBD-sensibel, s. MatchingEngine)\n- Marken-Scope über die Marke des Kontos\n- `auto-match`-Literal kollidiert nicht mit ULID-Routen (Format-Requirement, Muster DunningResource).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"accountUlid":{"maxLength":26,"description":"Konto-ULID (Pflicht beim Erfassen).","type":["string","null"]},"accountId":{"type":["integer","null"]},"bookingDate":{"description":"Buchungsdatum (Y-m-d, Pflicht beim Erfassen).","type":["string","null"]},"valueDate":{"description":"Wertstellung (Y-m-d).","type":["string","null"]},"amountCents":{"description":"Signierter Betrag in Cent: Haben (Gutschrift) positiv, Soll (Lastschrift) negativ.","type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO-4217-Code (Default: Konto-Währung).","type":["string","null"]},"counterpartName":{"maxLength":200,"type":["string","null"]},"counterpartIban":{"maxLength":50,"type":["string","null"]},"purpose":{"description":"Verwendungszweck.","type":["string","null"]},"endToEndId":{"maxLength":64,"type":["string","null"]},"bankReference":{"maxLength":100,"type":["string","null"]},"importHash":{"description":"Deterministischer Import-Hash (Dedup je Konto, read-only).","type":["string","null"]},"source":{"description":"Herkunft: camt053 | mt940 | manual (read-only — POST erfasst immer `manual`).","type":["string","null"]},"status":{"description":"Abgleich-Zustand: unmatched | matched | ignored (read-only — Übergänge in Teil 2).","type":["string","null"]},"matchedPaymentUlid":{"description":"Zugeordneter Faktura-Zahlungseingang (read-only, Teil 2).","type":["string","null"]},"matchedIncomingInvoiceId":{"description":"Zugeordnete Eingangsrechnung (read-only, Teil 2).","type":["integer","null"]},"matchNote":{"type":["string","null"]},"matchedAt":{"type":["string","null"]}}},"FinanceBankTransaction-finance_bank_transaction.write":{"type":"object","description":"Kontoumsatz-Resource: listen/lesen, manuell erfassen, Zahlungsabgleich als Aktionen.\n- Manuell erfassen: source `manual`, Dedup je Konto über Import-Hash (Duplikat → 409)\n- Aktionen: `auto-match` (Engine über offene Umsätze des Scopes), `match` (Ausgangsrechnungs-Zuordnungen ODER Eingangsrechnung), `ignore`/`unignore` (reversibel)\n- Umsätze ab Erfassung unveränderlich: kein PATCH/DELETE (405); MATCH ist endgültig, kein Unmatch (GoBD-sensibel, s. MatchingEngine)\n- Marken-Scope über die Marke des Kontos\n- `auto-match`-Literal kollidiert nicht mit ULID-Routen (Format-Requirement, Muster DunningResource).","properties":{"accountUlid":{"maxLength":26,"description":"Konto-ULID (Pflicht beim Erfassen).","type":["string","null"]},"bookingDate":{"description":"Buchungsdatum (Y-m-d, Pflicht beim Erfassen).","type":["string","null"]},"valueDate":{"description":"Wertstellung (Y-m-d).","type":["string","null"]},"amountCents":{"description":"Signierter Betrag in Cent: Haben (Gutschrift) positiv, Soll (Lastschrift) negativ.","type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO-4217-Code (Default: Konto-Währung).","type":["string","null"]},"counterpartName":{"maxLength":200,"type":["string","null"]},"counterpartIban":{"maxLength":50,"type":["string","null"]},"purpose":{"description":"Verwendungszweck.","type":["string","null"]},"endToEndId":{"maxLength":64,"type":["string","null"]},"bankReference":{"maxLength":100,"type":["string","null"]},"invoiceMatches":{"description":"Nur `match` (Haben-Umsatz): Zuordnungsliste `[{invoiceUlid, amount}]` auf Ausgangsrechnungen.","type":["array","null"],"items":{"type":["string","null"]}},"incomingInvoiceUlid":{"maxLength":26,"description":"Nur `match`-Aktion (Soll-Umsatz): Eingangsrechnung, die als bezahlt markiert wird.","type":["string","null"]},"note":{"maxLength":255,"description":"Nur `match`-/`ignore`-Aktion: Bemerkung (wird als matchNote gespeichert).","type":["string","null"]}}},"FinanceBankTransaction.jsonld-finance_bank_transaction.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"accountUlid":{"maxLength":26,"description":"Konto-ULID (Pflicht beim Erfassen).","type":["string","null"]},"accountId":{"type":["integer","null"]},"bookingDate":{"description":"Buchungsdatum (Y-m-d, Pflicht beim Erfassen).","type":["string","null"]},"valueDate":{"description":"Wertstellung (Y-m-d).","type":["string","null"]},"amountCents":{"description":"Signierter Betrag in Cent: Haben (Gutschrift) positiv, Soll (Lastschrift) negativ.","type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"description":"ISO-4217-Code (Default: Konto-Währung).","type":["string","null"]},"counterpartName":{"maxLength":200,"type":["string","null"]},"counterpartIban":{"maxLength":50,"type":["string","null"]},"purpose":{"description":"Verwendungszweck.","type":["string","null"]},"endToEndId":{"maxLength":64,"type":["string","null"]},"bankReference":{"maxLength":100,"type":["string","null"]},"importHash":{"description":"Deterministischer Import-Hash (Dedup je Konto, read-only).","type":["string","null"]},"source":{"description":"Herkunft: camt053 | mt940 | manual (read-only — POST erfasst immer `manual`).","type":["string","null"]},"status":{"description":"Abgleich-Zustand: unmatched | matched | ignored (read-only — Übergänge in Teil 2).","type":["string","null"]},"matchedPaymentUlid":{"description":"Zugeordneter Faktura-Zahlungseingang (read-only, Teil 2).","type":["string","null"]},"matchedIncomingInvoiceId":{"description":"Zugeordnete Eingangsrechnung (read-only, Teil 2).","type":["integer","null"]},"matchNote":{"type":["string","null"]},"matchedAt":{"type":["string","null"]}}}],"description":"Kontoumsatz-Resource: listen/lesen, manuell erfassen, Zahlungsabgleich als Aktionen.\n- Manuell erfassen: source `manual`, Dedup je Konto über Import-Hash (Duplikat → 409)\n- Aktionen: `auto-match` (Engine über offene Umsätze des Scopes), `match` (Ausgangsrechnungs-Zuordnungen ODER Eingangsrechnung), `ignore`/`unignore` (reversibel)\n- Umsätze ab Erfassung unveränderlich: kein PATCH/DELETE (405); MATCH ist endgültig, kein Unmatch (GoBD-sensibel, s. MatchingEngine)\n- Marken-Scope über die Marke des Kontos\n- `auto-match`-Literal kollidiert nicht mit ULID-Routen (Format-Requirement, Muster DunningResource)."},"FinanceCashBook-finance_cash_book.read":{"type":"object","description":"Kassenbuch (Doc 25 AP 1.5, G14) — die **Bürokasse**: Portokasse, Handkasse, Barauslagen.\n\nAusdrücklich NICHT die Ladenkasse: eine Registrierkasse braucht eine zertifizierte technische\nSicherheitseinrichtung nach KassenSichV und kommt mit `OctiPos` (Stufe 11).\n\n**Kein Delete** — ein Kassenbuch mit Buchungen wird stillgelegt (`active=false`), nicht\ngelöscht: §147 AO verlangt die Aufbewahrung, und ein weggeräumtes Buch ist bei einer Prüfung\ndas schlechteste Ergebnis.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"brandId":{"type":["integer","null"]},"balanceAmount":{"description":"Laufender Kassenbestand in Cent (read-only — entsteht aus den Buchungen).","type":["integer","null"]},"closedThrough":{"description":"Tag, bis zu dem festgeschrieben ist (read-only — nur über die Abschluss-Aktion).","type":["string","null"]},"active":{"type":["boolean","null"]},"notes":{"type":["string","null"]}}},"FinanceCashBook-finance_cash_book.write":{"type":"object","description":"Kassenbuch (Doc 25 AP 1.5, G14) — die **Bürokasse**: Portokasse, Handkasse, Barauslagen.\n\nAusdrücklich NICHT die Ladenkasse: eine Registrierkasse braucht eine zertifizierte technische\nSicherheitseinrichtung nach KassenSichV und kommt mit `OctiPos` (Stufe 11).\n\n**Kein Delete** — ein Kassenbuch mit Buchungen wird stillgelegt (`active=false`), nicht\ngelöscht: §147 AO verlangt die Aufbewahrung, und ein weggeräumtes Buch ist bei einer Prüfung\ndas schlechteste Ergebnis.","required":["name"],"properties":{"name":{"maxLength":120,"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"notes":{"type":["string","null"]}}},"FinanceCashBook-finance_cash_book.write.jsonMergePatch":{"type":"object","description":"Kassenbuch (Doc 25 AP 1.5, G14) — die **Bürokasse**: Portokasse, Handkasse, Barauslagen.\n\nAusdrücklich NICHT die Ladenkasse: eine Registrierkasse braucht eine zertifizierte technische\nSicherheitseinrichtung nach KassenSichV und kommt mit `OctiPos` (Stufe 11).\n\n**Kein Delete** — ein Kassenbuch mit Buchungen wird stillgelegt (`active=false`), nicht\ngelöscht: §147 AO verlangt die Aufbewahrung, und ein weggeräumtes Buch ist bei einer Prüfung\ndas schlechteste Ergebnis.","properties":{"name":{"maxLength":120,"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"notes":{"type":["string","null"]}}},"FinanceCashBook.jsonld-finance_cash_book.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"brandId":{"type":["integer","null"]},"balanceAmount":{"description":"Laufender Kassenbestand in Cent (read-only — entsteht aus den Buchungen).","type":["integer","null"]},"closedThrough":{"description":"Tag, bis zu dem festgeschrieben ist (read-only — nur über die Abschluss-Aktion).","type":["string","null"]},"active":{"type":["boolean","null"]},"notes":{"type":["string","null"]}}}],"description":"Kassenbuch (Doc 25 AP 1.5, G14) — die **Bürokasse**: Portokasse, Handkasse, Barauslagen.\n\nAusdrücklich NICHT die Ladenkasse: eine Registrierkasse braucht eine zertifizierte technische\nSicherheitseinrichtung nach KassenSichV und kommt mit `OctiPos` (Stufe 11).\n\n**Kein Delete** — ein Kassenbuch mit Buchungen wird stillgelegt (`active=false`), nicht\ngelöscht: §147 AO verlangt die Aufbewahrung, und ein weggeräumtes Buch ist bei einer Prüfung\ndas schlechteste Ergebnis."},"FinanceCashEntry-finance_cash_entry.read":{"type":"object","description":"Kassenbuch-Zeilen (Doc 25 AP 1.5, G14).\n\n**Bewusst nur Lesen, Buchen, Stornieren und Abschließen — kein PATCH, kein DELETE.** Eine\ngebuchte Kassenzeile ist unveränderlich (§146 AO: die ursprüngliche Eintragung muss feststellbar\nbleiben). Eine Korrektur ist die Storno-Gegenbuchung; beide Zeilen bleiben stehen und beide\ngehen in den DATEV-Export.","properties":{"ulid":{"type":["string","null"]},"sequenceNumber":{"description":"Lückenlose laufende Nummer im Buch (read-only, vergeben beim Buchen).","type":["integer","null"]},"type":{"enum":["in","out"],"description":"`in` (Einzahlung) oder `out` (Auszahlung).","type":["string","null"]},"amount":{"minimum":0,"exclusiveMinimum":0,"description":"Betrag in Cent, immer positiv — die Richtung trägt `type`.","type":["integer","null"]},"purpose":{"maxLength":255,"type":["string","null"]},"bookedOn":{"description":"Buchungstag (YYYY-MM-DD); leer = heutiger Geschäftstag.","type":["string","null"]},"taxRatePercent":{"description":"Enthaltener Umsatzsteuersatz in Prozent, z. B. `19.00`. Kassenbelege sind Bruttobeträge.","type":["string","null"]},"taxAmount":{"description":"Enthaltene Umsatzsteuer in Cent (read-only — aus Betrag und Satz gerechnet).","type":["integer","null"]},"balanceAfter":{"description":"Kassenbestand NACH dieser Zeile (read-only, festgeschrieben).","type":["integer","null"]},"receiptNumber":{"maxLength":60,"type":["string","null"]},"ledgerAccount":{"maxLength":20,"type":["string","null"]},"costCenter":{"maxLength":40,"type":["string","null"]},"fileId":{"description":"FK-loser Verweis auf den eingescannten Beleg (File-Modul).","type":["integer","null"]},"reversalOfUlid":{"description":"ULID der Zeile, die diese storniert (read-only).","type":["string","null"]},"reversed":{"description":"Wurde diese Zeile storniert? (read-only)","type":["boolean","null"]}}},"FinanceCashEntry-finance_cash_entry.write":{"type":"object","description":"Kassenbuch-Zeilen (Doc 25 AP 1.5, G14).\n\n**Bewusst nur Lesen, Buchen, Stornieren und Abschließen — kein PATCH, kein DELETE.** Eine\ngebuchte Kassenzeile ist unveränderlich (§146 AO: die ursprüngliche Eintragung muss feststellbar\nbleiben). Eine Korrektur ist die Storno-Gegenbuchung; beide Zeilen bleiben stehen und beide\ngehen in den DATEV-Export.","properties":{"type":{"enum":["in","out"],"description":"`in` (Einzahlung) oder `out` (Auszahlung).","type":["string","null"]},"amount":{"minimum":0,"exclusiveMinimum":0,"description":"Betrag in Cent, immer positiv — die Richtung trägt `type`.","type":["integer","null"]},"purpose":{"maxLength":255,"type":["string","null"]},"bookedOn":{"description":"Buchungstag (YYYY-MM-DD); leer = heutiger Geschäftstag.","type":["string","null"]},"taxRatePercent":{"description":"Enthaltener Umsatzsteuersatz in Prozent, z. B. `19.00`. Kassenbelege sind Bruttobeträge.","type":["string","null"]},"receiptNumber":{"maxLength":60,"type":["string","null"]},"ledgerAccount":{"maxLength":20,"type":["string","null"]},"costCenter":{"maxLength":40,"type":["string","null"]},"fileId":{"description":"FK-loser Verweis auf den eingescannten Beleg (File-Modul).","type":["integer","null"]},"reason":{"maxLength":200,"description":"Begründung des Stornos (nur bei der Storno-Aktion).","type":["string","null"]},"through":{"description":"Abschluss bis einschließlich diesem Tag (nur bei der Abschluss-Aktion, YYYY-MM-DD).","type":["string","null"]}}},"FinanceCashEntry.jsonld-finance_cash_entry.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"sequenceNumber":{"description":"Lückenlose laufende Nummer im Buch (read-only, vergeben beim Buchen).","type":["integer","null"]},"type":{"enum":["in","out"],"description":"`in` (Einzahlung) oder `out` (Auszahlung).","type":["string","null"]},"amount":{"minimum":0,"exclusiveMinimum":0,"description":"Betrag in Cent, immer positiv — die Richtung trägt `type`.","type":["integer","null"]},"purpose":{"maxLength":255,"type":["string","null"]},"bookedOn":{"description":"Buchungstag (YYYY-MM-DD); leer = heutiger Geschäftstag.","type":["string","null"]},"taxRatePercent":{"description":"Enthaltener Umsatzsteuersatz in Prozent, z. B. `19.00`. Kassenbelege sind Bruttobeträge.","type":["string","null"]},"taxAmount":{"description":"Enthaltene Umsatzsteuer in Cent (read-only — aus Betrag und Satz gerechnet).","type":["integer","null"]},"balanceAfter":{"description":"Kassenbestand NACH dieser Zeile (read-only, festgeschrieben).","type":["integer","null"]},"receiptNumber":{"maxLength":60,"type":["string","null"]},"ledgerAccount":{"maxLength":20,"type":["string","null"]},"costCenter":{"maxLength":40,"type":["string","null"]},"fileId":{"description":"FK-loser Verweis auf den eingescannten Beleg (File-Modul).","type":["integer","null"]},"reversalOfUlid":{"description":"ULID der Zeile, die diese storniert (read-only).","type":["string","null"]},"reversed":{"description":"Wurde diese Zeile storniert? (read-only)","type":["boolean","null"]}}}],"description":"Kassenbuch-Zeilen (Doc 25 AP 1.5, G14).\n\n**Bewusst nur Lesen, Buchen, Stornieren und Abschließen — kein PATCH, kein DELETE.** Eine\ngebuchte Kassenzeile ist unveränderlich (§146 AO: die ursprüngliche Eintragung muss feststellbar\nbleiben). Eine Korrektur ist die Storno-Gegenbuchung; beide Zeilen bleiben stehen und beide\ngehen in den DATEV-Export."},"FinanceDatevExport-finance_datev_export.read":{"type":"object","description":"DATEV-Buchungsstapel-Export (04-34 §4.4, Recht `accounting.export.run`, Muster PayrollExportResource).\n- GET export/preview?from&to[&scope=outgoing|incoming|both]: JSON-Vorschau (Zeilen/Summen je Scope + Warnungen); Automation/MCP sehen dieselben Daten wie der Download\n- GET export/file?from&to[&scope][&format=datev-extf]: Download als EXTF-CSV (Windows-1252, `output: false`, Muster PayrollExportFileProvider)\n- from/to Pflicht (400)\n- EXTF-Format bis Steuerberater-Abnahme dokumentierte Annahme (`externalApprovalPending`, 04-34 §9).","properties":{"ulid":{"description":"Synthetische ULID (Aggregat-Antwort ohne Entity — Muster PayrollExport).","type":["string","null"]},"from":{"description":"Zeitraum-Beginn (Y-m-d).","type":["string","null"]},"to":{"description":"Zeitraum-Ende (Y-m-d).","type":["string","null"]},"scope":{"description":"Beleg-Auswahl: outgoing | incoming | both.","type":["string","null"]},"rowCount":{"description":"Gesamtzahl der Buchungszeilen im Stapel.","type":["integer","null"]},"outgoingCount":{"description":"Anzahl Ausgangsrechnungs-Zeilen.","type":["integer","null"]},"outgoingTotalCents":{"description":"Brutto-Summe der Ausgangsrechnungen in Cent (Gutschriften abgezogen).","type":["integer","null"]},"incomingCount":{"description":"Anzahl Eingangsrechnungs-Zeilen.","type":["integer","null"]},"incomingTotalCents":{"description":"Brutto-Summe der Eingangsrechnungen in Cent.","type":["integer","null"]},"warnings":{"description":"Warnungen (z. B. „N Eingangsrechnungen ohne Sachkonto → Fallback\", „Faktura-Modul\ninaktiv\") — bewusst kein Blocker.","type":["array","null"],"items":{"type":"string"}}}},"FinanceDatevExport.jsonld-finance_datev_export.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische ULID (Aggregat-Antwort ohne Entity — Muster PayrollExport).","type":["string","null"]},"from":{"description":"Zeitraum-Beginn (Y-m-d).","type":["string","null"]},"to":{"description":"Zeitraum-Ende (Y-m-d).","type":["string","null"]},"scope":{"description":"Beleg-Auswahl: outgoing | incoming | both.","type":["string","null"]},"rowCount":{"description":"Gesamtzahl der Buchungszeilen im Stapel.","type":["integer","null"]},"outgoingCount":{"description":"Anzahl Ausgangsrechnungs-Zeilen.","type":["integer","null"]},"outgoingTotalCents":{"description":"Brutto-Summe der Ausgangsrechnungen in Cent (Gutschriften abgezogen).","type":["integer","null"]},"incomingCount":{"description":"Anzahl Eingangsrechnungs-Zeilen.","type":["integer","null"]},"incomingTotalCents":{"description":"Brutto-Summe der Eingangsrechnungen in Cent.","type":["integer","null"]},"warnings":{"description":"Warnungen (z. B. „N Eingangsrechnungen ohne Sachkonto → Fallback\", „Faktura-Modul\ninaktiv\") — bewusst kein Blocker.","type":["array","null"],"items":{"type":"string"}}}}],"description":"DATEV-Buchungsstapel-Export (04-34 §4.4, Recht `accounting.export.run`, Muster PayrollExportResource).\n- GET export/preview?from&to[&scope=outgoing|incoming|both]: JSON-Vorschau (Zeilen/Summen je Scope + Warnungen); Automation/MCP sehen dieselben Daten wie der Download\n- GET export/file?from&to[&scope][&format=datev-extf]: Download als EXTF-CSV (Windows-1252, `output: false`, Muster PayrollExportFileProvider)\n- from/to Pflicht (400)\n- EXTF-Format bis Steuerberater-Abnahme dokumentierte Annahme (`externalApprovalPending`, 04-34 §9)."},"FinanceDirectDebitReturn-finance_dd_return.read":{"type":"object","description":"Zurueckgegebene Lastschrift — die R-Transaktion (Doc 25 AP 5.2, Restposten).\n\n**Nur Anlegen und Lesen.** Eine Rueckgabe ist ein Bankvorgang; sie nachtraeglich zu aendern hiesse,\neinen Kontoauszug umzuschreiben. Eine irrtuemlich erfasste Rueckgabe wird ueber die Fachwege\nkorrigiert (Zahlung neu erfassen), nicht durch Bearbeiten des Belegs.\n\n**Eigenes Recht, nicht am Zahllauf haengend:** die Erfassung setzt eine bezahlte Rechnung zurueck\nauf offen und kann ein Kundenmandat sperren. Das ist eine andere Verantwortung als das\nZusammenstellen eines Einzugs — und in vielen Betrieben eine andere Person (Debitorenbuchhaltung\nstatt Zahlungsverkehr).","properties":{"ulid":{"type":["string","null"]},"paymentRunItemUlid":{"description":"Die eingezogene Zahllauf-Position, die zurueckkam (Pflicht beim Anlegen).","type":["string","null"]},"paymentRunNumber":{"type":["string","null"]},"invoiceUlid":{"type":["string","null"]},"invoiceNumber":{"type":["string","null"]},"invoiceStatus":{"description":"Status der Rechnung NACH der Rueckgabe — die eigentliche Wirkung, deshalb in der Antwort.","type":["string","null"]},"sepaMandateUlid":{"type":["string","null"]},"mandateReference":{"type":["string","null"]},"mandateRevoked":{"description":"Wurde das Mandat automatisch widerrufen? (Nur bei mandatsbezogenen Gruenden.)","default":false,"type":"boolean"},"reasonCode":{"description":"ISO-20022-Reason-Code der Bank (z. B. AM04, MD01) — optional, MT940 liefert oft keinen.","type":["string","null"]},"reasonCategory":{"description":"Abgeleitete Kategorie: `funds` | `mandate` | `technical` | `unknown` (nur lesbar).","type":["string","null"]},"returnedAmount":{"description":"Rueckgabebetrag in Cent; fehlt er, gilt der eingezogene Betrag.","type":["integer","null"]},"feeAmount":{"description":"Rueckgabegebuehr der Bank in Cent (uns belastet, NICHT dem Kunden weiterbelastet).","type":["integer","null"]},"returnedOn":{"description":"Rueckgabedatum (Y-m-d); fehlt es, gilt heute.","type":["string","null"]},"bankTransactionUlid":{"description":"Bank-Umsatz, aus dem die Rueckgabe stammt — verhindert Doppelerfassung (Unique).","type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"FinanceDirectDebitReturn-finance_dd_return.write":{"type":"object","description":"Zurueckgegebene Lastschrift — die R-Transaktion (Doc 25 AP 5.2, Restposten).\n\n**Nur Anlegen und Lesen.** Eine Rueckgabe ist ein Bankvorgang; sie nachtraeglich zu aendern hiesse,\neinen Kontoauszug umzuschreiben. Eine irrtuemlich erfasste Rueckgabe wird ueber die Fachwege\nkorrigiert (Zahlung neu erfassen), nicht durch Bearbeiten des Belegs.\n\n**Eigenes Recht, nicht am Zahllauf haengend:** die Erfassung setzt eine bezahlte Rechnung zurueck\nauf offen und kann ein Kundenmandat sperren. Das ist eine andere Verantwortung als das\nZusammenstellen eines Einzugs — und in vielen Betrieben eine andere Person (Debitorenbuchhaltung\nstatt Zahlungsverkehr).","properties":{"paymentRunItemUlid":{"description":"Die eingezogene Zahllauf-Position, die zurueckkam (Pflicht beim Anlegen).","type":["string","null"]},"reasonCode":{"description":"ISO-20022-Reason-Code der Bank (z. B. AM04, MD01) — optional, MT940 liefert oft keinen.","type":["string","null"]},"returnedAmount":{"description":"Rueckgabebetrag in Cent; fehlt er, gilt der eingezogene Betrag.","type":["integer","null"]},"feeAmount":{"description":"Rueckgabegebuehr der Bank in Cent (uns belastet, NICHT dem Kunden weiterbelastet).","type":["integer","null"]},"returnedOn":{"description":"Rueckgabedatum (Y-m-d); fehlt es, gilt heute.","type":["string","null"]},"bankTransactionUlid":{"description":"Bank-Umsatz, aus dem die Rueckgabe stammt — verhindert Doppelerfassung (Unique).","type":["string","null"]},"note":{"type":["string","null"]}}},"FinanceDirectDebitReturn.jsonld-finance_dd_return.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"paymentRunItemUlid":{"description":"Die eingezogene Zahllauf-Position, die zurueckkam (Pflicht beim Anlegen).","type":["string","null"]},"paymentRunNumber":{"type":["string","null"]},"invoiceUlid":{"type":["string","null"]},"invoiceNumber":{"type":["string","null"]},"invoiceStatus":{"description":"Status der Rechnung NACH der Rueckgabe — die eigentliche Wirkung, deshalb in der Antwort.","type":["string","null"]},"sepaMandateUlid":{"type":["string","null"]},"mandateReference":{"type":["string","null"]},"mandateRevoked":{"description":"Wurde das Mandat automatisch widerrufen? (Nur bei mandatsbezogenen Gruenden.)","default":false,"type":"boolean"},"reasonCode":{"description":"ISO-20022-Reason-Code der Bank (z. B. AM04, MD01) — optional, MT940 liefert oft keinen.","type":["string","null"]},"reasonCategory":{"description":"Abgeleitete Kategorie: `funds` | `mandate` | `technical` | `unknown` (nur lesbar).","type":["string","null"]},"returnedAmount":{"description":"Rueckgabebetrag in Cent; fehlt er, gilt der eingezogene Betrag.","type":["integer","null"]},"feeAmount":{"description":"Rueckgabegebuehr der Bank in Cent (uns belastet, NICHT dem Kunden weiterbelastet).","type":["integer","null"]},"returnedOn":{"description":"Rueckgabedatum (Y-m-d); fehlt es, gilt heute.","type":["string","null"]},"bankTransactionUlid":{"description":"Bank-Umsatz, aus dem die Rueckgabe stammt — verhindert Doppelerfassung (Unique).","type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Zurueckgegebene Lastschrift — die R-Transaktion (Doc 25 AP 5.2, Restposten).\n\n**Nur Anlegen und Lesen.** Eine Rueckgabe ist ein Bankvorgang; sie nachtraeglich zu aendern hiesse,\neinen Kontoauszug umzuschreiben. Eine irrtuemlich erfasste Rueckgabe wird ueber die Fachwege\nkorrigiert (Zahlung neu erfassen), nicht durch Bearbeiten des Belegs.\n\n**Eigenes Recht, nicht am Zahllauf haengend:** die Erfassung setzt eine bezahlte Rechnung zurueck\nauf offen und kann ein Kundenmandat sperren. Das ist eine andere Verantwortung als das\nZusammenstellen eines Einzugs — und in vielen Betrieben eine andere Person (Debitorenbuchhaltung\nstatt Zahlungsverkehr)."},"FinanceDocumentExtraction-finance_document_extraction.read":{"type":"object","description":"Beleg-Extraktion mit Pflicht-Vorschau (Doc 25 AP 5.4, G13b).\n\n`POST` liest ein Dokument und legt einen **Vorschlag** an — es entsteht KEIN Beleg. Erst\n`/confirm` erzeugt die Eingangsrechnung (als Entwurf, sie gibt sich nicht selbst frei).\n`PATCH` korrigiert den Vorschlag vorher: bestätigt wird, was ein Mensch gesehen hat, nicht was\ndie Maschine vorschlug.\n\n`source` ist die wichtigste Angabe der Antwort: `e_invoice` (deterministisch gelesen, ohne\nSprachmodell), `ai` (geschätzt) oder `none` (kein Text lesbar — ehrlich leer statt geraten).","properties":{"ulid":{"type":["string","null"]},"fileName":{"type":["string","null"]},"status":{"type":["string","null"]},"source":{"description":"e_invoice (deterministisch) | ai (geschätzt) | none (kein Text lesbar).","type":["string","null"]},"origin":{"type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"supplierName":{"type":["string","null"]},"supplierVatId":{"type":["string","null"]},"supplierInvoiceNumber":{"type":["string","null"]},"invoiceDate":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"netAmount":{"type":["integer","null"]},"taxAmount":{"type":["integer","null"]},"grossAmount":{"type":["integer","null"]},"currency":{"type":["string","null"]},"warnings":{"description":"Was am Vorschlag unsicher ist — Schlüssel (`missing_*`, `amounts_incoherent`,\n`supplier_unknown`, `no_text_extractable`, …), damit die Oberfläche übersetzen kann.","type":["array","null"],"items":{"type":"string"}},"confirmable":{"description":"Ist der Vorschlag vollständig genug für einen Beleg?","type":["boolean","null"]},"incomingInvoiceUlid":{"description":"ULID der entstandenen Eingangsrechnung — erst nach der Bestätigung gesetzt.","type":["string","null"]},"confirmedAt":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"FinanceDocumentExtraction-finance_document_extraction.write":{"type":"object","description":"Beleg-Extraktion mit Pflicht-Vorschau (Doc 25 AP 5.4, G13b).\n\n`POST` liest ein Dokument und legt einen **Vorschlag** an — es entsteht KEIN Beleg. Erst\n`/confirm` erzeugt die Eingangsrechnung (als Entwurf, sie gibt sich nicht selbst frei).\n`PATCH` korrigiert den Vorschlag vorher: bestätigt wird, was ein Mensch gesehen hat, nicht was\ndie Maschine vorschlug.\n\n`source` ist die wichtigste Angabe der Antwort: `e_invoice` (deterministisch gelesen, ohne\nSprachmodell), `ai` (geschätzt) oder `none` (kein Text lesbar — ehrlich leer statt geraten).","properties":{"content":{"description":"Dokument als Base64 (nur Schreiben, nur beim Anlegen).","type":["string","null"]},"fileName":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"supplierName":{"type":["string","null"]},"supplierVatId":{"type":["string","null"]},"supplierInvoiceNumber":{"type":["string","null"]},"invoiceDate":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"netAmount":{"type":["integer","null"]},"taxAmount":{"type":["integer","null"]},"grossAmount":{"type":["integer","null"]},"currency":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"FinanceDocumentExtraction-finance_document_extraction.write.jsonMergePatch":{"type":"object","description":"Beleg-Extraktion mit Pflicht-Vorschau (Doc 25 AP 5.4, G13b).\n\n`POST` liest ein Dokument und legt einen **Vorschlag** an — es entsteht KEIN Beleg. Erst\n`/confirm` erzeugt die Eingangsrechnung (als Entwurf, sie gibt sich nicht selbst frei).\n`PATCH` korrigiert den Vorschlag vorher: bestätigt wird, was ein Mensch gesehen hat, nicht was\ndie Maschine vorschlug.\n\n`source` ist die wichtigste Angabe der Antwort: `e_invoice` (deterministisch gelesen, ohne\nSprachmodell), `ai` (geschätzt) oder `none` (kein Text lesbar — ehrlich leer statt geraten).","properties":{"content":{"description":"Dokument als Base64 (nur Schreiben, nur beim Anlegen).","type":["string","null"]},"fileName":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"supplierName":{"type":["string","null"]},"supplierVatId":{"type":["string","null"]},"supplierInvoiceNumber":{"type":["string","null"]},"invoiceDate":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"netAmount":{"type":["integer","null"]},"taxAmount":{"type":["integer","null"]},"grossAmount":{"type":["integer","null"]},"currency":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"FinanceDocumentExtraction.jsonld-finance_document_extraction.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"fileName":{"type":["string","null"]},"status":{"type":["string","null"]},"source":{"description":"e_invoice (deterministisch) | ai (geschätzt) | none (kein Text lesbar).","type":["string","null"]},"origin":{"type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"supplierName":{"type":["string","null"]},"supplierVatId":{"type":["string","null"]},"supplierInvoiceNumber":{"type":["string","null"]},"invoiceDate":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"netAmount":{"type":["integer","null"]},"taxAmount":{"type":["integer","null"]},"grossAmount":{"type":["integer","null"]},"currency":{"type":["string","null"]},"warnings":{"description":"Was am Vorschlag unsicher ist — Schlüssel (`missing_*`, `amounts_incoherent`,\n`supplier_unknown`, `no_text_extractable`, …), damit die Oberfläche übersetzen kann.","type":["array","null"],"items":{"type":"string"}},"confirmable":{"description":"Ist der Vorschlag vollständig genug für einen Beleg?","type":["boolean","null"]},"incomingInvoiceUlid":{"description":"ULID der entstandenen Eingangsrechnung — erst nach der Bestätigung gesetzt.","type":["string","null"]},"confirmedAt":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}}],"description":"Beleg-Extraktion mit Pflicht-Vorschau (Doc 25 AP 5.4, G13b).\n\n`POST` liest ein Dokument und legt einen **Vorschlag** an — es entsteht KEIN Beleg. Erst\n`/confirm` erzeugt die Eingangsrechnung (als Entwurf, sie gibt sich nicht selbst frei).\n`PATCH` korrigiert den Vorschlag vorher: bestätigt wird, was ein Mensch gesehen hat, nicht was\ndie Maschine vorschlug.\n\n`source` ist die wichtigste Angabe der Antwort: `e_invoice` (deterministisch gelesen, ohne\nSprachmodell), `ai` (geschätzt) oder `none` (kein Text lesbar — ehrlich leer statt geraten)."},"FinanceEInvoiceImport-finance_einvoice_import.read":{"type":"object","description":"E-Rechnungs-Import (Doc 25 AP 1.2, ENT-ERP-PAR-EINVOICE-01).\n\nNimmt eine XRechnung (UBL-XML) oder eine ZUGFeRD-/Factur-X-Rechnung (PDF mit Anlage) entgegen\nund legt daraus eine **vorbefüllte Eingangsrechnung im Entwurf** an. Gelesen wird\ndeterministisch — eine E-Rechnung ist bereits strukturiert; sie durch ein Sprachmodell zu\nschicken hiesse, eine exakte Angabe gegen eine wahrscheinliche einzutauschen.\n\nDie Antwort nennt neben dem angelegten Beleg auch, WAS der Beleg nicht hergab\n(`missingFields`) — der Anwender sieht damit sofort, was er nachtragen muss, statt es zu suchen.","properties":{"ulid":{"description":"Synthetische Kennung (Aggregat-Antwort ohne eigene Entity).","type":["string","null"]},"incomingInvoiceUlid":{"description":"ULID der angelegten Eingangsrechnung.","type":["string","null"]},"format":{"description":"Erkanntes Format: `ubl` (XRechnung) oder `cii` (ZUGFeRD/Factur-X).","type":["string","null"]},"supplierMatched":{"description":"Wurde ein Lieferant eindeutig zugeordnet? Sonst muss der Anwender zuordnen.","type":["boolean","null"]},"missingFields":{"description":"Felder, die der Beleg NICHT enthielt und die nachzutragen sind.","type":["array","null"],"items":{"type":"string"}}}},"FinanceEInvoiceImport-finance_einvoice_import.write":{"type":"object","description":"E-Rechnungs-Import (Doc 25 AP 1.2, ENT-ERP-PAR-EINVOICE-01).\n\nNimmt eine XRechnung (UBL-XML) oder eine ZUGFeRD-/Factur-X-Rechnung (PDF mit Anlage) entgegen\nund legt daraus eine **vorbefüllte Eingangsrechnung im Entwurf** an. Gelesen wird\ndeterministisch — eine E-Rechnung ist bereits strukturiert; sie durch ein Sprachmodell zu\nschicken hiesse, eine exakte Angabe gegen eine wahrscheinliche einzutauschen.\n\nDie Antwort nennt neben dem angelegten Beleg auch, WAS der Beleg nicht hergab\n(`missingFields`) — der Anwender sieht damit sofort, was er nachtragen muss, statt es zu suchen.","required":["content"],"properties":{"content":{"description":"Dateiinhalt Base64-kodiert: XRechnung-XML oder ZUGFeRD-PDF (Pflicht).","type":["string","null"]},"brandId":{"description":"Marke der entstehenden Eingangsrechnung; leer = markenneutral.","type":["integer","null"]},"fileId":{"description":"Optionaler FK-loser Verweis auf die bereits abgelegte Originaldatei (Beleg-Nachweis).","type":["integer","null"]}}},"FinanceEInvoiceImport.jsonld-finance_einvoice_import.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische Kennung (Aggregat-Antwort ohne eigene Entity).","type":["string","null"]},"incomingInvoiceUlid":{"description":"ULID der angelegten Eingangsrechnung.","type":["string","null"]},"format":{"description":"Erkanntes Format: `ubl` (XRechnung) oder `cii` (ZUGFeRD/Factur-X).","type":["string","null"]},"supplierMatched":{"description":"Wurde ein Lieferant eindeutig zugeordnet? Sonst muss der Anwender zuordnen.","type":["boolean","null"]},"missingFields":{"description":"Felder, die der Beleg NICHT enthielt und die nachzutragen sind.","type":["array","null"],"items":{"type":"string"}}}}],"description":"E-Rechnungs-Import (Doc 25 AP 1.2, ENT-ERP-PAR-EINVOICE-01).\n\nNimmt eine XRechnung (UBL-XML) oder eine ZUGFeRD-/Factur-X-Rechnung (PDF mit Anlage) entgegen\nund legt daraus eine **vorbefüllte Eingangsrechnung im Entwurf** an. Gelesen wird\ndeterministisch — eine E-Rechnung ist bereits strukturiert; sie durch ein Sprachmodell zu\nschicken hiesse, eine exakte Angabe gegen eine wahrscheinliche einzutauschen.\n\nDie Antwort nennt neben dem angelegten Beleg auch, WAS der Beleg nicht hergab\n(`missingFields`) — der Anwender sieht damit sofort, was er nachtragen muss, statt es zu suchen."},"FinanceIncomingInvoice-finance_incoming_invoice.read":{"type":"object","description":"Eingangsrechnungs-Resource: CRUD im Erfassungs-Zustand + Workflow-Aktionen.\n- approve: captured → approved\n- mark-paid: captured|approved → paid (setzt paidAmount = grossAmount)\n- ER-Nummer wird beim Erfassen aus dem Markenkreis gezogen (nicht-gapless)\n- PATCH/DELETE nur solange `captured` (409 danach)\n- ULID-Routen mit Format-Requirement (Muster SalesOrder).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"description":"Interne Belegnummer (ER-…, nicht-gapless) — beim Erfassen gezogen, sofern Marke gesetzt.","type":["string","null"]},"supplierInvoiceNumber":{"maxLength":100,"description":"Rechnungsnummer des Lieferanten (Pflicht beim Erfassen).","type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"supplierName":{"maxLength":200,"description":"Lieferanten-Name als Snapshot (Pflicht beim Erfassen).","type":["string","null"]},"invoiceDate":{"description":"Rechnungsdatum (Y-m-d, Pflicht beim Erfassen).","type":["string","null"]},"dueDate":{"description":"Fälligkeit (Y-m-d).","type":["string","null"]},"netAmount":{"description":"Netto in Cent (Pflicht beim Erfassen; net + tax muss gross ergeben — sonst 422).","type":["integer","null"]},"taxAmount":{"description":"USt in Cent (Default: gross − net).","type":["integer","null"]},"grossAmount":{"description":"Brutto in Cent (Pflicht beim Erfassen).","type":["integer","null"]},"taxRatePercent":{"description":"Steuersatz in Prozent (z. B. \"19.00\").","type":["string","null"]},"statusId":{"description":"Lebenszyklus-Status (read-only — Übergänge laufen über approve/mark-paid).","type":["string","null"]},"paidAmount":{"description":"Gezahlter Betrag in Cent (read-only — mark-paid setzt ihn auf grossAmount).","type":["integer","null"]},"cashDiscountAmount":{"description":"Gewährter Skontoabzug in Cent (Doc 25 AP 5.1) — der Teil des Bruttobetrags, der\nfristgerecht nicht überwiesen wurde und trotzdem keine offene Forderung ist.","type":["integer","null"]},"openAmount":{"description":"Noch offener Betrag in Cent: brutto − gezahlt − gewährter Skonto.","type":["integer","null"]},"paymentTermUlid":{"description":"Rechenbare Zahlungsbedingung (Stammdaten-Katalog). Beim Erfassen aus dem Lieferanten-Stamm\nvorbelegt und danach am Beleg EINGEFROREN — eine spätere Konditions-Änderung verschiebt\nden Skontoabzug einer bereits erfassten Rechnung nicht.","type":["string","null"]},"paymentTermDays":{"description":"Eingefrorene Nettofrist in Tagen.","type":["integer","null"]},"paymentTermDiscounts":{"description":"Eingefrorene Skontostufen `{days, percentBp}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"paidAt":{"description":"Zahlzeitpunkt (read; als Schreibfeld nur im mark-paid-Body {paidAt?, note?}).","type":["string","null"]},"fileId":{"minimum":0,"exclusiveMinimum":0,"description":"Original-Beleg (PDF) im File-Modul (FK-los).","type":["integer","null"]},"fileUlid":{"description":"ULID des Original-Belegs (Platform-File) — Download via `/v1/platform/files/{ulid}/download` (read-only, aus fileId aufgelöst; Muster ShipmentResource).","type":["string","null"]},"goodsOrderId":{"minimum":0,"exclusiveMinimum":0,"description":"Zugehörige Waren-Bestellung (04-23, FK-los).","type":["integer","null"]},"matchStatusId":{"description":"Urteil des letzten 3-Wege-Abgleichs (Doc 25 AP 7.4): `null` = nie abgeglichen ·\n`unmatched` = nichts zu vergleichen · `matched` = in Toleranz · `deviation` = Klärfall.","type":["string","null"]},"matchedAt":{"description":"Zeitpunkt des letzten Abgleichs.","type":["string","null"]},"matchResult":{"description":"Schnappschuss des Abgleichs zu diesem Zeitpunkt (Soll/Ist/Abweichung/Toleranz/Gründe).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"ledgerAccount":{"maxLength":20,"description":"Sachkonto (SKR) für den DATEV-Export (Teil 2).","type":["string","null"]},"costCenter":{"maxLength":50,"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"FinanceIncomingInvoice-finance_incoming_invoice.write":{"type":"object","description":"Eingangsrechnungs-Resource: CRUD im Erfassungs-Zustand + Workflow-Aktionen.\n- approve: captured → approved\n- mark-paid: captured|approved → paid (setzt paidAmount = grossAmount)\n- ER-Nummer wird beim Erfassen aus dem Markenkreis gezogen (nicht-gapless)\n- PATCH/DELETE nur solange `captured` (409 danach)\n- ULID-Routen mit Format-Requirement (Muster SalesOrder).","properties":{"supplierInvoiceNumber":{"maxLength":100,"description":"Rechnungsnummer des Lieferanten (Pflicht beim Erfassen).","type":["string","null"]},"supplierRoleUlid":{"maxLength":26,"description":"Lieferanten-Rolle (04-29) — per ULID adressiert (Pflicht beim Erfassen, Muster GoodsOrder).","type":["string","null"]},"supplierName":{"maxLength":200,"description":"Lieferanten-Name als Snapshot (Pflicht beim Erfassen).","type":["string","null"]},"invoiceDate":{"description":"Rechnungsdatum (Y-m-d, Pflicht beim Erfassen).","type":["string","null"]},"dueDate":{"description":"Fälligkeit (Y-m-d).","type":["string","null"]},"netAmount":{"description":"Netto in Cent (Pflicht beim Erfassen; net + tax muss gross ergeben — sonst 422).","type":["integer","null"]},"taxAmount":{"description":"USt in Cent (Default: gross − net).","type":["integer","null"]},"grossAmount":{"description":"Brutto in Cent (Pflicht beim Erfassen).","type":["integer","null"]},"taxRatePercent":{"description":"Steuersatz in Prozent (z. B. \"19.00\").","type":["string","null"]},"paymentTermUlid":{"description":"Rechenbare Zahlungsbedingung (Stammdaten-Katalog). Beim Erfassen aus dem Lieferanten-Stamm\nvorbelegt und danach am Beleg EINGEFROREN — eine spätere Konditions-Änderung verschiebt\nden Skontoabzug einer bereits erfassten Rechnung nicht.","type":["string","null"]},"paidAt":{"description":"Zahlzeitpunkt (read; als Schreibfeld nur im mark-paid-Body {paidAt?, note?}).","type":["string","null"]},"note":{"maxLength":500,"description":"Nur mark-paid-Aktion: Bemerkung — wird den Notizen angefügt.","type":["string","null"]},"fileId":{"minimum":0,"exclusiveMinimum":0,"description":"Original-Beleg (PDF) im File-Modul (FK-los).","type":["integer","null"]},"goodsOrderId":{"minimum":0,"exclusiveMinimum":0,"description":"Zugehörige Waren-Bestellung (04-23, FK-los).","type":["integer","null"]},"ledgerAccount":{"maxLength":20,"description":"Sachkonto (SKR) für den DATEV-Export (Teil 2).","type":["string","null"]},"costCenter":{"maxLength":50,"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"FinanceIncomingInvoice-finance_incoming_invoice.write.jsonMergePatch":{"type":"object","description":"Eingangsrechnungs-Resource: CRUD im Erfassungs-Zustand + Workflow-Aktionen.\n- approve: captured → approved\n- mark-paid: captured|approved → paid (setzt paidAmount = grossAmount)\n- ER-Nummer wird beim Erfassen aus dem Markenkreis gezogen (nicht-gapless)\n- PATCH/DELETE nur solange `captured` (409 danach)\n- ULID-Routen mit Format-Requirement (Muster SalesOrder).","properties":{"supplierInvoiceNumber":{"maxLength":100,"description":"Rechnungsnummer des Lieferanten (Pflicht beim Erfassen).","type":["string","null"]},"supplierRoleUlid":{"maxLength":26,"description":"Lieferanten-Rolle (04-29) — per ULID adressiert (Pflicht beim Erfassen, Muster GoodsOrder).","type":["string","null"]},"supplierName":{"maxLength":200,"description":"Lieferanten-Name als Snapshot (Pflicht beim Erfassen).","type":["string","null"]},"invoiceDate":{"description":"Rechnungsdatum (Y-m-d, Pflicht beim Erfassen).","type":["string","null"]},"dueDate":{"description":"Fälligkeit (Y-m-d).","type":["string","null"]},"netAmount":{"description":"Netto in Cent (Pflicht beim Erfassen; net + tax muss gross ergeben — sonst 422).","type":["integer","null"]},"taxAmount":{"description":"USt in Cent (Default: gross − net).","type":["integer","null"]},"grossAmount":{"description":"Brutto in Cent (Pflicht beim Erfassen).","type":["integer","null"]},"taxRatePercent":{"description":"Steuersatz in Prozent (z. B. \"19.00\").","type":["string","null"]},"paymentTermUlid":{"description":"Rechenbare Zahlungsbedingung (Stammdaten-Katalog). Beim Erfassen aus dem Lieferanten-Stamm\nvorbelegt und danach am Beleg EINGEFROREN — eine spätere Konditions-Änderung verschiebt\nden Skontoabzug einer bereits erfassten Rechnung nicht.","type":["string","null"]},"paidAt":{"description":"Zahlzeitpunkt (read; als Schreibfeld nur im mark-paid-Body {paidAt?, note?}).","type":["string","null"]},"note":{"maxLength":500,"description":"Nur mark-paid-Aktion: Bemerkung — wird den Notizen angefügt.","type":["string","null"]},"fileId":{"minimum":0,"exclusiveMinimum":0,"description":"Original-Beleg (PDF) im File-Modul (FK-los).","type":["integer","null"]},"goodsOrderId":{"minimum":0,"exclusiveMinimum":0,"description":"Zugehörige Waren-Bestellung (04-23, FK-los).","type":["integer","null"]},"ledgerAccount":{"maxLength":20,"description":"Sachkonto (SKR) für den DATEV-Export (Teil 2).","type":["string","null"]},"costCenter":{"maxLength":50,"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"FinanceIncomingInvoice.jsonld-finance_incoming_invoice.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"description":"Interne Belegnummer (ER-…, nicht-gapless) — beim Erfassen gezogen, sofern Marke gesetzt.","type":["string","null"]},"supplierInvoiceNumber":{"maxLength":100,"description":"Rechnungsnummer des Lieferanten (Pflicht beim Erfassen).","type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"supplierName":{"maxLength":200,"description":"Lieferanten-Name als Snapshot (Pflicht beim Erfassen).","type":["string","null"]},"invoiceDate":{"description":"Rechnungsdatum (Y-m-d, Pflicht beim Erfassen).","type":["string","null"]},"dueDate":{"description":"Fälligkeit (Y-m-d).","type":["string","null"]},"netAmount":{"description":"Netto in Cent (Pflicht beim Erfassen; net + tax muss gross ergeben — sonst 422).","type":["integer","null"]},"taxAmount":{"description":"USt in Cent (Default: gross − net).","type":["integer","null"]},"grossAmount":{"description":"Brutto in Cent (Pflicht beim Erfassen).","type":["integer","null"]},"taxRatePercent":{"description":"Steuersatz in Prozent (z. B. \"19.00\").","type":["string","null"]},"statusId":{"description":"Lebenszyklus-Status (read-only — Übergänge laufen über approve/mark-paid).","type":["string","null"]},"paidAmount":{"description":"Gezahlter Betrag in Cent (read-only — mark-paid setzt ihn auf grossAmount).","type":["integer","null"]},"cashDiscountAmount":{"description":"Gewährter Skontoabzug in Cent (Doc 25 AP 5.1) — der Teil des Bruttobetrags, der\nfristgerecht nicht überwiesen wurde und trotzdem keine offene Forderung ist.","type":["integer","null"]},"openAmount":{"description":"Noch offener Betrag in Cent: brutto − gezahlt − gewährter Skonto.","type":["integer","null"]},"paymentTermUlid":{"description":"Rechenbare Zahlungsbedingung (Stammdaten-Katalog). Beim Erfassen aus dem Lieferanten-Stamm\nvorbelegt und danach am Beleg EINGEFROREN — eine spätere Konditions-Änderung verschiebt\nden Skontoabzug einer bereits erfassten Rechnung nicht.","type":["string","null"]},"paymentTermDays":{"description":"Eingefrorene Nettofrist in Tagen.","type":["integer","null"]},"paymentTermDiscounts":{"description":"Eingefrorene Skontostufen `{days, percentBp}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"paidAt":{"description":"Zahlzeitpunkt (read; als Schreibfeld nur im mark-paid-Body {paidAt?, note?}).","type":["string","null"]},"fileId":{"minimum":0,"exclusiveMinimum":0,"description":"Original-Beleg (PDF) im File-Modul (FK-los).","type":["integer","null"]},"fileUlid":{"description":"ULID des Original-Belegs (Platform-File) — Download via `/v1/platform/files/{ulid}/download` (read-only, aus fileId aufgelöst; Muster ShipmentResource).","type":["string","null"]},"goodsOrderId":{"minimum":0,"exclusiveMinimum":0,"description":"Zugehörige Waren-Bestellung (04-23, FK-los).","type":["integer","null"]},"matchStatusId":{"description":"Urteil des letzten 3-Wege-Abgleichs (Doc 25 AP 7.4): `null` = nie abgeglichen ·\n`unmatched` = nichts zu vergleichen · `matched` = in Toleranz · `deviation` = Klärfall.","type":["string","null"]},"matchedAt":{"description":"Zeitpunkt des letzten Abgleichs.","type":["string","null"]},"matchResult":{"description":"Schnappschuss des Abgleichs zu diesem Zeitpunkt (Soll/Ist/Abweichung/Toleranz/Gründe).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"ledgerAccount":{"maxLength":20,"description":"Sachkonto (SKR) für den DATEV-Export (Teil 2).","type":["string","null"]},"costCenter":{"maxLength":50,"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}}],"description":"Eingangsrechnungs-Resource: CRUD im Erfassungs-Zustand + Workflow-Aktionen.\n- approve: captured → approved\n- mark-paid: captured|approved → paid (setzt paidAmount = grossAmount)\n- ER-Nummer wird beim Erfassen aus dem Markenkreis gezogen (nicht-gapless)\n- PATCH/DELETE nur solange `captured` (409 danach)\n- ULID-Routen mit Format-Requirement (Muster SalesOrder)."},"FinanceIncomingInvoiceMatch":{"type":"object","description":"3-Wege-Abgleich einer Eingangsrechnung (Doc 25 AP 7.4): **Bestellung → Wareneingang → Rechnung**.\n\nZwei Operationen mit einem klaren Unterschied:\n- **GET** rechnet und antwortet, ohne irgendetwas zu ändern — die Klärfall-Ansicht.\n- **POST** hält das Urteil am Beleg fest und gibt die Rechnung frei, wenn sie in Toleranz liegt\n  und der Betreiber die Auto-Freigabe eingeschaltet hat. Deshalb verlangt POST das\n  Freigabe-Recht: eine Aktion, die freigeben KANN, darf nicht am Freigabe-Recht vorbei laufen.","properties":{"ulid":{"description":"ULID der abgeglichenen Eingangsrechnung.","type":["string","null"]},"status":{"description":"unmatched (nichts zu vergleichen) | matched (in Toleranz) | deviation (Klärfall).","type":["string","null"]},"invoiceStatusId":{"description":"Status der Rechnung NACH dem Abgleich — bei POST verrät er, ob auto-freigegeben wurde.","type":["string","null"]},"autoApproved":{"description":"true, wenn genau dieser Aufruf die Rechnung freigegeben hat.","type":["boolean","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderNumber":{"type":["string","null"]},"orderedNet":{"description":"Bestellwert netto in Cent (Kontext — verglichen wird gegen den Wareneingang).","type":["integer","null"]},"receivedNet":{"description":"SOLL: Wert der eingegangenen Menge zum Bestellpreis, netto in Cent.","type":["integer","null"]},"invoiceNet":{"description":"Netto dieser einen Rechnung in Cent.","type":["integer","null"]},"invoicedNet":{"description":"IST: Summe ALLER nicht stornierten Rechnungen dieser Bestellung, netto in Cent.","type":["integer","null"]},"deviation":{"description":"IST − SOLL in Cent (positiv = es wird mehr verlangt als geliefert wurde).","type":["integer","null"]},"allowedDeviation":{"description":"Erlaubte Abweichung in Cent nach der geltenden Toleranz.","type":["integer","null"]},"tolerance":{"description":"Geltende Toleranz `{percentBp, absAmount, source}` — `source` sagt, woher sie kommt\n(default | supplier | mixed).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}},"reasons":{"description":"Blockierende Gründe (leer = in Ordnung): no_order · order_missing · order_not_ordered ·\nsupplier_mismatch · nothing_received · amount_over_tolerance.","type":["array","null"],"items":{"type":"string"}},"notes":{"description":"Hinweise, die nicht blockieren: over_delivery · partial_receipt · multiple_invoices.","type":["array","null"],"items":{"type":"string"}},"positions":{"description":"Positions-Aufschlüsselung des Sollwerts.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"FinanceIncomingInvoiceMatch-finance_incoming_invoice_match.read":{"type":"object","description":"3-Wege-Abgleich einer Eingangsrechnung (Doc 25 AP 7.4): **Bestellung → Wareneingang → Rechnung**.\n\nZwei Operationen mit einem klaren Unterschied:\n- **GET** rechnet und antwortet, ohne irgendetwas zu ändern — die Klärfall-Ansicht.\n- **POST** hält das Urteil am Beleg fest und gibt die Rechnung frei, wenn sie in Toleranz liegt\n  und der Betreiber die Auto-Freigabe eingeschaltet hat. Deshalb verlangt POST das\n  Freigabe-Recht: eine Aktion, die freigeben KANN, darf nicht am Freigabe-Recht vorbei laufen.","properties":{"ulid":{"description":"ULID der abgeglichenen Eingangsrechnung.","type":["string","null"]},"status":{"description":"unmatched (nichts zu vergleichen) | matched (in Toleranz) | deviation (Klärfall).","type":["string","null"]},"invoiceStatusId":{"description":"Status der Rechnung NACH dem Abgleich — bei POST verrät er, ob auto-freigegeben wurde.","type":["string","null"]},"autoApproved":{"description":"true, wenn genau dieser Aufruf die Rechnung freigegeben hat.","type":["boolean","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderNumber":{"type":["string","null"]},"orderedNet":{"description":"Bestellwert netto in Cent (Kontext — verglichen wird gegen den Wareneingang).","type":["integer","null"]},"receivedNet":{"description":"SOLL: Wert der eingegangenen Menge zum Bestellpreis, netto in Cent.","type":["integer","null"]},"invoiceNet":{"description":"Netto dieser einen Rechnung in Cent.","type":["integer","null"]},"invoicedNet":{"description":"IST: Summe ALLER nicht stornierten Rechnungen dieser Bestellung, netto in Cent.","type":["integer","null"]},"deviation":{"description":"IST − SOLL in Cent (positiv = es wird mehr verlangt als geliefert wurde).","type":["integer","null"]},"allowedDeviation":{"description":"Erlaubte Abweichung in Cent nach der geltenden Toleranz.","type":["integer","null"]},"tolerance":{"description":"Geltende Toleranz `{percentBp, absAmount, source}` — `source` sagt, woher sie kommt\n(default | supplier | mixed).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}},"reasons":{"description":"Blockierende Gründe (leer = in Ordnung): no_order · order_missing · order_not_ordered ·\nsupplier_mismatch · nothing_received · amount_over_tolerance.","type":["array","null"],"items":{"type":"string"}},"notes":{"description":"Hinweise, die nicht blockieren: over_delivery · partial_receipt · multiple_invoices.","type":["array","null"],"items":{"type":"string"}},"positions":{"description":"Positions-Aufschlüsselung des Sollwerts.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"FinanceIncomingInvoiceMatch.jsonld-finance_incoming_invoice_match.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID der abgeglichenen Eingangsrechnung.","type":["string","null"]},"status":{"description":"unmatched (nichts zu vergleichen) | matched (in Toleranz) | deviation (Klärfall).","type":["string","null"]},"invoiceStatusId":{"description":"Status der Rechnung NACH dem Abgleich — bei POST verrät er, ob auto-freigegeben wurde.","type":["string","null"]},"autoApproved":{"description":"true, wenn genau dieser Aufruf die Rechnung freigegeben hat.","type":["boolean","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderNumber":{"type":["string","null"]},"orderedNet":{"description":"Bestellwert netto in Cent (Kontext — verglichen wird gegen den Wareneingang).","type":["integer","null"]},"receivedNet":{"description":"SOLL: Wert der eingegangenen Menge zum Bestellpreis, netto in Cent.","type":["integer","null"]},"invoiceNet":{"description":"Netto dieser einen Rechnung in Cent.","type":["integer","null"]},"invoicedNet":{"description":"IST: Summe ALLER nicht stornierten Rechnungen dieser Bestellung, netto in Cent.","type":["integer","null"]},"deviation":{"description":"IST − SOLL in Cent (positiv = es wird mehr verlangt als geliefert wurde).","type":["integer","null"]},"allowedDeviation":{"description":"Erlaubte Abweichung in Cent nach der geltenden Toleranz.","type":["integer","null"]},"tolerance":{"description":"Geltende Toleranz `{percentBp, absAmount, source}` — `source` sagt, woher sie kommt\n(default | supplier | mixed).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}},"reasons":{"description":"Blockierende Gründe (leer = in Ordnung): no_order · order_missing · order_not_ordered ·\nsupplier_mismatch · nothing_received · amount_over_tolerance.","type":["array","null"],"items":{"type":"string"}},"notes":{"description":"Hinweise, die nicht blockieren: over_delivery · partial_receipt · multiple_invoices.","type":["array","null"],"items":{"type":"string"}},"positions":{"description":"Positions-Aufschlüsselung des Sollwerts.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"3-Wege-Abgleich einer Eingangsrechnung (Doc 25 AP 7.4): **Bestellung → Wareneingang → Rechnung**.\n\nZwei Operationen mit einem klaren Unterschied:\n- **GET** rechnet und antwortet, ohne irgendetwas zu ändern — die Klärfall-Ansicht.\n- **POST** hält das Urteil am Beleg fest und gibt die Rechnung frei, wenn sie in Toleranz liegt\n  und der Betreiber die Auto-Freigabe eingeschaltet hat. Deshalb verlangt POST das\n  Freigabe-Recht: eine Aktion, die freigeben KANN, darf nicht am Freigabe-Recht vorbei laufen."},"FinancePaymentProposal-finance_payment_proposal.read":{"type":"object","description":"Zahlungsvorschlag (Doc 25 AP 5.1): welche freigegebenen Eingangsrechnungen an einem bestimmten\nTag zu zahlen sind — mit Begruendung je Zeile (Skontofrist / faellig / ueberfaellig).\n\nBewusst eine reine LESE-Sicht ohne eigenen Zustand: sie beantwortet „was waere zu tun\", der\nZahllauf ist die Entscheidung. `blockedRows` sind die Rechnungen, die zahlbar WAEREN, aber keine\nIBAN haben — sie stehen ausdruecklich drin, damit sie jemand in Ordnung bringt, statt\nstillschweigend zu verschwinden.","properties":{"ulid":{"description":"Synthetische ULID (Aggregat-Antwort ohne Entity — Muster DatevExport).","type":["string","null"]},"bankAccountUlid":{"type":["string","null"]},"executionDate":{"type":["string","null"]},"horizonDays":{"type":["integer","null"]},"payableTotal":{"description":"Summe der Zahlbeträge aller zahlbaren Zeilen in Cent.","type":["integer","null"]},"discountTotal":{"description":"Summe der Skontobeträge, die dieser Ausführungstag noch hergibt.","type":["integer","null"]},"rows":{"description":"Zahlbare Zeilen.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"blockedRows":{"description":"Zeilen mit Sperrgrund (`iban_missing`, `supplier_missing`) — sichtbar, aber nicht zahlbar.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"FinancePaymentProposal.jsonld-finance_payment_proposal.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische ULID (Aggregat-Antwort ohne Entity — Muster DatevExport).","type":["string","null"]},"bankAccountUlid":{"type":["string","null"]},"executionDate":{"type":["string","null"]},"horizonDays":{"type":["integer","null"]},"payableTotal":{"description":"Summe der Zahlbeträge aller zahlbaren Zeilen in Cent.","type":["integer","null"]},"discountTotal":{"description":"Summe der Skontobeträge, die dieser Ausführungstag noch hergibt.","type":["integer","null"]},"rows":{"description":"Zahlbare Zeilen.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"blockedRows":{"description":"Zeilen mit Sperrgrund (`iban_missing`, `supplier_missing`) — sichtbar, aber nicht zahlbar.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Zahlungsvorschlag (Doc 25 AP 5.1): welche freigegebenen Eingangsrechnungen an einem bestimmten\nTag zu zahlen sind — mit Begruendung je Zeile (Skontofrist / faellig / ueberfaellig).\n\nBewusst eine reine LESE-Sicht ohne eigenen Zustand: sie beantwortet „was waere zu tun\", der\nZahllauf ist die Entscheidung. `blockedRows` sind die Rechnungen, die zahlbar WAEREN, aber keine\nIBAN haben — sie stehen ausdruecklich drin, damit sie jemand in Ordnung bringt, statt\nstillschweigend zu verschwinden."},"FinancePaymentRun-finance_payment_run.read":{"type":"object","description":"SEPA-Zahllauf (Doc 25 AP 5.1, G11) — der Weg vom Zahlungsvorschlag zur Bankdatei.\n\nDrei Rechte, drei Rollen: `view` (sehen), `manage` (zusammenstellen/verwerfen), `execute`\n(Datei ziehen und Ausfuehrung vermerken). Das ist der uebliche Schnitt im Zahlungsverkehr —\nwer Rechnungen zusammenstellt, muss nicht derselbe sein, der das Geld auf den Weg bringt.\n\n**Kein PATCH, kein DELETE.** Ein Lauf wird angelegt oder verworfen; eine Zusammenstellung\nnachtraeglich zu veraendern hiesse, eine bereits erzeugte Bankdatei zu widerlegen. Verworfen\nwerden kann bis zur Ausfuehrung — danach ist das Geld unterwegs.","properties":{"ulid":{"type":["string","null"]},"number":{"description":"Interne Belegnummer (ZL-…), NULL ohne Marke.","type":["string","null"]},"type":{"description":"`credit_transfer` (Überweisung an Lieferanten, pain.001) oder `direct_debit` (Einzug beim\nKunden, pain.008). Default beim Anlegen: Überweisung.","type":["string","null"]},"statusId":{"type":["string","null"]},"bankAccountUlid":{"description":"Belastetes eigenes Bankkonto (Pflicht beim Anlegen).","type":["string","null"]},"bankAccountName":{"type":["string","null"]},"executionDate":{"description":"Gewünschtes Ausführungsdatum (Y-m-d, Pflicht beim Anlegen).","type":["string","null"]},"totalAmount":{"description":"Summe der Zahlbeträge in Cent.","type":["integer","null"]},"itemCount":{"type":["integer","null"]},"discountTotal":{"description":"Summe der gezogenen Skontobeträge in Cent — was der Lauf gespart hat.","type":["integer","null"]},"messageId":{"type":["string","null"]},"sepaFormat":{"description":"Erzeugtes Nachrichtenformat, z. B. `pain.001.001.09`.","type":["string","null"]},"exportedAt":{"type":["string","null"]},"executedAt":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen (nur in der Einzelansicht gefüllt).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"FinancePaymentRun-finance_payment_run.write":{"type":"object","description":"SEPA-Zahllauf (Doc 25 AP 5.1, G11) — der Weg vom Zahlungsvorschlag zur Bankdatei.\n\nDrei Rechte, drei Rollen: `view` (sehen), `manage` (zusammenstellen/verwerfen), `execute`\n(Datei ziehen und Ausfuehrung vermerken). Das ist der uebliche Schnitt im Zahlungsverkehr —\nwer Rechnungen zusammenstellt, muss nicht derselbe sein, der das Geld auf den Weg bringt.\n\n**Kein PATCH, kein DELETE.** Ein Lauf wird angelegt oder verworfen; eine Zusammenstellung\nnachtraeglich zu veraendern hiesse, eine bereits erzeugte Bankdatei zu widerlegen. Verworfen\nwerden kann bis zur Ausfuehrung — danach ist das Geld unterwegs.","properties":{"type":{"description":"`credit_transfer` (Überweisung an Lieferanten, pain.001) oder `direct_debit` (Einzug beim\nKunden, pain.008). Default beim Anlegen: Überweisung.","type":["string","null"]},"bankAccountUlid":{"description":"Belastetes eigenes Bankkonto (Pflicht beim Anlegen).","type":["string","null"]},"executionDate":{"description":"Gewünschtes Ausführungsdatum (Y-m-d, Pflicht beim Anlegen).","type":["string","null"]},"horizonDays":{"description":"Vorlauf in Tagen: wie weit über das Ausführungsdatum hinaus eine Fälligkeit noch\nmitgenommen wird (Default aus `accounting.sepa.proposal_horizon_days`).","type":["integer","null"]},"invoiceUlids":{"description":"Auswahl aus dem Vorschlag (Eingangsrechnungs-ULIDs). Fehlt sie, wird alles Zahlbare\nübernommen.","type":["array","null"],"items":{"type":"string"}},"notes":{"type":["string","null"]}}},"FinancePaymentRun.jsonld-finance_payment_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"number":{"description":"Interne Belegnummer (ZL-…), NULL ohne Marke.","type":["string","null"]},"type":{"description":"`credit_transfer` (Überweisung an Lieferanten, pain.001) oder `direct_debit` (Einzug beim\nKunden, pain.008). Default beim Anlegen: Überweisung.","type":["string","null"]},"statusId":{"type":["string","null"]},"bankAccountUlid":{"description":"Belastetes eigenes Bankkonto (Pflicht beim Anlegen).","type":["string","null"]},"bankAccountName":{"type":["string","null"]},"executionDate":{"description":"Gewünschtes Ausführungsdatum (Y-m-d, Pflicht beim Anlegen).","type":["string","null"]},"totalAmount":{"description":"Summe der Zahlbeträge in Cent.","type":["integer","null"]},"itemCount":{"type":["integer","null"]},"discountTotal":{"description":"Summe der gezogenen Skontobeträge in Cent — was der Lauf gespart hat.","type":["integer","null"]},"messageId":{"type":["string","null"]},"sepaFormat":{"description":"Erzeugtes Nachrichtenformat, z. B. `pain.001.001.09`.","type":["string","null"]},"exportedAt":{"type":["string","null"]},"executedAt":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen (nur in der Einzelansicht gefüllt).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"SEPA-Zahllauf (Doc 25 AP 5.1, G11) — der Weg vom Zahlungsvorschlag zur Bankdatei.\n\nDrei Rechte, drei Rollen: `view` (sehen), `manage` (zusammenstellen/verwerfen), `execute`\n(Datei ziehen und Ausfuehrung vermerken). Das ist der uebliche Schnitt im Zahlungsverkehr —\nwer Rechnungen zusammenstellt, muss nicht derselbe sein, der das Geld auf den Weg bringt.\n\n**Kein PATCH, kein DELETE.** Ein Lauf wird angelegt oder verworfen; eine Zusammenstellung\nnachtraeglich zu veraendern hiesse, eine bereits erzeugte Bankdatei zu widerlegen. Verworfen\nwerden kann bis zur Ausfuehrung — danach ist das Geld unterwegs."},"FinanceSepaMandate-finance_sepa_mandate.read":{"type":"object","description":"SEPA-Lastschriftmandat (Doc 25 AP 5.2, G11) — die Erlaubnis, ein Kundenkonto zu belasten.\n\n**Kein DELETE.** Ein Mandat wird widerrufen (`/revoke`), nicht geloescht: es ist der Nachweis,\ndass eingezogen werden durfte. Die IBAN ist nur schreibend erreichbar und wird ausschliesslich\nmaskiert zurueckgegeben (Muster Bankkonto) — sie in einer Liste auszugeben waere eine\nSammelauskunft ueber die Bankverbindungen aller Kunden.","properties":{"ulid":{"type":["string","null"]},"mandateReference":{"description":"Mandatsreferenz — vergeben beim Anlegen, danach unveränderlich.","type":["string","null"]},"customerId":{"type":["integer","null"]},"customerName":{"type":["string","null"]},"debtorName":{"maxLength":140,"description":"Kontoinhaber (muss nicht der Kundenname sein).","type":["string","null"]},"ibanMasked":{"description":"Maskierte IBAN für die Anzeige.","type":["string","null"]},"bic":{"maxLength":11,"type":["string","null"]},"mandateType":{"enum":["core","b2b"],"description":"core (Verbraucher) | b2b (Firmenlastschrift, kein Rückgaberecht).","type":["string","null"]},"status":{"type":["string","null"]},"signatureDate":{"description":"Unterschriftsdatum (Y-m-d) — Pflichtangabe in jeder Lastschrift.","type":["string","null"]},"nextSequenceType":{"description":"FRST bis zum ersten Einzug, danach RCUR (abgeleitet, nicht setzbar).","type":["string","null"]},"firstUsedAt":{"type":["string","null"]},"lastUsedAt":{"type":["string","null"]},"revokedAt":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"FinanceSepaMandate-finance_sepa_mandate.write":{"type":"object","description":"SEPA-Lastschriftmandat (Doc 25 AP 5.2, G11) — die Erlaubnis, ein Kundenkonto zu belasten.\n\n**Kein DELETE.** Ein Mandat wird widerrufen (`/revoke`), nicht geloescht: es ist der Nachweis,\ndass eingezogen werden durfte. Die IBAN ist nur schreibend erreichbar und wird ausschliesslich\nmaskiert zurueckgegeben (Muster Bankkonto) — sie in einer Liste auszugeben waere eine\nSammelauskunft ueber die Bankverbindungen aller Kunden.","properties":{"customerId":{"type":["integer","null"]},"debtorName":{"maxLength":140,"description":"Kontoinhaber (muss nicht der Kundenname sein).","type":["string","null"]},"iban":{"description":"Nur Schreiben: IBAN im Klartext; abgelegt wird sie verschlüsselt.","type":["string","null"]},"bic":{"maxLength":11,"type":["string","null"]},"mandateType":{"enum":["core","b2b"],"description":"core (Verbraucher) | b2b (Firmenlastschrift, kein Rückgaberecht).","type":["string","null"]},"signatureDate":{"description":"Unterschriftsdatum (Y-m-d) — Pflichtangabe in jeder Lastschrift.","type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"FinanceSepaMandate-finance_sepa_mandate.write.jsonMergePatch":{"type":"object","description":"SEPA-Lastschriftmandat (Doc 25 AP 5.2, G11) — die Erlaubnis, ein Kundenkonto zu belasten.\n\n**Kein DELETE.** Ein Mandat wird widerrufen (`/revoke`), nicht geloescht: es ist der Nachweis,\ndass eingezogen werden durfte. Die IBAN ist nur schreibend erreichbar und wird ausschliesslich\nmaskiert zurueckgegeben (Muster Bankkonto) — sie in einer Liste auszugeben waere eine\nSammelauskunft ueber die Bankverbindungen aller Kunden.","properties":{"customerId":{"type":["integer","null"]},"debtorName":{"maxLength":140,"description":"Kontoinhaber (muss nicht der Kundenname sein).","type":["string","null"]},"iban":{"description":"Nur Schreiben: IBAN im Klartext; abgelegt wird sie verschlüsselt.","type":["string","null"]},"bic":{"maxLength":11,"type":["string","null"]},"mandateType":{"enum":["core","b2b"],"description":"core (Verbraucher) | b2b (Firmenlastschrift, kein Rückgaberecht).","type":["string","null"]},"signatureDate":{"description":"Unterschriftsdatum (Y-m-d) — Pflichtangabe in jeder Lastschrift.","type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"FinanceSepaMandate.jsonld-finance_sepa_mandate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"mandateReference":{"description":"Mandatsreferenz — vergeben beim Anlegen, danach unveränderlich.","type":["string","null"]},"customerId":{"type":["integer","null"]},"customerName":{"type":["string","null"]},"debtorName":{"maxLength":140,"description":"Kontoinhaber (muss nicht der Kundenname sein).","type":["string","null"]},"ibanMasked":{"description":"Maskierte IBAN für die Anzeige.","type":["string","null"]},"bic":{"maxLength":11,"type":["string","null"]},"mandateType":{"enum":["core","b2b"],"description":"core (Verbraucher) | b2b (Firmenlastschrift, kein Rückgaberecht).","type":["string","null"]},"status":{"type":["string","null"]},"signatureDate":{"description":"Unterschriftsdatum (Y-m-d) — Pflichtangabe in jeder Lastschrift.","type":["string","null"]},"nextSequenceType":{"description":"FRST bis zum ersten Einzug, danach RCUR (abgeleitet, nicht setzbar).","type":["string","null"]},"firstUsedAt":{"type":["string","null"]},"lastUsedAt":{"type":["string","null"]},"revokedAt":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}}],"description":"SEPA-Lastschriftmandat (Doc 25 AP 5.2, G11) — die Erlaubnis, ein Kundenkonto zu belasten.\n\n**Kein DELETE.** Ein Mandat wird widerrufen (`/revoke`), nicht geloescht: es ist der Nachweis,\ndass eingezogen werden durfte. Die IBAN ist nur schreibend erreichbar und wird ausschliesslich\nmaskiert zurueckgegeben (Muster Bankkonto) — sie in einer Liste auszugeben waere eine\nSammelauskunft ueber die Bankverbindungen aller Kunden."},"Folder-folder.read":{"type":"object","description":"DMS-Ordner (04-00 §4.6, §5). DTO über der Folder-Entität; CRUD mit Marken-/Objekt-Scope.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"parentId":{"type":["integer","null"]},"parentName":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"ownerType":{"maxLength":20,"type":["string","null"]},"ownerId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"Folder-folder.write":{"type":"object","description":"DMS-Ordner (04-00 §4.6, §5). DTO über der Folder-Entität; CRUD mit Marken-/Objekt-Scope.","required":["name"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"parentId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"ownerType":{"maxLength":20,"type":["string","null"]},"ownerId":{"type":["integer","null"]}}},"Folder-folder.write.jsonMergePatch":{"type":"object","description":"DMS-Ordner (04-00 §4.6, §5). DTO über der Folder-Entität; CRUD mit Marken-/Objekt-Scope.","properties":{"name":{"maxLength":255,"default":"","type":"string"},"parentId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"ownerType":{"maxLength":20,"type":["string","null"]},"ownerId":{"type":["integer","null"]}}},"Folder.jsonld-folder.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"parentId":{"type":["integer","null"]},"parentName":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"ownerType":{"maxLength":20,"type":["string","null"]},"ownerId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}],"description":"DMS-Ordner (04-00 §4.6, §5). DTO über der Folder-Entität; CRUD mit Marken-/Objekt-Scope."},"Forecast-forecast.read":{"type":"object","description":"Forecast-Resource (04-09 §4.4) — read-only, materialisiert.\nPrognostizierte Auslastung je Person/Marke/global und Periode inkl. Pipeline-Anteil + severity.\nFilter: scope/refId/granularity/from/to/severity.","properties":{"ulid":{"type":["string","null"]},"scope":{"description":"employee | team | brand | global.","type":["string","null"]},"refId":{"type":["integer","null"]},"refLabel":{"description":"Aufgelöster Name (Mitarbeiter/Marke), sofern ermittelbar.","type":["string","null"]},"granularity":{"type":["string","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"plannedHours":{"type":["number","null"]},"availableHours":{"type":["number","null"]},"pipelineHours":{"type":["number","null"]},"utilizationPct":{"type":["number","null"]},"gapHours":{"type":["number","null"]},"severity":{"description":"ok | idle | warn | critical.","type":["string","null"]},"computedAt":{"type":["string","null"]}}},"Forecast.jsonld-forecast.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"scope":{"description":"employee | team | brand | global.","type":["string","null"]},"refId":{"type":["integer","null"]},"refLabel":{"description":"Aufgelöster Name (Mitarbeiter/Marke), sofern ermittelbar.","type":["string","null"]},"granularity":{"type":["string","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"plannedHours":{"type":["number","null"]},"availableHours":{"type":["number","null"]},"pipelineHours":{"type":["number","null"]},"utilizationPct":{"type":["number","null"]},"gapHours":{"type":["number","null"]},"severity":{"description":"ok | idle | warn | critical.","type":["string","null"]},"computedAt":{"type":["string","null"]}}}],"description":"Forecast-Resource (04-09 §4.4) — read-only, materialisiert.\nPrognostizierte Auslastung je Person/Marke/global und Periode inkl. Pipeline-Anteil + severity.\nFilter: scope/refId/granularity/from/to/severity."},"GoodsAcceptance-goods_acceptance.read":{"type":"object","description":"Warenannahme (Doc 25 AP 4.8, B1 (a) 1): die Pakete sind da, der Inhalt ist offen.\n\nSie bucht **keinen Bestand**. Der Wert dieses Belegs ist die offene Liste: was hier steht, hat\nnoch niemand erfasst.\n\nRechte: lesen mit `purchasing.order.view`, anlegen/schließen mit `purchasing.receipt.record` —\ndie Annahme ist der erste Schritt des Wareneingangs, kein eigener Aufgabenbereich.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"supplierRoleId":{"type":["integer","null"]},"supplierName":{"description":"Lieferantenname, serverseitig aufgelöst (null ohne OctiSuppliers).","type":["string","null"]},"sender":{"maxLength":160,"description":"Absender laut Paket — die Angabe, die an der Rampe immer da ist.","type":["string","null"]},"packageCount":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"carrier":{"maxLength":60,"type":["string","null"]},"trackingNumber":{"maxLength":60,"type":["string","null"]},"status":{"description":"open|received|cancelled (read-only — gesetzt wird über `close`).","type":["string","null"]},"goodsReceiptId":{"type":["integer","null"]},"note":{"type":["string","null"]},"acceptedAt":{"type":["string","null"]},"closedAt":{"type":["string","null"]},"brandId":{"description":"Marke (nur bei Anlage setzbar; muss im Recht des Nutzers liegen).","type":["integer","null"]}}},"GoodsAcceptance-goods_acceptance.write":{"type":"object","description":"Warenannahme (Doc 25 AP 4.8, B1 (a) 1): die Pakete sind da, der Inhalt ist offen.\n\nSie bucht **keinen Bestand**. Der Wert dieses Belegs ist die offene Liste: was hier steht, hat\nnoch niemand erfasst.\n\nRechte: lesen mit `purchasing.order.view`, anlegen/schließen mit `purchasing.receipt.record` —\ndie Annahme ist der erste Schritt des Wareneingangs, kein eigener Aufgabenbereich.","properties":{"supplierRoleId":{"type":["integer","null"]},"sender":{"maxLength":160,"description":"Absender laut Paket — die Angabe, die an der Rampe immer da ist.","type":["string","null"]},"packageCount":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"carrier":{"maxLength":60,"type":["string","null"]},"trackingNumber":{"maxLength":60,"type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"description":"Marke (nur bei Anlage setzbar; muss im Recht des Nutzers liegen).","type":["integer","null"]}}},"GoodsAcceptance-goods_acceptance.write.jsonMergePatch":{"type":"object","description":"Warenannahme (Doc 25 AP 4.8, B1 (a) 1): die Pakete sind da, der Inhalt ist offen.\n\nSie bucht **keinen Bestand**. Der Wert dieses Belegs ist die offene Liste: was hier steht, hat\nnoch niemand erfasst.\n\nRechte: lesen mit `purchasing.order.view`, anlegen/schließen mit `purchasing.receipt.record` —\ndie Annahme ist der erste Schritt des Wareneingangs, kein eigener Aufgabenbereich.","properties":{"supplierRoleId":{"type":["integer","null"]},"sender":{"maxLength":160,"description":"Absender laut Paket — die Angabe, die an der Rampe immer da ist.","type":["string","null"]},"packageCount":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"carrier":{"maxLength":60,"type":["string","null"]},"trackingNumber":{"maxLength":60,"type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"description":"Marke (nur bei Anlage setzbar; muss im Recht des Nutzers liegen).","type":["integer","null"]}}},"GoodsAcceptance.jsonld-goods_acceptance.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"supplierRoleId":{"type":["integer","null"]},"supplierName":{"description":"Lieferantenname, serverseitig aufgelöst (null ohne OctiSuppliers).","type":["string","null"]},"sender":{"maxLength":160,"description":"Absender laut Paket — die Angabe, die an der Rampe immer da ist.","type":["string","null"]},"packageCount":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"carrier":{"maxLength":60,"type":["string","null"]},"trackingNumber":{"maxLength":60,"type":["string","null"]},"status":{"description":"open|received|cancelled (read-only — gesetzt wird über `close`).","type":["string","null"]},"goodsReceiptId":{"type":["integer","null"]},"note":{"type":["string","null"]},"acceptedAt":{"type":["string","null"]},"closedAt":{"type":["string","null"]},"brandId":{"description":"Marke (nur bei Anlage setzbar; muss im Recht des Nutzers liegen).","type":["integer","null"]}}}],"description":"Warenannahme (Doc 25 AP 4.8, B1 (a) 1): die Pakete sind da, der Inhalt ist offen.\n\nSie bucht **keinen Bestand**. Der Wert dieses Belegs ist die offene Liste: was hier steht, hat\nnoch niemand erfasst.\n\nRechte: lesen mit `purchasing.order.view`, anlegen/schließen mit `purchasing.receipt.record` —\ndie Annahme ist der erste Schritt des Wareneingangs, kein eigener Aufgabenbereich."},"GoodsOrder-purchasing_order.read":{"type":"object","description":"Waren-Bestell-Resource (04-23 §8).\n- CRUD + Workflow-Aktionen (place/cancel/receive) + PDF.\n- items eingebettet, Bepreisung via LineCalculator, EK-Vorbelegung 04-29-Resolver; Summen read-only.\n- PATCH/DELETE nur im Entwurf (409).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"number":{"type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"status":{"description":"Lebenszyklus-Status (read-only — Übergänge laufen über die Aktions-Operationen).","type":["string","null"]},"editable":{"description":"Editierbar bis zum ersten Wareneingang; SSoT fürs Frontend-Edit-Gating.","type":["boolean","null"]},"itemsEditable":{"description":"Positionen editierbar: deckungsgleich mit {@see $editable}.","type":["boolean","null"]},"cancellable":{"description":"Stornierbar (draft/ordered ohne verbuchten Wareneingang) — SSoT fürs Frontend-Gating der\nStorno-Aktion; ohne sie bot die Oberfläche den Knopf in Zuständen an, in denen der Server\ngarantiert 409 wirft (Audit R27-07).","type":["boolean","null"]},"placeable":{"description":"Absendbar (Entwurf MIT mindestens einer Position) — SSoT fürs Gating der place-Aktion.","type":["boolean","null"]},"orderedAt":{"type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"expectedAt":{"description":"Erwartetes Wareneingangs-Datum (Y-m-d).","type":["string","null"]},"deliveryAddress":{"description":"Abweichende Lieferadresse — bei Dropship die Kundenadresse.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDropship":{"type":["boolean","null"]},"sourceSalesOrderId":{"type":["integer","null"]},"notes":{"type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}}}},"GoodsOrder-purchasing_order.write":{"type":"object","description":"Waren-Bestell-Resource (04-23 §8).\n- CRUD + Workflow-Aktionen (place/cancel/receive) + PDF.\n- items eingebettet, Bepreisung via LineCalculator, EK-Vorbelegung 04-29-Resolver; Summen read-only.\n- PATCH/DELETE nur im Entwurf (409).","properties":{"supplierRoleUlid":{"maxLength":26,"description":"Lieferanten-Rolle (04-29) für die Anlage — per ULID adressiert (Muster Supplier-API).","type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"expectedAt":{"description":"Erwartetes Wareneingangs-Datum (Y-m-d).","type":["string","null"]},"deliveryAddress":{"description":"Abweichende Lieferadresse — bei Dropship die Kundenadresse.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDropship":{"type":["boolean","null"]},"notes":{"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"isBlockedStock":{"description":"Nur receive-Aktion: Sperrlager/Qualitätsprüfung — Zubuchung erst bei Freigabe.","type":["boolean","null"]},"note":{"description":"Nur receive-Aktion: Bemerkung zum Wareneingang.","type":["string","null"]},"release":{"description":"Nur receive-Aktion (Doc 25 AP 4.8): `false` = nur ERFASSEN, Bestand entsteht erst mit der\nFreigabe. Ohne Angabe entscheidet die Hausregel `purchasing.receipt.two_stage`; ein `true`\nkann einen eingeschalteten Zwei-Stufen-Zwang nicht aushebeln.","type":["boolean","null"]},"deliveryNoteNumber":{"description":"Nur receive-Aktion: Lieferscheinnummer (Pflicht je nach `purchasing.receipt.delivery_note_number`).","type":["string","null"]}}},"GoodsOrder-purchasing_order.write.jsonMergePatch":{"type":"object","description":"Waren-Bestell-Resource (04-23 §8).\n- CRUD + Workflow-Aktionen (place/cancel/receive) + PDF.\n- items eingebettet, Bepreisung via LineCalculator, EK-Vorbelegung 04-29-Resolver; Summen read-only.\n- PATCH/DELETE nur im Entwurf (409).","properties":{"supplierRoleUlid":{"maxLength":26,"description":"Lieferanten-Rolle (04-29) für die Anlage — per ULID adressiert (Muster Supplier-API).","type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"expectedAt":{"description":"Erwartetes Wareneingangs-Datum (Y-m-d).","type":["string","null"]},"deliveryAddress":{"description":"Abweichende Lieferadresse — bei Dropship die Kundenadresse.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDropship":{"type":["boolean","null"]},"notes":{"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"isBlockedStock":{"description":"Nur receive-Aktion: Sperrlager/Qualitätsprüfung — Zubuchung erst bei Freigabe.","type":["boolean","null"]},"note":{"description":"Nur receive-Aktion: Bemerkung zum Wareneingang.","type":["string","null"]},"release":{"description":"Nur receive-Aktion (Doc 25 AP 4.8): `false` = nur ERFASSEN, Bestand entsteht erst mit der\nFreigabe. Ohne Angabe entscheidet die Hausregel `purchasing.receipt.two_stage`; ein `true`\nkann einen eingeschalteten Zwei-Stufen-Zwang nicht aushebeln.","type":["boolean","null"]},"deliveryNoteNumber":{"description":"Nur receive-Aktion: Lieferscheinnummer (Pflicht je nach `purchasing.receipt.delivery_note_number`).","type":["string","null"]}}},"GoodsOrder.jsonld-purchasing_order.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"number":{"type":["string","null"]},"supplierRoleId":{"type":["integer","null"]},"status":{"description":"Lebenszyklus-Status (read-only — Übergänge laufen über die Aktions-Operationen).","type":["string","null"]},"editable":{"description":"Editierbar bis zum ersten Wareneingang; SSoT fürs Frontend-Edit-Gating.","type":["boolean","null"]},"itemsEditable":{"description":"Positionen editierbar: deckungsgleich mit {@see $editable}.","type":["boolean","null"]},"cancellable":{"description":"Stornierbar (draft/ordered ohne verbuchten Wareneingang) — SSoT fürs Frontend-Gating der\nStorno-Aktion; ohne sie bot die Oberfläche den Knopf in Zuständen an, in denen der Server\ngarantiert 409 wirft (Audit R27-07).","type":["boolean","null"]},"placeable":{"description":"Absendbar (Entwurf MIT mindestens einer Position) — SSoT fürs Gating der place-Aktion.","type":["boolean","null"]},"orderedAt":{"type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"expectedAt":{"description":"Erwartetes Wareneingangs-Datum (Y-m-d).","type":["string","null"]},"deliveryAddress":{"description":"Abweichende Lieferadresse — bei Dropship die Kundenadresse.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDropship":{"type":["boolean","null"]},"sourceSalesOrderId":{"type":["integer","null"]},"notes":{"type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}}}}],"description":"Waren-Bestell-Resource (04-23 §8).\n- CRUD + Workflow-Aktionen (place/cancel/receive) + PDF.\n- items eingebettet, Bepreisung via LineCalculator, EK-Vorbelegung 04-29-Resolver; Summen read-only.\n- PATCH/DELETE nur im Entwurf (409)."},"GoodsReceipt-purchasing_receipt.read":{"type":"object","description":"Wareneingangs-Resource (04-23 §8).\n- Liste (Filter goodsOrderId, Brand-Scope über Bestellung) + Sperrlager-Freigabe.\n- Anlage nur über POST /v1/purchasing/orders/{ulid}/receive.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderNumber":{"description":"Bestellnummer, read-only; serverseitig gebatcht statt Voll-Katalog (Audit R20 PERF-2).","type":["string","null"]},"goodsOrderUlid":{"description":"ULID der zugehörigen Bestellung (read-only, für den Deep-Link — Audit R20 PERF-2).","type":["string","null"]},"receivedAt":{"type":["string","null"]},"note":{"type":["string","null"]},"isBlockedStock":{"description":"Sperrlager/Qualitätsprüfung: Zubuchung erst bei Freigabe (release).","type":["boolean","null"]},"bookingStatus":{"description":"`captured` (erfasst, NICHT gebucht) oder `released` (gebucht) — Doc 25 AP 4.8.","type":["string","null"]},"deliveryNoteNumber":{"description":"Lieferscheinnummer des Lieferanten.","type":["string","null"]},"releasedAt":{"type":["string","null"]},"items":{"description":"Positionen (read-only): {ulid, orderItemId, productId, description, qty}; description serverseitig aufgelöst statt Voll-Katalog (Audit R20 PERF-2).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"GoodsReceipt-purchasing_receipt.write":{"type":"object","description":"Wareneingangs-Resource (04-23 §8).\n- Liste (Filter goodsOrderId, Brand-Scope über Bestellung) + Sperrlager-Freigabe.\n- Anlage nur über POST /v1/purchasing/orders/{ulid}/receive."},"GoodsReceipt.jsonld-purchasing_receipt.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"goodsOrderId":{"type":["integer","null"]},"goodsOrderNumber":{"description":"Bestellnummer, read-only; serverseitig gebatcht statt Voll-Katalog (Audit R20 PERF-2).","type":["string","null"]},"goodsOrderUlid":{"description":"ULID der zugehörigen Bestellung (read-only, für den Deep-Link — Audit R20 PERF-2).","type":["string","null"]},"receivedAt":{"type":["string","null"]},"note":{"type":["string","null"]},"isBlockedStock":{"description":"Sperrlager/Qualitätsprüfung: Zubuchung erst bei Freigabe (release).","type":["boolean","null"]},"bookingStatus":{"description":"`captured` (erfasst, NICHT gebucht) oder `released` (gebucht) — Doc 25 AP 4.8.","type":["string","null"]},"deliveryNoteNumber":{"description":"Lieferscheinnummer des Lieferanten.","type":["string","null"]},"releasedAt":{"type":["string","null"]},"items":{"description":"Positionen (read-only): {ulid, orderItemId, productId, description, qty}; description serverseitig aufgelöst statt Voll-Katalog (Audit R20 PERF-2).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Wareneingangs-Resource (04-23 §8).\n- Liste (Filter goodsOrderId, Brand-Scope über Bestellung) + Sperrlager-Freigabe.\n- Anlage nur über POST /v1/purchasing/orders/{ulid}/receive."},"HrAbsence-hr_absence.read":{"type":"object","description":"Abwesenheits-Resource (04-08 §4.3).\nSelf-Service-Antrag (POST) + Workflow-Ops approve/reject/cancel/provide-proof (H6/S8-1).\nworkingDays/status/approverId/proofRequired: read-only, vom Service gesetzt.","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Zielperson; leer = antragstellende Person selbst.","type":["integer","null"]},"typeCode":{"type":["string","null"]},"typeName":{"type":["string","null"]},"startDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"endDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"halfDayStart":{"type":["boolean","null"]},"halfDayEnd":{"type":["boolean","null"]},"reason":{"maxLength":1000,"type":["string","null"]},"substituteId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"proofDocumentId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"proofDocumentLabel":{"description":"Anzeige-Label für den Dokument-Picker (read-only) — proofDocumentId ist nur die PK.","type":["string","null"]},"proofRequired":{"description":"Nachweis (AU) gemäß Art fällig (vom Service anhand `proofAfterDays` gesetzt).","type":["boolean","null"]},"proofProvidedAt":{"description":"Zeitpunkt der Nachweis-Erfassung (NULL = ausstehend).","type":["string","null"]},"decisionNote":{"maxLength":1000,"description":"Begründung bei Genehmigung/Ablehnung.","type":["string","null"]},"status":{"type":["string","null"]},"workingDays":{"type":["number","null"]},"approverId":{"type":["integer","null"]},"decidedAt":{"type":["string","null"]},"calendarEventId":{"type":["string","null"]},"concurrentAbsences":{"description":"Team-Engpass-Hinweis (04-08 §6.4), nicht-blockierend.","type":["integer","null"]},"bottleneckWarning":{"description":"Formulierter Engpass-Hinweis (oder NULL, wenn keine Engpass-Schwelle erreicht).","type":["string","null"]}}},"HrAbsence-hr_absence.write":{"type":"object","description":"Abwesenheits-Resource (04-08 §4.3).\nSelf-Service-Antrag (POST) + Workflow-Ops approve/reject/cancel/provide-proof (H6/S8-1).\nworkingDays/status/approverId/proofRequired: read-only, vom Service gesetzt.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Zielperson; leer = antragstellende Person selbst.","type":["integer","null"]},"typeCode":{"type":["string","null"]},"startDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"endDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"halfDayStart":{"type":["boolean","null"]},"halfDayEnd":{"type":["boolean","null"]},"reason":{"maxLength":1000,"type":["string","null"]},"substituteId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"proofDocumentId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"decisionNote":{"maxLength":1000,"description":"Begründung bei Genehmigung/Ablehnung.","type":["string","null"]}}},"HrAbsence.jsonld-hr_absence.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Zielperson; leer = antragstellende Person selbst.","type":["integer","null"]},"typeCode":{"type":["string","null"]},"typeName":{"type":["string","null"]},"startDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"endDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"halfDayStart":{"type":["boolean","null"]},"halfDayEnd":{"type":["boolean","null"]},"reason":{"maxLength":1000,"type":["string","null"]},"substituteId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"proofDocumentId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"proofDocumentLabel":{"description":"Anzeige-Label für den Dokument-Picker (read-only) — proofDocumentId ist nur die PK.","type":["string","null"]},"proofRequired":{"description":"Nachweis (AU) gemäß Art fällig (vom Service anhand `proofAfterDays` gesetzt).","type":["boolean","null"]},"proofProvidedAt":{"description":"Zeitpunkt der Nachweis-Erfassung (NULL = ausstehend).","type":["string","null"]},"decisionNote":{"maxLength":1000,"description":"Begründung bei Genehmigung/Ablehnung.","type":["string","null"]},"status":{"type":["string","null"]},"workingDays":{"type":["number","null"]},"approverId":{"type":["integer","null"]},"decidedAt":{"type":["string","null"]},"calendarEventId":{"type":["string","null"]},"concurrentAbsences":{"description":"Team-Engpass-Hinweis (04-08 §6.4), nicht-blockierend.","type":["integer","null"]},"bottleneckWarning":{"description":"Formulierter Engpass-Hinweis (oder NULL, wenn keine Engpass-Schwelle erreicht).","type":["string","null"]}}}],"description":"Abwesenheits-Resource (04-08 §4.3).\nSelf-Service-Antrag (POST) + Workflow-Ops approve/reject/cancel/provide-proof (H6/S8-1).\nworkingDays/status/approverId/proofRequired: read-only, vom Service gesetzt."},"HrAbsenceBalance-hr_balance.read":{"type":"object","description":"Urlaubskonto je Jahr (04-08 §6.3), read-only.\nremainingDays = Anspruch + Übertrag − genommen − geplant.\nPflege automatisch via Anträge/Genehmigungen + Jahreswechsel-Job.","properties":{"ulid":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"year":{"type":["integer","null"]},"entitlementDays":{"type":["string","null"]},"carryoverDays":{"type":["string","null"]},"takenDays":{"type":["string","null"]},"plannedDays":{"type":["string","null"]},"remainingDays":{"type":["number","null"]},"expiresAt":{"type":["string","null"]},"carryoverExpired":{"type":["boolean","null"]}}},"HrAbsenceBalance.jsonld-hr_balance.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"year":{"type":["integer","null"]},"entitlementDays":{"type":["string","null"]},"carryoverDays":{"type":["string","null"]},"takenDays":{"type":["string","null"]},"plannedDays":{"type":["string","null"]},"remainingDays":{"type":["number","null"]},"expiresAt":{"type":["string","null"]},"carryoverExpired":{"type":["boolean","null"]}}}],"description":"Urlaubskonto je Jahr (04-08 §6.3), read-only.\nremainingDays = Anspruch + Übertrag − genommen − geplant.\nPflege automatisch via Anträge/Genehmigungen + Jahreswechsel-Job."},"HrAbsenceStatus-hr_absence_status.read":{"type":"object","description":"Abwesenheits-Status als Daten (04-08 §3).\nkey == Absence::STATUS_* (requested/approved/rejected/cancelled).","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"HrAbsenceStatus-hr_absence_status.update.jsonMergePatch":{"type":"object","description":"Abwesenheits-Status als Daten (04-08 §3).\nkey == Absence::STATUS_* (requested/approved/rejected/cancelled).","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"HrAbsenceStatus-hr_absence_status.write":{"type":"object","description":"Abwesenheits-Status als Daten (04-08 §3).\nkey == Absence::STATUS_* (requested/approved/rejected/cancelled).","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"HrAbsenceStatus.jsonld-hr_absence_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Abwesenheits-Status als Daten (04-08 §3).\nkey == Absence::STATUS_* (requested/approved/rejected/cancelled)."},"HrAbsenceType-hr_abstype.read":{"type":"object","description":"Abwesenheitsarten (04-08 §3, „Status als Daten\").\nFlags steuern Konto-/Kapazitätswirkung, Genehmigungspflicht (H6), Nachweis (AU ab Tag X).","properties":{"ulid":{"type":["string","null"]},"code":{"type":["string","null"]},"name":{"type":["string","null"]},"affectsBalance":{"type":["boolean","null"]},"requiresApproval":{"type":["boolean","null"]},"requiresProof":{"type":["boolean","null"]},"proofAfterDays":{"type":["integer","null"]},"paid":{"type":["boolean","null"]},"reducesCapacity":{"type":["boolean","null"]},"allowHalfDay":{"type":["boolean","null"]},"color":{"type":["string","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["code","name"]},"HrAbsenceType-hr_abstype.write":{"type":"object","description":"Abwesenheitsarten (04-08 §3, „Status als Daten\").\nFlags steuern Konto-/Kapazitätswirkung, Genehmigungspflicht (H6), Nachweis (AU ab Tag X).","required":["code","name"],"properties":{"code":{"type":["string","null"]},"name":{"type":["string","null"]},"affectsBalance":{"type":["boolean","null"]},"requiresApproval":{"type":["boolean","null"]},"requiresProof":{"type":["boolean","null"]},"proofAfterDays":{"type":["integer","null"]},"paid":{"type":["boolean","null"]},"reducesCapacity":{"type":["boolean","null"]},"allowHalfDay":{"type":["boolean","null"]},"color":{"type":["string","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"HrAbsenceType-hr_abstype.write.jsonMergePatch":{"type":"object","description":"Abwesenheitsarten (04-08 §3, „Status als Daten\").\nFlags steuern Konto-/Kapazitätswirkung, Genehmigungspflicht (H6), Nachweis (AU ab Tag X).","properties":{"code":{"type":["string","null"]},"name":{"type":["string","null"]},"affectsBalance":{"type":["boolean","null"]},"requiresApproval":{"type":["boolean","null"]},"requiresProof":{"type":["boolean","null"]},"proofAfterDays":{"type":["integer","null"]},"paid":{"type":["boolean","null"]},"reducesCapacity":{"type":["boolean","null"]},"allowHalfDay":{"type":["boolean","null"]},"color":{"type":["string","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"HrAbsenceType.jsonld-hr_abstype.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"code":{"type":["string","null"]},"name":{"type":["string","null"]},"affectsBalance":{"type":["boolean","null"]},"requiresApproval":{"type":["boolean","null"]},"requiresProof":{"type":["boolean","null"]},"proofAfterDays":{"type":["integer","null"]},"paid":{"type":["boolean","null"]},"reducesCapacity":{"type":["boolean","null"]},"allowHalfDay":{"type":["boolean","null"]},"color":{"type":["string","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["code","name"]}],"description":"Abwesenheitsarten (04-08 §3, „Status als Daten\").\nFlags steuern Konto-/Kapazitätswirkung, Genehmigungspflicht (H6), Nachweis (AU ab Tag X)."},"HrAvailability-hr_availability.read":{"type":"object","description":"Netto-Verfügbarkeit je Mitarbeiter/Zeitraum (04-08 §6.1), read-only, für Ressourcenplanung (04-09).\nVerfügbarkeit/Tag = Soll-Stunden − Feiertage − genehmigte kapazitätsmindernde Abwesenheit; 0 vor Eintritt/nach Austritt.","properties":{"id":{"default":"all","type":"string"},"employeeId":{"type":["integer","null"]},"employeeName":{"type":["string","null"]},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"totalHours":{"default":0,"type":"number"},"workingDays":{"default":0,"type":"number"},"days":{"type":"object","additionalProperties":{"type":"number"}}}},"HrAvailability.jsonld-hr_availability.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"default":"all","type":"string"},"employeeId":{"type":["integer","null"]},"employeeName":{"type":["string","null"]},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"totalHours":{"default":0,"type":"number"},"workingDays":{"default":0,"type":"number"},"days":{"type":"object","additionalProperties":{"type":"number"}}}}],"description":"Netto-Verfügbarkeit je Mitarbeiter/Zeitraum (04-08 §6.1), read-only, für Ressourcenplanung (04-09).\nVerfügbarkeit/Tag = Soll-Stunden − Feiertage − genehmigte kapazitätsmindernde Abwesenheit; 0 vor Eintritt/nach Austritt."},"HrChecklistTemplate-hr_cltpl.read":{"type":"object","description":"On-/Offboarding-Vorlagen (04-08 §4.4).\nitems = Schrittliste (Titel, Kategorie, Fälligkeits-Offset, Aktion, Zielreferenz) für Checklisten-Erzeugung.","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"mode":{"enum":["onboarding","offboarding"],"type":["string","null"]},"active":{"type":["boolean","null"]},"contractType":{"type":["string","null"]},"items":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}},"required":["name"]},"HrChecklistTemplate-hr_cltpl.write":{"type":"object","description":"On-/Offboarding-Vorlagen (04-08 §4.4).\nitems = Schrittliste (Titel, Kategorie, Fälligkeits-Offset, Aktion, Zielreferenz) für Checklisten-Erzeugung.","required":["name"],"properties":{"name":{"type":["string","null"]},"mode":{"enum":["onboarding","offboarding"],"type":["string","null"]},"active":{"type":["boolean","null"]},"contractType":{"type":["string","null"]},"items":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}},"HrChecklistTemplate-hr_cltpl.write.jsonMergePatch":{"type":"object","description":"On-/Offboarding-Vorlagen (04-08 §4.4).\nitems = Schrittliste (Titel, Kategorie, Fälligkeits-Offset, Aktion, Zielreferenz) für Checklisten-Erzeugung.","properties":{"name":{"type":["string","null"]},"mode":{"enum":["onboarding","offboarding"],"type":["string","null"]},"active":{"type":["boolean","null"]},"contractType":{"type":["string","null"]},"items":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}},"HrChecklistTemplate.jsonld-hr_cltpl.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"mode":{"enum":["onboarding","offboarding"],"type":["string","null"]},"active":{"type":["boolean","null"]},"contractType":{"type":["string","null"]},"items":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}},"required":["name"]}],"description":"On-/Offboarding-Vorlagen (04-08 §4.4).\nitems = Schrittliste (Titel, Kategorie, Fälligkeits-Offset, Aktion, Zielreferenz) für Checklisten-Erzeugung."},"HrEmployeeDocument-hr_doc.read":{"type":"object","description":"Personaldokument (04-08 §4.5/§6.7), DSGVO-sensibel, verschlüsselt.\nDatei-Bytes im DMS (fileId); content feldweise verschlüsselt, nie im Read (nur hasContent).\nretentionUntil steuert Aufbewahrungs-/Löschvorschlag.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenz für Absence.proofDocumentId (PK, nicht ULID).","type":["integer","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"type":{"description":"contract|certificate|payslip|id|proof|other.","type":["string","null"]},"title":{"type":["string","null"]},"fileId":{"type":["integer","null"]},"fileUlid":{"description":"Öffentliche ULID der DMS-Datei (read-only), Basis für den Download.","type":["string","null"]},"hasContent":{"default":false,"type":"boolean"},"confidential":{"type":["boolean","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"retentionUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"createdAt":{"type":["string","null"]}},"required":["title"]},"HrEmployeeDocument-hr_doc.write":{"type":"object","description":"Personaldokument (04-08 §4.5/§6.7), DSGVO-sensibel, verschlüsselt.\nDatei-Bytes im DMS (fileId); content feldweise verschlüsselt, nie im Read (nur hasContent).\nretentionUntil steuert Aufbewahrungs-/Löschvorschlag.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"type":{"description":"contract|certificate|payslip|id|proof|other.","type":["string","null"]},"title":{"type":["string","null"]},"fileId":{"type":["integer","null"]},"content":{"description":"Optionaler vertraulicher Textinhalt — wird verschlüsselt gespeichert, nie ausgegeben.","type":["string","null"]},"confidential":{"type":["boolean","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"retentionUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]}},"required":["title"]},"HrEmployeeDocument.jsonld-hr_doc.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenz für Absence.proofDocumentId (PK, nicht ULID).","type":["integer","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"type":{"description":"contract|certificate|payslip|id|proof|other.","type":["string","null"]},"title":{"type":["string","null"]},"fileId":{"type":["integer","null"]},"fileUlid":{"description":"Öffentliche ULID der DMS-Datei (read-only), Basis für den Download.","type":["string","null"]},"hasContent":{"default":false,"type":"boolean"},"confidential":{"type":["boolean","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"retentionUntil":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"createdAt":{"type":["string","null"]}},"required":["title"]}],"description":"Personaldokument (04-08 §4.5/§6.7), DSGVO-sensibel, verschlüsselt.\nDatei-Bytes im DMS (fileId); content feldweise verschlüsselt, nie im Read (nur hasContent).\nretentionUntil steuert Aufbewahrungs-/Löschvorschlag."},"HrHolidayCalendar-hr_holcal.read":{"type":"object","description":"Feiertagskalender je Region (04-08 §6.2, H5).\n- Core-Plattform-Stammdaten, nicht pluginfähig: speist OctiHr/OctiTime/OctiPlanning.\n- `holidays`: Feiertagsliste (Datum/Name/halber Tag); PATCH ersetzt sie vollständig.","properties":{"ulid":{"type":["string","null"]},"region":{"type":["string","null"]},"name":{"type":["string","null"]},"active":{"type":["boolean","null"]},"holidays":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}}},"required":["region","name"]},"HrHolidayCalendar-hr_holcal.write":{"type":"object","description":"Feiertagskalender je Region (04-08 §6.2, H5).\n- Core-Plattform-Stammdaten, nicht pluginfähig: speist OctiHr/OctiTime/OctiPlanning.\n- `holidays`: Feiertagsliste (Datum/Name/halber Tag); PATCH ersetzt sie vollständig.","required":["region","name"],"properties":{"region":{"type":["string","null"]},"name":{"type":["string","null"]},"active":{"type":["boolean","null"]},"holidays":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}}}},"HrHolidayCalendar-hr_holcal.write.jsonMergePatch":{"type":"object","description":"Feiertagskalender je Region (04-08 §6.2, H5).\n- Core-Plattform-Stammdaten, nicht pluginfähig: speist OctiHr/OctiTime/OctiPlanning.\n- `holidays`: Feiertagsliste (Datum/Name/halber Tag); PATCH ersetzt sie vollständig.","properties":{"region":{"type":["string","null"]},"name":{"type":["string","null"]},"active":{"type":["boolean","null"]},"holidays":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}}}},"HrHolidayCalendar.jsonld-hr_holcal.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"region":{"type":["string","null"]},"name":{"type":["string","null"]},"active":{"type":["boolean","null"]},"holidays":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}}},"required":["region","name"]}],"description":"Feiertagskalender je Region (04-08 §6.2, H5).\n- Core-Plattform-Stammdaten, nicht pluginfähig: speist OctiHr/OctiTime/OctiPlanning.\n- `holidays`: Feiertagsliste (Datum/Name/halber Tag); PATCH ersetzt sie vollständig."},"HrOnboardingChecklist-hr_checklist.read":{"type":"object","description":"On-/Offboarding-Checkliste (04-08 §4.4).\nErzeugung aus Vorlage; complete/skip lösen idempotent Provisionierung-/Asset-/Task-Gateways aus.","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"mode":{"enum":["onboarding","offboarding"],"description":"onboarding | offboarding.","type":["string","null"]},"employeeName":{"description":"Anzeigename des Mitarbeiters — Kopf-Titel der Checkliste. Ohne dieses Feld hatte die Ressource\nkeinen anzeigbaren Text auf Checklisten-Ebene (`itemTitle` liegt auf Schritt-Ebene), jede\nKonsumenten-Liste blieb damit leer (Audit R25).","type":["string","null"]},"templateId":{"type":["integer","null"]},"status":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"progress":{"type":["integer","null"]},"completedAt":{"type":["string","null"]},"items":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"HrOnboardingChecklist-hr_checklist.write":{"type":"object","description":"On-/Offboarding-Checkliste (04-08 §4.4).\nErzeugung aus Vorlage; complete/skip lösen idempotent Provisionierung-/Asset-/Task-Gateways aus.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"mode":{"enum":["onboarding","offboarding"],"description":"onboarding | offboarding.","type":["string","null"]},"templateUlid":{"maxLength":26,"description":"Vorlage für from-template (ULID); leer = passende Default-Vorlage.","type":["string","null"]},"itemUlid":{"maxLength":26,"type":["string","null"]},"itemTitle":{"maxLength":255,"type":["string","null"]},"itemAction":{"type":["string","null"]},"itemTargetRef":{"maxLength":255,"type":["string","null"]},"itemCategory":{"maxLength":30,"type":["string","null"]},"itemDueOffsetDays":{"type":["integer","null"]}}},"HrOnboardingChecklist.jsonld-hr_checklist.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"mode":{"enum":["onboarding","offboarding"],"description":"onboarding | offboarding.","type":["string","null"]},"employeeName":{"description":"Anzeigename des Mitarbeiters — Kopf-Titel der Checkliste. Ohne dieses Feld hatte die Ressource\nkeinen anzeigbaren Text auf Checklisten-Ebene (`itemTitle` liegt auf Schritt-Ebene), jede\nKonsumenten-Liste blieb damit leer (Audit R25).","type":["string","null"]},"templateId":{"type":["integer","null"]},"status":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"progress":{"type":["integer","null"]},"completedAt":{"type":["string","null"]},"items":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"On-/Offboarding-Checkliste (04-08 §4.4).\nErzeugung aus Vorlage; complete/skip lösen idempotent Provisionierung-/Asset-/Task-Gateways aus."},"HrPayrollExport-hr_payroll.read":{"type":"object","description":"Lohn-Export-Vorbereitung (04-08 §4.5, H7/S8-2), keine Abrechnung.\nPOST erzeugt Aggregat-Datei (Stunden/Abwesenheiten/Stammdaten je Periode) fürs Lohnbüro.\nDATEV-Format final mit Lohnbüro abzustimmen (externalApprovalPending).","properties":{"id":{"type":["string","null"]},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"format":{"enum":["csv","datev"],"type":["string","null"]},"externalApprovalPending":{"default":false,"type":"boolean"},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"csv":{"type":["string","null"]}},"required":["from","to"]},"HrPayrollExport-hr_payroll.write":{"type":"object","description":"Lohn-Export-Vorbereitung (04-08 §4.5, H7/S8-2), keine Abrechnung.\nPOST erzeugt Aggregat-Datei (Stunden/Abwesenheiten/Stammdaten je Periode) fürs Lohnbüro.\nDATEV-Format final mit Lohnbüro abzustimmen (externalApprovalPending).","required":["from","to"],"properties":{"from":{"type":["string","null"]},"to":{"type":["string","null"]},"format":{"enum":["csv","datev"],"type":["string","null"]}}},"HrPayrollExport.jsonld-hr_payroll.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"format":{"enum":["csv","datev"],"type":["string","null"]},"externalApprovalPending":{"default":false,"type":"boolean"},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"csv":{"type":["string","null"]}},"required":["from","to"]}],"description":"Lohn-Export-Vorbereitung (04-08 §4.5, H7/S8-2), keine Abrechnung.\nPOST erzeugt Aggregat-Datei (Stunden/Abwesenheiten/Stammdaten je Periode) fürs Lohnbüro.\nDATEV-Format final mit Lohnbüro abzustimmen (externalApprovalPending)."},"HrPayrollExportRun-hr_payroll_run.read":{"type":"object","description":"Historie der vorbereiteten Lohn-Exporte (04-08 §4.5, Programm 21 AP 5.2-Rest / DII-8).\nRead-only Protokoll — kein Regenerieren: wer, wann, welche Periode, welches Format, wie viele Zeilen.\nGeschützt durch dasselbe `hr.payroll.export`-Recht wie die Export-Erzeugung.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, `identifier: false` — ULID bleibt IRI-Identifier).","type":["integer","null"]},"from":{"description":"Periodenbeginn (Y-m-d).","type":["string","null"]},"to":{"description":"Periodenende (Y-m-d, einschließlich).","type":["string","null"]},"format":{"description":"Ausgabeformat (csv|datev).","type":["string","null"]},"rowCount":{"description":"Anzahl exportierter Mitarbeiterzeilen.","default":0,"type":"integer"},"externalApprovalPending":{"description":"DATEV-Export wartet auf Freigabe des Lohnbüros.","default":false,"type":"boolean"},"createdBy":{"description":"ULID des ausführenden Users (Blameable).","type":["string","null"]},"createdByName":{"description":"Anzeigename des ausführenden Users (aufgelöst, read-only).","type":["string","null"]},"createdAt":{"description":"Zeitpunkt des Exports (ISO-8601).","type":["string","null"]}}},"HrPayrollExportRun.jsonld-hr_payroll_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, `identifier: false` — ULID bleibt IRI-Identifier).","type":["integer","null"]},"from":{"description":"Periodenbeginn (Y-m-d).","type":["string","null"]},"to":{"description":"Periodenende (Y-m-d, einschließlich).","type":["string","null"]},"format":{"description":"Ausgabeformat (csv|datev).","type":["string","null"]},"rowCount":{"description":"Anzahl exportierter Mitarbeiterzeilen.","default":0,"type":"integer"},"externalApprovalPending":{"description":"DATEV-Export wartet auf Freigabe des Lohnbüros.","default":false,"type":"boolean"},"createdBy":{"description":"ULID des ausführenden Users (Blameable).","type":["string","null"]},"createdByName":{"description":"Anzeigename des ausführenden Users (aufgelöst, read-only).","type":["string","null"]},"createdAt":{"description":"Zeitpunkt des Exports (ISO-8601).","type":["string","null"]}}}],"description":"Historie der vorbereiteten Lohn-Exporte (04-08 §4.5, Programm 21 AP 5.2-Rest / DII-8).\nRead-only Protokoll — kein Regenerieren: wer, wann, welche Periode, welches Format, wie viele Zeilen.\nGeschützt durch dasselbe `hr.payroll.export`-Recht wie die Export-Erzeugung."},"HrSkill-hr_skill.read":{"type":"object","description":"Skill-Stammdaten (04-08 §4.2, H4).\nMarkenübergreifende Taxonomie, Grundlage für Skill-Matching; code = stabiler Schlüssel.","properties":{"ulid":{"type":["string","null"]},"code":{"type":["string","null"]},"name":{"type":["string","null"]},"category":{"type":["string","null"]},"description":{"type":["string","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["code","name"]},"HrSkill-hr_skill.write":{"type":"object","description":"Skill-Stammdaten (04-08 §4.2, H4).\nMarkenübergreifende Taxonomie, Grundlage für Skill-Matching; code = stabiler Schlüssel.","required":["code","name"],"properties":{"code":{"type":["string","null"]},"name":{"type":["string","null"]},"category":{"type":["string","null"]},"description":{"type":["string","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"HrSkill-hr_skill.write.jsonMergePatch":{"type":"object","description":"Skill-Stammdaten (04-08 §4.2, H4).\nMarkenübergreifende Taxonomie, Grundlage für Skill-Matching; code = stabiler Schlüssel.","properties":{"code":{"type":["string","null"]},"name":{"type":["string","null"]},"category":{"type":["string","null"]},"description":{"type":["string","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"HrSkill.jsonld-hr_skill.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"code":{"type":["string","null"]},"name":{"type":["string","null"]},"category":{"type":["string","null"]},"description":{"type":["string","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["code","name"]}],"description":"Skill-Stammdaten (04-08 §4.2, H4).\nMarkenübergreifende Taxonomie, Grundlage für Skill-Matching; code = stabiler Schlüssel."},"HydraCollectionBaseSchema":{"allOf":[{"$ref":"#/components/schemas/HydraCollectionBaseSchemaNoPagination"},{"type":"object","properties":{"hydra:view":{"type":"object","properties":{"@id":{"type":"string","format":"iri-reference"},"@type":{"type":"string"},"hydra:first":{"type":["string","null"],"format":"iri-reference"},"hydra:last":{"type":["string","null"],"format":"iri-reference"},"hydra:previous":{"type":["string","null"],"format":"iri-reference"},"hydra:next":{"type":["string","null"],"format":"iri-reference"}},"example":{"@id":"string","@type":"string","hydra:first":"string","hydra:last":"string","hydra:previous":"string","hydra:next":"string"}}}}]},"HydraCollectionBaseSchemaNoPagination":{"type":"object","properties":{"hydra:totalItems":{"type":"integer","minimum":0},"hydra:search":{"type":"object","properties":{"@type":{"type":"string"},"hydra:template":{"type":"string"},"hydra:variableRepresentation":{"type":"string"},"hydra:mapping":{"type":"array","items":{"type":"object","properties":{"@type":{"type":"string"},"variable":{"type":"string"},"property":{"type":["string","null"]},"required":{"type":"boolean"}}}}}}}},"HydraItemBaseSchema":{"type":"object","properties":{"@context":{"oneOf":[{"type":"string"},{"type":"object","properties":{"@vocab":{"type":"string"},"hydra":{"type":"string","enum":["http://www.w3.org/ns/hydra/core#"]}},"required":["@vocab","hydra"],"additionalProperties":true}]},"@id":{"type":"string"},"@type":{"type":"string"}},"required":["@id","@type"]},"ImportJob-import_job.read":{"type":"object","description":"Import-Auftrag (Doc 26 5.4): treibt den Wizard Upload → Mapping → Dry-Run → Async-Lauf → Report →\nStorno. Create nimmt Datei (Base64) + Ziel; Patch setzt Mapping/Strategie; die Aktionen `dry-run`,\n`run` und `revert` sind eigene POST-Endpunkte. Zugriff durchgehend `platform.import.run`.","properties":{"ulid":{"type":["string","null"]},"targetKey":{"maxLength":40,"description":"Ziel-Schlüssel (`lead`, `deal`, `customer`, `contact`, …). Beim Create Pflicht.","default":"","type":"string"},"targetLabel":{"type":["string","null"]},"fileName":{"maxLength":255,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"status":{"default":"pending","type":"string"},"headers":{"description":"Erkannte Kopfspalten der Datei (für das Mapping).","type":"array","items":{"type":"string"}},"mapping":{"description":"Zuordnung Kopfspalte → Ziel-Feldschlüssel.","type":"object","additionalProperties":{"type":"string"}},"suggestedMapping":{"description":"Auto-Vorschlag für das Mapping (nur Create/Get, nicht persistiert).","type":"object","additionalProperties":{"type":"string"}},"fields":{"description":"Feldkatalog des Ziels inkl. Custom Fields.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}},"duplicateStrategy":{"enum":["skip","update","create"],"default":"skip","type":"string"},"total":{"default":0,"type":"integer"},"created":{"default":0,"type":"integer"},"updated":{"default":0,"type":"integer"},"skipped":{"default":0,"type":"integer"},"errorCount":{"default":0,"type":"integer"},"errorRows":{"description":"Zeilenfehler `{line, field, message}` des letzten Laufs.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"batchId":{"type":["string","null"]},"revertedCount":{"description":"Anzahl beim Storno rückgängig gemachter Datensätze (nur `revert`-Antwort, transient).","type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["targetKey"]},"ImportJob-import_job.write":{"type":"object","description":"Import-Auftrag (Doc 26 5.4): treibt den Wizard Upload → Mapping → Dry-Run → Async-Lauf → Report →\nStorno. Create nimmt Datei (Base64) + Ziel; Patch setzt Mapping/Strategie; die Aktionen `dry-run`,\n`run` und `revert` sind eigene POST-Endpunkte. Zugriff durchgehend `platform.import.run`.","required":["targetKey"],"properties":{"targetKey":{"maxLength":40,"description":"Ziel-Schlüssel (`lead`, `deal`, `customer`, `contact`, …). Beim Create Pflicht.","default":"","type":"string"},"content":{"description":"Base64-kodierter Dateiinhalt (nur Create). UTF-8/Windows-1252, Trennzeichen `;`/`,` (auto).","type":["string","null"]},"fileName":{"maxLength":255,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"mapping":{"description":"Zuordnung Kopfspalte → Ziel-Feldschlüssel.","type":"object","additionalProperties":{"type":"string"}},"duplicateStrategy":{"enum":["skip","update","create"],"default":"skip","type":"string"}}},"ImportJob-import_job.write.jsonMergePatch":{"type":"object","description":"Import-Auftrag (Doc 26 5.4): treibt den Wizard Upload → Mapping → Dry-Run → Async-Lauf → Report →\nStorno. Create nimmt Datei (Base64) + Ziel; Patch setzt Mapping/Strategie; die Aktionen `dry-run`,\n`run` und `revert` sind eigene POST-Endpunkte. Zugriff durchgehend `platform.import.run`.","properties":{"targetKey":{"maxLength":40,"description":"Ziel-Schlüssel (`lead`, `deal`, `customer`, `contact`, …). Beim Create Pflicht.","default":"","type":"string"},"content":{"description":"Base64-kodierter Dateiinhalt (nur Create). UTF-8/Windows-1252, Trennzeichen `;`/`,` (auto).","type":["string","null"]},"fileName":{"maxLength":255,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"mapping":{"description":"Zuordnung Kopfspalte → Ziel-Feldschlüssel.","type":"object","additionalProperties":{"type":"string"}},"duplicateStrategy":{"enum":["skip","update","create"],"default":"skip","type":"string"}}},"ImportJob.jsonld-import_job.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"targetKey":{"maxLength":40,"description":"Ziel-Schlüssel (`lead`, `deal`, `customer`, `contact`, …). Beim Create Pflicht.","default":"","type":"string"},"targetLabel":{"type":["string","null"]},"fileName":{"maxLength":255,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"status":{"default":"pending","type":"string"},"headers":{"description":"Erkannte Kopfspalten der Datei (für das Mapping).","type":"array","items":{"type":"string"}},"mapping":{"description":"Zuordnung Kopfspalte → Ziel-Feldschlüssel.","type":"object","additionalProperties":{"type":"string"}},"suggestedMapping":{"description":"Auto-Vorschlag für das Mapping (nur Create/Get, nicht persistiert).","type":"object","additionalProperties":{"type":"string"}},"fields":{"description":"Feldkatalog des Ziels inkl. Custom Fields.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}},"duplicateStrategy":{"enum":["skip","update","create"],"default":"skip","type":"string"},"total":{"default":0,"type":"integer"},"created":{"default":0,"type":"integer"},"updated":{"default":0,"type":"integer"},"skipped":{"default":0,"type":"integer"},"errorCount":{"default":0,"type":"integer"},"errorRows":{"description":"Zeilenfehler `{line, field, message}` des letzten Laufs.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"batchId":{"type":["string","null"]},"revertedCount":{"description":"Anzahl beim Storno rückgängig gemachter Datensätze (nur `revert`-Antwort, transient).","type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["targetKey"]}],"description":"Import-Auftrag (Doc 26 5.4): treibt den Wizard Upload → Mapping → Dry-Run → Async-Lauf → Report →\nStorno. Create nimmt Datei (Base64) + Ziel; Patch setzt Mapping/Strategie; die Aktionen `dry-run`,\n`run` und `revert` sind eigene POST-Endpunkte. Zugriff durchgehend `platform.import.run`."},"ImportTarget-import_target.read":{"type":"object","description":"Verfügbare Import-Ziele (Doc 26 5.4/5.5): Schlüssel, Label und Feldkatalog je Target. Speist die\nZiel-Auswahl und die Mapping-Feldliste des Import-Wizards. Read-only, aggregiert aus dem\n{@see \\App\\Platform\\Import\\Service\\ImportTargetRegistry}.","properties":{"key":{"default":"","type":"string"},"label":{"default":"","type":"string"},"fields":{"description":"Abbildbare Zielfelder inkl. Custom Fields.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}}}},"ImportTarget.jsonld-import_target.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"default":"","type":"string"},"label":{"default":"","type":"string"},"fields":{"description":"Abbildbare Zielfelder inkl. Custom Fields.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}}}}],"description":"Verfügbare Import-Ziele (Doc 26 5.4/5.5): Schlüssel, Label und Feldkatalog je Target. Speist die\nZiel-Auswahl und die Mapping-Feldliste des Import-Wizards. Read-only, aggregiert aus dem\n{@see \\App\\Platform\\Import\\Service\\ImportTargetRegistry}."},"InboundForm-inbound_form.read":{"type":"object","description":"Öffentliches Kontakt-/Support-Webformular (AP-6.3) — erster Eingangskanal neben Mail.\nBewusst öffentlich (`security: 'true'`, PUBLIC_ACCESS `/v1/tickets/public/`); Bot-Schutz via\nHoneypot-Feld ({@see $website}). Läuft durch dieselbe Pipeline wie Mail\n({@see \\Octi\\Plugin\\Tickets\\Service\\MessageIngestionService}): Identitäts-Matching → Routing/Triage\n→ Vorgang/Eingangskorb. Formularfelder Betreff/Kategorie = Erstklassifikation.","properties":{"reference":{"type":["string","null"]}}},"InboundForm-inbound_form.write":{"type":"object","description":"Öffentliches Kontakt-/Support-Webformular (AP-6.3) — erster Eingangskanal neben Mail.\nBewusst öffentlich (`security: 'true'`, PUBLIC_ACCESS `/v1/tickets/public/`); Bot-Schutz via\nHoneypot-Feld ({@see $website}). Läuft durch dieselbe Pipeline wie Mail\n({@see \\Octi\\Plugin\\Tickets\\Service\\MessageIngestionService}): Identitäts-Matching → Routing/Triage\n→ Vorgang/Eingangskorb. Formularfelder Betreff/Kategorie = Erstklassifikation.","required":["email","subject","message"],"properties":{"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"name":{"maxLength":150,"type":["string","null"]},"subject":{"maxLength":255,"type":["string","null"]},"message":{"maxLength":10000,"type":["string","null"]},"brandId":{"description":"Optionale Marken-Zuordnung (z. B. eine eigene Formularinstanz je Marke).","type":["integer","null"]},"categoryKey":{"maxLength":50,"description":"Strukturierte Erstklassifikation aus dem Formular (Kategorie-Key).","type":["string","null"]},"website":{"description":"Honeypot: für Menschen unsichtbares Feld. Befüllt → Bot; Absendung wird still akzeptiert,\naber kein Vorgang erzeugt.","type":["string","null"]}}},"InboundForm.jsonld-inbound_form.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"reference":{"type":["string","null"]}}}],"description":"Öffentliches Kontakt-/Support-Webformular (AP-6.3) — erster Eingangskanal neben Mail.\nBewusst öffentlich (`security: 'true'`, PUBLIC_ACCESS `/v1/tickets/public/`); Bot-Schutz via\nHoneypot-Feld ({@see $website}). Läuft durch dieselbe Pipeline wie Mail\n({@see \\Octi\\Plugin\\Tickets\\Service\\MessageIngestionService}): Identitäts-Matching → Routing/Triage\n→ Vorgang/Eingangskorb. Formularfelder Betreff/Kategorie = Erstklassifikation."},"Integration-integration.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"provider":{"maxLength":100,"default":"","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"active":{"default":false,"type":"boolean"},"config":{"description":"Secret-Schlüssel (z.B. `client_secret`) write-only: verschlüsselt gespeichert, maskiert gelesen (siehe IntegrationConfigSecrets).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["provider","name"]},"Integration-integration.write":{"type":"object","required":["provider","name"],"properties":{"provider":{"maxLength":100,"default":"","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"active":{"default":false,"type":"boolean"},"config":{"description":"Secret-Schlüssel (z.B. `client_secret`) write-only: verschlüsselt gespeichert, maskiert gelesen (siehe IntegrationConfigSecrets).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]}}},"Integration-integration.write.jsonMergePatch":{"type":"object","properties":{"provider":{"maxLength":100,"default":"","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"active":{"default":false,"type":"boolean"},"config":{"description":"Secret-Schlüssel (z.B. `client_secret`) write-only: verschlüsselt gespeichert, maskiert gelesen (siehe IntegrationConfigSecrets).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]}}},"Integration.jsonld-integration.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"provider":{"maxLength":100,"default":"","type":"string"},"name":{"maxLength":255,"default":"","type":"string"},"active":{"default":false,"type":"boolean"},"config":{"description":"Secret-Schlüssel (z.B. `client_secret`) write-only: verschlüsselt gespeichert, maskiert gelesen (siehe IntegrationConfigSecrets).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["provider","name"]}]},"Invoice-invoice.read":{"type":"object","description":"Rechnungs-Resource (04-21 §8, API-First).\n- CRUD im Entwurf + Workflow-Ops: festschreiben (lückenlose Nummer, GoBD), stornieren (Storno+Gutschrift, Antwort trägt `creditNoteUlid`), Mail-Versand (`.../send`, PDF-Anhang, Audit R18 #71), PDF-Download, One-Click „Auftrag → Rechnung\" (`.../from-order`).\n- Positionen eingebettet (`items`), beim Speichern bepreist (Kernel-LineCalculator); Summen read-only.\n- PATCH/DELETE nur im Entwurf — ab `sent` unveränderlich (409, Korrektur via Storno).\n- ULID-Requirement verhindert Match auf Literal-Segmente `from-order`/`dunning-run` (Muster SalesOrder).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"number":{"description":"Lückenlose Belegnummer (GoBD) — gezogen erst beim Festschreiben.","type":["string","null"]},"type":{"enum":["standard","partial","final","recurring","credit","proforma"],"description":"standard | partial | final | recurring | credit (credit nur via Storno, nicht direkt).","type":["string","null"]},"taxMode":{"enum":["standard","small_business","exempt"],"description":"standard | small_business (§19) | exempt (§4) — steuert USt-Ausweis + Pflichthinweis.","type":["string","null"]},"eInvoiceFormat":{"enum":["xrechnung","zugferd"],"description":"`xrechnung` (reines XML, B2G-Pflicht) oder `zugferd` (Daten im PDF, B2B-Regelfall).","type":["string","null"]},"eInvoiceFileId":{"type":["integer","null"]},"buyerReference":{"maxLength":100,"description":"Käufer-Referenz / Leitweg-ID (EN16931 BT-10), Pflichtfeld der XRechnung; im Entwurf editierbar.","type":["string","null"]},"status":{"description":"Lebenszyklus-Status (read-only — Übergänge laufen über issue/cancel bzw. Zahlung/Mahnlauf).","type":["string","null"]},"currency":{"minLength":3,"maxLength":3,"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieser Rechnung stehen in ihr.","type":["string","null"]},"fxRate":{"description":"Eingefrorener Umrechnungskurs (Fremdwährungseinheiten je 1 EUR); EUR-Beleg → \"1.00000000\".","type":["string","null"]},"totalBaseAmount":{"description":"EUR-Gegenwert des Rechnungsbetrags (Cent) — der Buchwert, mit dem DATEV und die\nOSS-Meldung rechnen. Bei EUR-Belegen identisch mit `totalAmount`.","type":["integer","null"]},"issueDate":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"deliveryDate":{"type":["string","null"]},"servicePeriodFrom":{"type":["string","null"]},"servicePeriodTo":{"type":["string","null"]},"paymentTermDays":{"minimum":0,"type":["integer","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`); beim Festschreiben eingefroren.","type":["string","null"]},"paymentTermDiscounts":{"description":"Am Beleg eingefrorene Skontostufen `[{days, percentBp}]` (read-only, entsteht beim Festschreiben).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"cashDiscountAmount":{"description":"Gewährter Skontoabzug in Cent (Doc 25 AP 1.4) — mindert den offenen Posten.","type":["integer","null"]},"paymentUrl":{"description":"Zahlungs-Link-Seam (Programm 21 AP 5.8): read-only, künftige PSP-Anbindung; gesetzt ⇒ Portal zeigt „Jetzt bezahlen\".","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland). Zusätzlich zu `taxMode` (§19/§4) — greift einer von beiden, keine USt.","type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"paidAmount":{"type":["integer","null"]},"openAmount":{"description":"Offener Betrag (total − paid, nie negativ) — abgeleitet.","type":["integer","null"]},"cancelledOfId":{"description":"Gutschrift/Korrektur → Original-Rechnung (nur type=credit).","type":["integer","null"]},"cancelledOfNumber":{"description":"Belegnummer der Original-Rechnung (Anzeige der Korrektur-Kette, nur type=credit).","type":["string","null"]},"creditKind":{"description":"Gutschrift-Ausprägung: storno (Voll-Storno) | correction (Teilkorrektur) — nur type=credit.","type":["string","null"]},"correctionReason":{"maxLength":500,"description":"Korrektur-/Storno-Grund (nur type=credit).","type":["string","null"]},"sourceRecurringInvoiceId":{"description":"Herkunfts-Serienrechnung (nur type=recurring).","type":["integer","null"]},"consolidatedOrderIds":{"description":"Sammelrechnung: gebündelte Auftrags-IDs.","type":["array","null"],"items":{"type":"integer"}},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sourceOrderId":{"type":["integer","null"]},"sourceContractId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen. Schreiben: Liste von\n{itemType?(article|text|heading|subtotal|separator|pagebreak), description, longText?, isOptional?,\nproductId?, qty, unit?, unitPriceAmount, discountPercent?, discountAmount?, taxRate?, taxCategory?, sourceRef?}.","type":["array","null"],"items":{"type":["string","null"]}},"creditNoteUlid":{"description":"ULID der beim Storno erzeugten Gutschrift (Antwort der cancel-Aktion).","type":["string","null"]},"mailSent":{"description":"Antwort der send-Aktion: Beleg-Mail an (outbox-)Mailer übergeben?","type":["boolean","null"]},"availableOutputWays":{"description":"Ausgabewege, die dieser Beleg anbieten kann (Doc 40 Stufe 6) — nur an der Einzelansicht\ngefüllt; die Oberfläche schaltet daran ihre Schalter scharf.","type":["array","null"],"items":{"type":"string"}},"standingAttachments":{"description":"Feste Beleg-Beilagen, die an diesem Beleg automatisch mitgehen (Doc 40) — nur an der\nEinzelansicht gefüllt, damit der Abschluss-Dialog sie zeigen kann.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"Invoice-invoice.write":{"type":"object","description":"Rechnungs-Resource (04-21 §8, API-First).\n- CRUD im Entwurf + Workflow-Ops: festschreiben (lückenlose Nummer, GoBD), stornieren (Storno+Gutschrift, Antwort trägt `creditNoteUlid`), Mail-Versand (`.../send`, PDF-Anhang, Audit R18 #71), PDF-Download, One-Click „Auftrag → Rechnung\" (`.../from-order`).\n- Positionen eingebettet (`items`), beim Speichern bepreist (Kernel-LineCalculator); Summen read-only.\n- PATCH/DELETE nur im Entwurf — ab `sent` unveränderlich (409, Korrektur via Storno).\n- ULID-Requirement verhindert Match auf Literal-Segmente `from-order`/`dunning-run` (Muster SalesOrder).","properties":{"type":{"enum":["standard","partial","final","recurring","credit","proforma"],"description":"standard | partial | final | recurring | credit (credit nur via Storno, nicht direkt).","type":["string","null"]},"taxMode":{"enum":["standard","small_business","exempt"],"description":"standard | small_business (§19) | exempt (§4) — steuert USt-Ausweis + Pflichthinweis.","type":["string","null"]},"eInvoiceFormat":{"enum":["xrechnung","zugferd"],"description":"`xrechnung` (reines XML, B2G-Pflicht) oder `zugferd` (Daten im PDF, B2B-Regelfall).","type":["string","null"]},"buyerReference":{"maxLength":100,"description":"Käufer-Referenz / Leitweg-ID (EN16931 BT-10), Pflichtfeld der XRechnung; im Entwurf editierbar.","type":["string","null"]},"currency":{"minLength":3,"maxLength":3,"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieser Rechnung stehen in ihr.","type":["string","null"]},"deliveryDate":{"type":["string","null"]},"servicePeriodFrom":{"type":["string","null"]},"servicePeriodTo":{"type":["string","null"]},"paymentTermDays":{"minimum":0,"type":["integer","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`); beim Festschreiben eingefroren.","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland). Zusätzlich zu `taxMode` (§19/§4) — greift einer von beiden, keine USt.","type":["string","null"]},"correctionReason":{"maxLength":500,"description":"Korrektur-/Storno-Grund (nur type=credit).","type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sourceContractId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen. Schreiben: Liste von\n{itemType?(article|text|heading|subtotal|separator|pagebreak), description, longText?, isOptional?,\nproductId?, qty, unit?, unitPriceAmount, discountPercent?, discountAmount?, taxRate?, taxCategory?, sourceRef?}.","type":["array","null"],"items":{"type":["string","null"]}},"orderUlid":{"description":"Auftrags-ULID für die from-order-Aktion.","type":["string","null"]},"dispatch":{"description":"Belegausgabe der send-Aktion (Doc 40 Stufe 5, ENT-BELEG-04) — Form wie bei\n{@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteResource::$dispatch}; ohne Angabe bleibt es beim\nbisherigen Weg (Mail an den Kunden-Hauptkontakt mit der Standardvorlage).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"Invoice-invoice.write.jsonMergePatch":{"type":"object","description":"Rechnungs-Resource (04-21 §8, API-First).\n- CRUD im Entwurf + Workflow-Ops: festschreiben (lückenlose Nummer, GoBD), stornieren (Storno+Gutschrift, Antwort trägt `creditNoteUlid`), Mail-Versand (`.../send`, PDF-Anhang, Audit R18 #71), PDF-Download, One-Click „Auftrag → Rechnung\" (`.../from-order`).\n- Positionen eingebettet (`items`), beim Speichern bepreist (Kernel-LineCalculator); Summen read-only.\n- PATCH/DELETE nur im Entwurf — ab `sent` unveränderlich (409, Korrektur via Storno).\n- ULID-Requirement verhindert Match auf Literal-Segmente `from-order`/`dunning-run` (Muster SalesOrder).","properties":{"type":{"enum":["standard","partial","final","recurring","credit","proforma"],"description":"standard | partial | final | recurring | credit (credit nur via Storno, nicht direkt).","type":["string","null"]},"taxMode":{"enum":["standard","small_business","exempt"],"description":"standard | small_business (§19) | exempt (§4) — steuert USt-Ausweis + Pflichthinweis.","type":["string","null"]},"eInvoiceFormat":{"enum":["xrechnung","zugferd"],"description":"`xrechnung` (reines XML, B2G-Pflicht) oder `zugferd` (Daten im PDF, B2B-Regelfall).","type":["string","null"]},"buyerReference":{"maxLength":100,"description":"Käufer-Referenz / Leitweg-ID (EN16931 BT-10), Pflichtfeld der XRechnung; im Entwurf editierbar.","type":["string","null"]},"currency":{"minLength":3,"maxLength":3,"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieser Rechnung stehen in ihr.","type":["string","null"]},"deliveryDate":{"type":["string","null"]},"servicePeriodFrom":{"type":["string","null"]},"servicePeriodTo":{"type":["string","null"]},"paymentTermDays":{"minimum":0,"type":["integer","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`); beim Festschreiben eingefroren.","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland). Zusätzlich zu `taxMode` (§19/§4) — greift einer von beiden, keine USt.","type":["string","null"]},"correctionReason":{"maxLength":500,"description":"Korrektur-/Storno-Grund (nur type=credit).","type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sourceContractId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen. Schreiben: Liste von\n{itemType?(article|text|heading|subtotal|separator|pagebreak), description, longText?, isOptional?,\nproductId?, qty, unit?, unitPriceAmount, discountPercent?, discountAmount?, taxRate?, taxCategory?, sourceRef?}.","type":["array","null"],"items":{"type":["string","null"]}},"orderUlid":{"description":"Auftrags-ULID für die from-order-Aktion.","type":["string","null"]},"dispatch":{"description":"Belegausgabe der send-Aktion (Doc 40 Stufe 5, ENT-BELEG-04) — Form wie bei\n{@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteResource::$dispatch}; ohne Angabe bleibt es beim\nbisherigen Weg (Mail an den Kunden-Hauptkontakt mit der Standardvorlage).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"Invoice.jsonld-invoice.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"number":{"description":"Lückenlose Belegnummer (GoBD) — gezogen erst beim Festschreiben.","type":["string","null"]},"type":{"enum":["standard","partial","final","recurring","credit","proforma"],"description":"standard | partial | final | recurring | credit (credit nur via Storno, nicht direkt).","type":["string","null"]},"taxMode":{"enum":["standard","small_business","exempt"],"description":"standard | small_business (§19) | exempt (§4) — steuert USt-Ausweis + Pflichthinweis.","type":["string","null"]},"eInvoiceFormat":{"enum":["xrechnung","zugferd"],"description":"`xrechnung` (reines XML, B2G-Pflicht) oder `zugferd` (Daten im PDF, B2B-Regelfall).","type":["string","null"]},"eInvoiceFileId":{"type":["integer","null"]},"buyerReference":{"maxLength":100,"description":"Käufer-Referenz / Leitweg-ID (EN16931 BT-10), Pflichtfeld der XRechnung; im Entwurf editierbar.","type":["string","null"]},"status":{"description":"Lebenszyklus-Status (read-only — Übergänge laufen über issue/cancel bzw. Zahlung/Mahnlauf).","type":["string","null"]},"currency":{"minLength":3,"maxLength":3,"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieser Rechnung stehen in ihr.","type":["string","null"]},"fxRate":{"description":"Eingefrorener Umrechnungskurs (Fremdwährungseinheiten je 1 EUR); EUR-Beleg → \"1.00000000\".","type":["string","null"]},"totalBaseAmount":{"description":"EUR-Gegenwert des Rechnungsbetrags (Cent) — der Buchwert, mit dem DATEV und die\nOSS-Meldung rechnen. Bei EUR-Belegen identisch mit `totalAmount`.","type":["integer","null"]},"issueDate":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"deliveryDate":{"type":["string","null"]},"servicePeriodFrom":{"type":["string","null"]},"servicePeriodTo":{"type":["string","null"]},"paymentTermDays":{"minimum":0,"type":["integer","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`); beim Festschreiben eingefroren.","type":["string","null"]},"paymentTermDiscounts":{"description":"Am Beleg eingefrorene Skontostufen `[{days, percentBp}]` (read-only, entsteht beim Festschreiben).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"cashDiscountAmount":{"description":"Gewährter Skontoabzug in Cent (Doc 25 AP 1.4) — mindert den offenen Posten.","type":["integer","null"]},"paymentUrl":{"description":"Zahlungs-Link-Seam (Programm 21 AP 5.8): read-only, künftige PSP-Anbindung; gesetzt ⇒ Portal zeigt „Jetzt bezahlen\".","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland). Zusätzlich zu `taxMode` (§19/§4) — greift einer von beiden, keine USt.","type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"paidAmount":{"type":["integer","null"]},"openAmount":{"description":"Offener Betrag (total − paid, nie negativ) — abgeleitet.","type":["integer","null"]},"cancelledOfId":{"description":"Gutschrift/Korrektur → Original-Rechnung (nur type=credit).","type":["integer","null"]},"cancelledOfNumber":{"description":"Belegnummer der Original-Rechnung (Anzeige der Korrektur-Kette, nur type=credit).","type":["string","null"]},"creditKind":{"description":"Gutschrift-Ausprägung: storno (Voll-Storno) | correction (Teilkorrektur) — nur type=credit.","type":["string","null"]},"correctionReason":{"maxLength":500,"description":"Korrektur-/Storno-Grund (nur type=credit).","type":["string","null"]},"sourceRecurringInvoiceId":{"description":"Herkunfts-Serienrechnung (nur type=recurring).","type":["integer","null"]},"consolidatedOrderIds":{"description":"Sammelrechnung: gebündelte Auftrags-IDs.","type":["array","null"],"items":{"type":"integer"}},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sourceOrderId":{"type":["integer","null"]},"sourceContractId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen. Schreiben: Liste von\n{itemType?(article|text|heading|subtotal|separator|pagebreak), description, longText?, isOptional?,\nproductId?, qty, unit?, unitPriceAmount, discountPercent?, discountAmount?, taxRate?, taxCategory?, sourceRef?}.","type":["array","null"],"items":{"type":["string","null"]}},"creditNoteUlid":{"description":"ULID der beim Storno erzeugten Gutschrift (Antwort der cancel-Aktion).","type":["string","null"]},"mailSent":{"description":"Antwort der send-Aktion: Beleg-Mail an (outbox-)Mailer übergeben?","type":["boolean","null"]},"availableOutputWays":{"description":"Ausgabewege, die dieser Beleg anbieten kann (Doc 40 Stufe 6) — nur an der Einzelansicht\ngefüllt; die Oberfläche schaltet daran ihre Schalter scharf.","type":["array","null"],"items":{"type":"string"}},"standingAttachments":{"description":"Feste Beleg-Beilagen, die an diesem Beleg automatisch mitgehen (Doc 40) — nur an der\nEinzelansicht gefüllt, damit der Abschluss-Dialog sie zeigen kann.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}}],"description":"Rechnungs-Resource (04-21 §8, API-First).\n- CRUD im Entwurf + Workflow-Ops: festschreiben (lückenlose Nummer, GoBD), stornieren (Storno+Gutschrift, Antwort trägt `creditNoteUlid`), Mail-Versand (`.../send`, PDF-Anhang, Audit R18 #71), PDF-Download, One-Click „Auftrag → Rechnung\" (`.../from-order`).\n- Positionen eingebettet (`items`), beim Speichern bepreist (Kernel-LineCalculator); Summen read-only.\n- PATCH/DELETE nur im Entwurf — ab `sent` unveränderlich (409, Korrektur via Storno).\n- ULID-Requirement verhindert Match auf Literal-Segmente `from-order`/`dunning-run` (Muster SalesOrder)."},"InvoiceCorrectionSummary-invoice_correction_summary.read":{"type":"object","description":"Kennzahl-Aggregat der Rechnungskorrekturen (Muster {@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteSummaryResource}):\nAnzahl + Summe über den GESAMTEN Korrektur-Bestand (type=credit), nicht nur die geladene Seite.\nErsetzt die clientseitige `listAll`-Reduktion der Korrektur-Ansicht (Audit R25) — die holte den\nBestand seitenweise über die reguläre Rechnungs-Collection und war zusätzlich still bei 5000\nDatensätzen abgeschnitten. Read-only, markenscope-gefiltert, Ein-Element-Collection.","properties":{"id":{"type":["string","null"]},"count":{"description":"Anzahl Korrekturen/Gutschriften (type=credit, nicht gelöscht) im Marken-Scope.","type":["integer","null"]},"totalAmount":{"description":"Gesamtsumme dieser Korrekturen in Cent: SUM(totalAmount).","type":["integer","null"]}}},"InvoiceCorrectionSummary.jsonld-invoice_correction_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"count":{"description":"Anzahl Korrekturen/Gutschriften (type=credit, nicht gelöscht) im Marken-Scope.","type":["integer","null"]},"totalAmount":{"description":"Gesamtsumme dieser Korrekturen in Cent: SUM(totalAmount).","type":["integer","null"]}}}],"description":"Kennzahl-Aggregat der Rechnungskorrekturen (Muster {@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteSummaryResource}):\nAnzahl + Summe über den GESAMTEN Korrektur-Bestand (type=credit), nicht nur die geladene Seite.\nErsetzt die clientseitige `listAll`-Reduktion der Korrektur-Ansicht (Audit R25) — die holte den\nBestand seitenweise über die reguläre Rechnungs-Collection und war zusätzlich still bei 5000\nDatensätzen abgeschnitten. Read-only, markenscope-gefiltert, Ein-Element-Collection."},"InvoiceDunning-invoice_dunning.read":{"type":"object","description":"Mahnvorgänge (04-21 §6/§9, Audit R18 #65).\n- Mahnhistorie je Rechnung (`GET .../{ulid}/dunnings`).\n- Mahnlauf über alle fälligen Posten (`POST /v1/invoices/dunning-run` → {overdueMarked, dunningsCreated}).\n- Mahn-Workflow je Mahnung: PDF (`GET .../{dunningUlid}/pdf`), Mail-Versand (`.../send`, setzt sentAt), „als versendet markieren\" (`.../mark-sent`, Postweg), Erledigen (`.../resolve`).\n- Plugin-Segment `invoices` (kein Descriptor-Segment); ULID-Requirement verhindert Match auf Literal `dunning-run`.","properties":{"ulid":{"type":["string","null"]},"invoiceUlid":{"type":["string","null"]},"level":{"type":["integer","null"]},"sentAt":{"type":["string","null"]},"dueAt":{"description":"Zahlfrist dieser Mahnung.","type":["string","null"]},"feeAmount":{"description":"Mahngebühr in Cent der BELEGwährung (nicht im openAmount der Rechnung, ENT-FIN-DUNNING-01).","type":["integer","null"]},"interestAmount":{"description":"Verzugszins in Cent.","type":["integer","null"]},"status":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"mailSent":{"description":"Antwort der send-Aktion: Mahn-Mail an (outbox-)Mailer übergeben?","type":["boolean","null"]}}},"InvoiceDunning-invoice_dunning.write":{"type":"object","description":"Mahnvorgänge (04-21 §6/§9, Audit R18 #65).\n- Mahnhistorie je Rechnung (`GET .../{ulid}/dunnings`).\n- Mahnlauf über alle fälligen Posten (`POST /v1/invoices/dunning-run` → {overdueMarked, dunningsCreated}).\n- Mahn-Workflow je Mahnung: PDF (`GET .../{dunningUlid}/pdf`), Mail-Versand (`.../send`, setzt sentAt), „als versendet markieren\" (`.../mark-sent`, Postweg), Erledigen (`.../resolve`).\n- Plugin-Segment `invoices` (kein Descriptor-Segment); ULID-Requirement verhindert Match auf Literal `dunning-run`.","properties":{"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Marken-Einschränkung des Mahnlaufs (dunning-run-Aktion).","type":["integer","null"]}}},"InvoiceDunning.jsonld-invoice_dunning.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"invoiceUlid":{"type":["string","null"]},"level":{"type":["integer","null"]},"sentAt":{"type":["string","null"]},"dueAt":{"description":"Zahlfrist dieser Mahnung.","type":["string","null"]},"feeAmount":{"description":"Mahngebühr in Cent der BELEGwährung (nicht im openAmount der Rechnung, ENT-FIN-DUNNING-01).","type":["integer","null"]},"interestAmount":{"description":"Verzugszins in Cent.","type":["integer","null"]},"status":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"mailSent":{"description":"Antwort der send-Aktion: Mahn-Mail an (outbox-)Mailer übergeben?","type":["boolean","null"]}}}],"description":"Mahnvorgänge (04-21 §6/§9, Audit R18 #65).\n- Mahnhistorie je Rechnung (`GET .../{ulid}/dunnings`).\n- Mahnlauf über alle fälligen Posten (`POST /v1/invoices/dunning-run` → {overdueMarked, dunningsCreated}).\n- Mahn-Workflow je Mahnung: PDF (`GET .../{dunningUlid}/pdf`), Mail-Versand (`.../send`, setzt sentAt), „als versendet markieren\" (`.../mark-sent`, Postweg), Erledigen (`.../resolve`).\n- Plugin-Segment `invoices` (kein Descriptor-Segment); ULID-Requirement verhindert Match auf Literal `dunning-run`."},"InvoicePayment-invoice_payment.read":{"type":"object","description":"Zahlungseingänge (04-21 §8): erfassen (optionale Zuordnungen `matches` →\n{@see \\Octi\\Plugin\\Invoicing\\Service\\PaymentMatchService}, schreibt paidAmount/Status der Rechnungen fort) und listen.\nBrand-Scope wie die Rechnungs-Resource.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"amountCents":{"minimum":0,"exclusiveMinimum":0,"description":"Zahlbetrag in Cent.","type":["integer","null"]},"paidAt":{"description":"Zahlungseingang (ISO-8601).","type":["string","null"]},"method":{"maxLength":30,"type":["string","null"]},"reference":{"maxLength":140,"type":["string","null"]},"source":{"enum":["bank","lexoffice","manual"],"description":"Herkunft: bank | lexoffice | manual (Default manual).","type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"matches":{"description":"Zuordnungen. Schreiben (POST): Liste von {invoiceUlid, amount}. Lesen: zusätzlich\nmatchType (full/partial/over) und autoMatched.","type":["array","null"],"items":{"type":["string","null"]}}}},"InvoicePayment-invoice_payment.write":{"type":"object","description":"Zahlungseingänge (04-21 §8): erfassen (optionale Zuordnungen `matches` →\n{@see \\Octi\\Plugin\\Invoicing\\Service\\PaymentMatchService}, schreibt paidAmount/Status der Rechnungen fort) und listen.\nBrand-Scope wie die Rechnungs-Resource.","properties":{"amountCents":{"minimum":0,"exclusiveMinimum":0,"description":"Zahlbetrag in Cent.","type":["integer","null"]},"paidAt":{"description":"Zahlungseingang (ISO-8601).","type":["string","null"]},"method":{"maxLength":30,"type":["string","null"]},"reference":{"maxLength":140,"type":["string","null"]},"source":{"enum":["bank","lexoffice","manual"],"description":"Herkunft: bank | lexoffice | manual (Default manual).","type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"matches":{"description":"Zuordnungen. Schreiben (POST): Liste von {invoiceUlid, amount}. Lesen: zusätzlich\nmatchType (full/partial/over) und autoMatched.","type":["array","null"],"items":{"type":["string","null"]}}}},"InvoicePayment.jsonld-invoice_payment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"amountCents":{"minimum":0,"exclusiveMinimum":0,"description":"Zahlbetrag in Cent.","type":["integer","null"]},"paidAt":{"description":"Zahlungseingang (ISO-8601).","type":["string","null"]},"method":{"maxLength":30,"type":["string","null"]},"reference":{"maxLength":140,"type":["string","null"]},"source":{"enum":["bank","lexoffice","manual"],"description":"Herkunft: bank | lexoffice | manual (Default manual).","type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"matches":{"description":"Zuordnungen. Schreiben (POST): Liste von {invoiceUlid, amount}. Lesen: zusätzlich\nmatchType (full/partial/over) und autoMatched.","type":["array","null"],"items":{"type":["string","null"]}}}}],"description":"Zahlungseingänge (04-21 §8): erfassen (optionale Zuordnungen `matches` →\n{@see \\Octi\\Plugin\\Invoicing\\Service\\PaymentMatchService}, schreibt paidAmount/Status der Rechnungen fort) und listen.\nBrand-Scope wie die Rechnungs-Resource."},"KnowledgeArticle-know_article.read":{"type":"object","description":"Wissensartikel (04-10 §4.2).\n\n- CRUD + /publish, /versions (Verlauf+Diff), /restore (= neue Version).\n- Body wird beim Speichern serverseitig sanitisiert; saveVersion steuert Draft-Auto-Save vs. neue Version.\n- Sicht/Bearbeitung: {@see \\Octi\\Plugin\\Knowledge\\Security\\ArticleVoter} (Space-Zugriff) + globale Permission.","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":255,"type":["string","null"]},"slug":{"maxLength":255,"type":["string","null"]},"spaceUlid":{"maxLength":26,"description":"Bereich (ULID) — beim Anlegen erforderlich.","type":["string","null"]},"spaceName":{"type":["string","null"]},"parentUlid":{"maxLength":26,"type":["string","null"]},"status":{"enum":["draft","review","published","archived"],"type":["string","null"]},"excerpt":{"maxLength":500,"type":["string","null"]},"bodyHtml":{"description":"Roh-HTML als Eingabe (wird sanitisiert); Ausgabe = sanitisierter Stand.","type":["string","null"]},"bodyText":{"type":["string","null"]},"currentVersionNo":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"reviewIntervalDays":{"minimum":0,"type":["integer","null"]},"lastReviewedAt":{"type":["string","null"]},"needsReview":{"type":["boolean","null"]},"publishedToPortal":{"type":["boolean","null"]},"isFavorite":{"type":["boolean","null"]},"versions":{"description":"Versionsverlauf (nur /versions).","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"diff":{"description":"Text-Diff zwischen zwei Versionen (nur /versions?from=&to=).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"KnowledgeArticle-know_article.write":{"type":"object","description":"Wissensartikel (04-10 §4.2).\n\n- CRUD + /publish, /versions (Verlauf+Diff), /restore (= neue Version).\n- Body wird beim Speichern serverseitig sanitisiert; saveVersion steuert Draft-Auto-Save vs. neue Version.\n- Sicht/Bearbeitung: {@see \\Octi\\Plugin\\Knowledge\\Security\\ArticleVoter} (Space-Zugriff) + globale Permission.","properties":{"title":{"maxLength":255,"type":["string","null"]},"slug":{"maxLength":255,"type":["string","null"]},"spaceUlid":{"maxLength":26,"description":"Bereich (ULID) — beim Anlegen erforderlich.","type":["string","null"]},"parentUlid":{"maxLength":26,"type":["string","null"]},"status":{"enum":["draft","review","published","archived"],"type":["string","null"]},"excerpt":{"maxLength":500,"type":["string","null"]},"bodyHtml":{"description":"Roh-HTML als Eingabe (wird sanitisiert); Ausgabe = sanitisierter Stand.","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"reviewIntervalDays":{"minimum":0,"type":["integer","null"]},"publishedToPortal":{"type":["boolean","null"]},"saveVersion":{"description":"Schreibend: neue Version statt Draft-Auto-Save anlegen.","type":["boolean","null"]},"editSummary":{"maxLength":255,"description":"Schreibend: Versionskommentar; bei /restore die wiederherzustellende Versionsnummer.","type":["string","null"]},"versionNo":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"KnowledgeArticle-know_article.write.jsonMergePatch":{"type":"object","description":"Wissensartikel (04-10 §4.2).\n\n- CRUD + /publish, /versions (Verlauf+Diff), /restore (= neue Version).\n- Body wird beim Speichern serverseitig sanitisiert; saveVersion steuert Draft-Auto-Save vs. neue Version.\n- Sicht/Bearbeitung: {@see \\Octi\\Plugin\\Knowledge\\Security\\ArticleVoter} (Space-Zugriff) + globale Permission.","properties":{"title":{"maxLength":255,"type":["string","null"]},"slug":{"maxLength":255,"type":["string","null"]},"spaceUlid":{"maxLength":26,"description":"Bereich (ULID) — beim Anlegen erforderlich.","type":["string","null"]},"parentUlid":{"maxLength":26,"type":["string","null"]},"status":{"enum":["draft","review","published","archived"],"type":["string","null"]},"excerpt":{"maxLength":500,"type":["string","null"]},"bodyHtml":{"description":"Roh-HTML als Eingabe (wird sanitisiert); Ausgabe = sanitisierter Stand.","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"reviewIntervalDays":{"minimum":0,"type":["integer","null"]},"publishedToPortal":{"type":["boolean","null"]},"saveVersion":{"description":"Schreibend: neue Version statt Draft-Auto-Save anlegen.","type":["boolean","null"]},"editSummary":{"maxLength":255,"description":"Schreibend: Versionskommentar; bei /restore die wiederherzustellende Versionsnummer.","type":["string","null"]},"versionNo":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"KnowledgeArticle.jsonld-know_article.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":255,"type":["string","null"]},"slug":{"maxLength":255,"type":["string","null"]},"spaceUlid":{"maxLength":26,"description":"Bereich (ULID) — beim Anlegen erforderlich.","type":["string","null"]},"spaceName":{"type":["string","null"]},"parentUlid":{"maxLength":26,"type":["string","null"]},"status":{"enum":["draft","review","published","archived"],"type":["string","null"]},"excerpt":{"maxLength":500,"type":["string","null"]},"bodyHtml":{"description":"Roh-HTML als Eingabe (wird sanitisiert); Ausgabe = sanitisierter Stand.","type":["string","null"]},"bodyText":{"type":["string","null"]},"currentVersionNo":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"reviewIntervalDays":{"minimum":0,"type":["integer","null"]},"lastReviewedAt":{"type":["string","null"]},"needsReview":{"type":["boolean","null"]},"publishedToPortal":{"type":["boolean","null"]},"isFavorite":{"type":["boolean","null"]},"versions":{"description":"Versionsverlauf (nur /versions).","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"diff":{"description":"Text-Diff zwischen zwei Versionen (nur /versions?from=&to=).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Wissensartikel (04-10 §4.2).\n\n- CRUD + /publish, /versions (Verlauf+Diff), /restore (= neue Version).\n- Body wird beim Speichern serverseitig sanitisiert; saveVersion steuert Draft-Auto-Save vs. neue Version.\n- Sicht/Bearbeitung: {@see \\Octi\\Plugin\\Knowledge\\Security\\ArticleVoter} (Space-Zugriff) + globale Permission."},"KnowledgeArticleAttachment-know_attachment.read":{"type":"object","description":"Datei-Anhang eines Wissensartikels (04-10). Referenziert bestehende DMS-Datei, kein Upload hier.\n\n- Sicht/Anhängen/Entfernen aus Bereichszugriff des Artikels (read/contribute), wie beim Artikel.\n- security prüft nur Katalog-Permission; IDOR + Datei-Recht setzen {@see ArticleAttachmentProvider}/\n  {@see ArticleAttachmentProcessor} durch (bewusst kein isGranted() auf markenbezogenem Objekt — affirmative-Trap).\n- downloadUrl = abgesicherte Datei-Download-Route; storagePath NIE exponiert.","properties":{"ulid":{"type":["string","null"]},"articleUlid":{"maxLength":26,"description":"Ziel-Artikel (ULID) — beim Anhängen erforderlich; bei der Liste der Pflichtfilter.","type":["string","null"]},"fileUlid":{"maxLength":26,"description":"Anzuhängende bestehende DMS-Datei (ULID) — beim Anhängen erforderlich.","type":["string","null"]},"caption":{"maxLength":255,"type":["string","null"]},"originalName":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"downloadUrl":{"description":"Abgesicherte Download-Route der Datei (kein storagePath).","type":["string","null"]},"createdAt":{"type":["string","null"]}}},"KnowledgeArticleAttachment-know_attachment.write":{"type":"object","description":"Datei-Anhang eines Wissensartikels (04-10). Referenziert bestehende DMS-Datei, kein Upload hier.\n\n- Sicht/Anhängen/Entfernen aus Bereichszugriff des Artikels (read/contribute), wie beim Artikel.\n- security prüft nur Katalog-Permission; IDOR + Datei-Recht setzen {@see ArticleAttachmentProvider}/\n  {@see ArticleAttachmentProcessor} durch (bewusst kein isGranted() auf markenbezogenem Objekt — affirmative-Trap).\n- downloadUrl = abgesicherte Datei-Download-Route; storagePath NIE exponiert.","properties":{"articleUlid":{"maxLength":26,"description":"Ziel-Artikel (ULID) — beim Anhängen erforderlich; bei der Liste der Pflichtfilter.","type":["string","null"]},"fileUlid":{"maxLength":26,"description":"Anzuhängende bestehende DMS-Datei (ULID) — beim Anhängen erforderlich.","type":["string","null"]},"caption":{"maxLength":255,"type":["string","null"]}}},"KnowledgeArticleAttachment.jsonld-know_attachment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"articleUlid":{"maxLength":26,"description":"Ziel-Artikel (ULID) — beim Anhängen erforderlich; bei der Liste der Pflichtfilter.","type":["string","null"]},"fileUlid":{"maxLength":26,"description":"Anzuhängende bestehende DMS-Datei (ULID) — beim Anhängen erforderlich.","type":["string","null"]},"caption":{"maxLength":255,"type":["string","null"]},"originalName":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"downloadUrl":{"description":"Abgesicherte Download-Route der Datei (kein storagePath).","type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Datei-Anhang eines Wissensartikels (04-10). Referenziert bestehende DMS-Datei, kein Upload hier.\n\n- Sicht/Anhängen/Entfernen aus Bereichszugriff des Artikels (read/contribute), wie beim Artikel.\n- security prüft nur Katalog-Permission; IDOR + Datei-Recht setzen {@see ArticleAttachmentProvider}/\n  {@see ArticleAttachmentProcessor} durch (bewusst kein isGranted() auf markenbezogenem Objekt — affirmative-Trap).\n- downloadUrl = abgesicherte Datei-Download-Route; storagePath NIE exponiert."},"KnowledgeAsk-know_ask.read":{"type":"object","description":"„Frag das Wiki\" (04-10 §13 S10-2, K7). POST { \"question\": \"…\" }.\n\n- Beantwortet per RAG NUR aus zugriffsgefiltertem Wissensbestand, nennt Quellen.\n- Ohne aktive KI: Fallback auf Trefferliste.","properties":{"id":{"type":["string","null"]},"question":{"maxLength":2000,"type":["string","null"]},"answer":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]},"sources":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"KnowledgeAsk-know_ask.write":{"type":"object","description":"„Frag das Wiki\" (04-10 §13 S10-2, K7). POST { \"question\": \"…\" }.\n\n- Beantwortet per RAG NUR aus zugriffsgefiltertem Wissensbestand, nennt Quellen.\n- Ohne aktive KI: Fallback auf Trefferliste.","properties":{"question":{"maxLength":2000,"type":["string","null"]}}},"KnowledgeAsk.jsonld-know_ask.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"question":{"maxLength":2000,"type":["string","null"]},"answer":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]},"sources":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}}],"description":"„Frag das Wiki\" (04-10 §13 S10-2, K7). POST { \"question\": \"…\" }.\n\n- Beantwortet per RAG NUR aus zugriffsgefiltertem Wissensbestand, nennt Quellen.\n- Ohne aktive KI: Fallback auf Trefferliste."},"KnowledgeFavorite-know_favorite.read":{"type":"object","description":"Persönliches Lesezeichen auf ein Wissensobjekt (04-10 §4.2).\nListe/Anlegen/Entfernen nur für eigenen Nutzer.","properties":{"ulid":{"type":["string","null"]},"targetType":{"maxLength":16,"type":["string","null"]},"targetId":{"maxLength":26,"type":["string","null"]},"targetTitle":{"description":"Aufgelöster Titel des gemerkten Objekts (Artikel/SOP/Vorlage/Lösungsbaustein); null, wenn das\nZiel nicht mehr existiert. Ohne dieses Feld hatte die Ressource überhaupt keinen anzeigbaren\nText — jede Konsumenten-Liste (Dashboard-Widget) blieb leer (Audit R25).","type":["string","null"]},"createdAt":{"type":["string","null"]}}},"KnowledgeFavorite-know_favorite.write":{"type":"object","description":"Persönliches Lesezeichen auf ein Wissensobjekt (04-10 §4.2).\nListe/Anlegen/Entfernen nur für eigenen Nutzer.","properties":{"targetType":{"maxLength":16,"type":["string","null"]},"targetId":{"maxLength":26,"type":["string","null"]}}},"KnowledgeFavorite.jsonld-know_favorite.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"targetType":{"maxLength":16,"type":["string","null"]},"targetId":{"maxLength":26,"type":["string","null"]},"targetTitle":{"description":"Aufgelöster Titel des gemerkten Objekts (Artikel/SOP/Vorlage/Lösungsbaustein); null, wenn das\nZiel nicht mehr existiert. Ohne dieses Feld hatte die Ressource überhaupt keinen anzeigbaren\nText — jede Konsumenten-Liste (Dashboard-Widget) blieb leer (Audit R25).","type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Persönliches Lesezeichen auf ein Wissensobjekt (04-10 §4.2).\nListe/Anlegen/Entfernen nur für eigenen Nutzer."},"KnowledgeImport-knowledge_import.read":{"type":"object","description":"Bestands-Import in die Wissensdatenbank (Obsidian-Vault, Markdown-Ordner, alte Wiki-Exporte).\n\nAblauf bewusst zweistufig: das Archiv wird zuerst ganz normal in die Datei-Ablage hochgeladen\n(`POST /v1/platform/files`), hier wird nur noch dessen Kennung genannt. Damit gelten fuer die\nhochgeladene Datei dieselben Groessen-, Typ- und Virenpruefungen wie fuer jede andere Datei, und\ndieser Endpunkt bleibt eine gewoehnliche JSON-Operation — also auch ueber MCP bedienbar (P-1/P-2).\n\nDer Lauf selbst ist asynchron: bei einigen tausend Notizen dauert er Minuten.","properties":{"ulid":{"type":["string","null"]},"spaceUlid":{"description":"Ziel-Wissensbereich.","type":["string","null"]},"spaceName":{"type":["string","null"]},"fileUlid":{"description":"Kennung der hochgeladenen ZIP-Datei aus der Datei-Ablage.","type":["string","null"]},"sourceLabel":{"default":"","type":"string"},"status":{"description":"queued · running · done · failed.","default":"queued","type":"string"},"articleStatus":{"enum":["published","draft"],"description":"Status der erzeugten Artikel: `published` (Vorgabe) oder `draft`.","default":"published","type":"string"},"dryRun":{"description":"Probelauf: zaehlt, schreibt nichts.","default":false,"type":"boolean"},"createdCount":{"default":0,"type":"integer"},"updatedCount":{"default":0,"type":"integer"},"attachmentCount":{"default":0,"type":"integer"},"skippedCount":{"default":0,"type":"integer"},"failedCount":{"default":0,"type":"integer"},"report":{"description":"Dateiarten, erste Fehler mit Grund.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}},"required":["spaceUlid","fileUlid"]},"KnowledgeImport-knowledge_import.write":{"type":"object","description":"Bestands-Import in die Wissensdatenbank (Obsidian-Vault, Markdown-Ordner, alte Wiki-Exporte).\n\nAblauf bewusst zweistufig: das Archiv wird zuerst ganz normal in die Datei-Ablage hochgeladen\n(`POST /v1/platform/files`), hier wird nur noch dessen Kennung genannt. Damit gelten fuer die\nhochgeladene Datei dieselben Groessen-, Typ- und Virenpruefungen wie fuer jede andere Datei, und\ndieser Endpunkt bleibt eine gewoehnliche JSON-Operation — also auch ueber MCP bedienbar (P-1/P-2).\n\nDer Lauf selbst ist asynchron: bei einigen tausend Notizen dauert er Minuten.","required":["spaceUlid","fileUlid"],"properties":{"spaceUlid":{"description":"Ziel-Wissensbereich.","type":["string","null"]},"fileUlid":{"description":"Kennung der hochgeladenen ZIP-Datei aus der Datei-Ablage.","type":["string","null"]},"articleStatus":{"enum":["published","draft"],"description":"Status der erzeugten Artikel: `published` (Vorgabe) oder `draft`.","default":"published","type":"string"},"dryRun":{"description":"Probelauf: zaehlt, schreibt nichts.","default":false,"type":"boolean"}}},"KnowledgeImport.jsonld-knowledge_import.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"spaceUlid":{"description":"Ziel-Wissensbereich.","type":["string","null"]},"spaceName":{"type":["string","null"]},"fileUlid":{"description":"Kennung der hochgeladenen ZIP-Datei aus der Datei-Ablage.","type":["string","null"]},"sourceLabel":{"default":"","type":"string"},"status":{"description":"queued · running · done · failed.","default":"queued","type":"string"},"articleStatus":{"enum":["published","draft"],"description":"Status der erzeugten Artikel: `published` (Vorgabe) oder `draft`.","default":"published","type":"string"},"dryRun":{"description":"Probelauf: zaehlt, schreibt nichts.","default":false,"type":"boolean"},"createdCount":{"default":0,"type":"integer"},"updatedCount":{"default":0,"type":"integer"},"attachmentCount":{"default":0,"type":"integer"},"skippedCount":{"default":0,"type":"integer"},"failedCount":{"default":0,"type":"integer"},"report":{"description":"Dateiarten, erste Fehler mit Grund.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"],"format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"}},"required":["spaceUlid","fileUlid"]}],"description":"Bestands-Import in die Wissensdatenbank (Obsidian-Vault, Markdown-Ordner, alte Wiki-Exporte).\n\nAblauf bewusst zweistufig: das Archiv wird zuerst ganz normal in die Datei-Ablage hochgeladen\n(`POST /v1/platform/files`), hier wird nur noch dessen Kennung genannt. Damit gelten fuer die\nhochgeladene Datei dieselben Groessen-, Typ- und Virenpruefungen wie fuer jede andere Datei, und\ndieser Endpunkt bleibt eine gewoehnliche JSON-Operation — also auch ueber MCP bedienbar (P-1/P-2).\n\nDer Lauf selbst ist asynchron: bei einigen tausend Notizen dauert er Minuten."},"KnowledgeLink-know_link.read":{"type":"object","description":"Verknüpfung von Wissen an beliebige Vorgänge (04-10 §4.6, §6).\n\n- targetType+targetId: an Vorgang gehängte Wissensobjekte (zugriffsgefiltert).\n- sourceType+sourceId: Gegenrichtung (ausgehende Links der Quelle).\n- Anlegen/Löschen erfordert Link-Recht.","properties":{"ulid":{"type":["string","null"]},"sourceType":{"enum":["article","sop","template","solution"],"type":["string","null"]},"sourceId":{"maxLength":26,"type":["string","null"]},"targetType":{"maxLength":40,"type":["string","null"]},"targetId":{"maxLength":64,"type":["string","null"]},"linkType":{"enum":["context","reference","applied"],"type":["string","null"]},"title":{"description":"Aufgelöster Titel des Wissensobjekts (Leserichtung target → Wissen).","type":["string","null"]},"spaceUlid":{"type":["string","null"]}}},"KnowledgeLink-know_link.write":{"type":"object","description":"Verknüpfung von Wissen an beliebige Vorgänge (04-10 §4.6, §6).\n\n- targetType+targetId: an Vorgang gehängte Wissensobjekte (zugriffsgefiltert).\n- sourceType+sourceId: Gegenrichtung (ausgehende Links der Quelle).\n- Anlegen/Löschen erfordert Link-Recht.","properties":{"sourceType":{"enum":["article","sop","template","solution"],"type":["string","null"]},"sourceId":{"maxLength":26,"type":["string","null"]},"targetType":{"maxLength":40,"type":["string","null"]},"targetId":{"maxLength":64,"type":["string","null"]},"linkType":{"enum":["context","reference","applied"],"type":["string","null"]}}},"KnowledgeLink.jsonld-know_link.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"sourceType":{"enum":["article","sop","template","solution"],"type":["string","null"]},"sourceId":{"maxLength":26,"type":["string","null"]},"targetType":{"maxLength":40,"type":["string","null"]},"targetId":{"maxLength":64,"type":["string","null"]},"linkType":{"enum":["context","reference","applied"],"type":["string","null"]},"title":{"description":"Aufgelöster Titel des Wissensobjekts (Leserichtung target → Wissen).","type":["string","null"]},"spaceUlid":{"type":["string","null"]}}}],"description":"Verknüpfung von Wissen an beliebige Vorgänge (04-10 §4.6, §6).\n\n- targetType+targetId: an Vorgang gehängte Wissensobjekte (zugriffsgefiltert).\n- sourceType+sourceId: Gegenrichtung (ausgehende Links der Quelle).\n- Anlegen/Löschen erfordert Link-Recht."},"KnowledgeSearch-know_search.read":{"type":"object","description":"Volltextsuche über den Wissensbestand (04-10 §4.6, AK #8).\n\n- q Pflicht; optional type (article/sop/template/solution), space.\n- Nur Treffer aus Bereichen mit Lesezugriff.","properties":{"id":{"type":["string","null"]},"type":{"type":["string","null"]},"ulid":{"type":["string","null"]},"title":{"type":["string","null"]},"snippet":{"type":["string","null"]},"spaceUlid":{"type":["string","null"]},"spaceName":{"type":["string","null"]}}},"KnowledgeSearch.jsonld-know_search.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"type":{"type":["string","null"]},"ulid":{"type":["string","null"]},"title":{"type":["string","null"]},"snippet":{"type":["string","null"]},"spaceUlid":{"type":["string","null"]},"spaceName":{"type":["string","null"]}}}],"description":"Volltextsuche über den Wissensbestand (04-10 §4.6, AK #8).\n\n- q Pflicht; optional type (article/sop/template/solution), space.\n- Nur Treffer aus Bereichen mit Lesezugriff."},"KnowledgeSolutionBlock-know_solution.read":{"type":"object","description":"Lösungsbaustein für den Support (04-10 §4.5).\n\n- CRUD + /use: liefert fertige Lösung als Canned Response für Ticket.\n- Zählt usageCount (Telemetrie für Wissenslücken).","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"spaceName":{"type":["string","null"]},"problemSummary":{"type":["string","null"]},"solutionHtml":{"type":["string","null"]},"canonicalArticleId":{"maxLength":26,"type":["string","null"]},"usageCount":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"rendered":{"description":"Fertige Lösung als Canned Response (nur /use).","type":["string","null"]},"createdAt":{"type":["string","null"]}}},"KnowledgeSolutionBlock-know_solution.write":{"type":"object","description":"Lösungsbaustein für den Support (04-10 §4.5).\n\n- CRUD + /use: liefert fertige Lösung als Canned Response für Ticket.\n- Zählt usageCount (Telemetrie für Wissenslücken).","properties":{"title":{"maxLength":200,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"problemSummary":{"type":["string","null"]},"solutionHtml":{"type":["string","null"]},"canonicalArticleId":{"maxLength":26,"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}}}},"KnowledgeSolutionBlock-know_solution.write.jsonMergePatch":{"type":"object","description":"Lösungsbaustein für den Support (04-10 §4.5).\n\n- CRUD + /use: liefert fertige Lösung als Canned Response für Ticket.\n- Zählt usageCount (Telemetrie für Wissenslücken).","properties":{"title":{"maxLength":200,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"problemSummary":{"type":["string","null"]},"solutionHtml":{"type":["string","null"]},"canonicalArticleId":{"maxLength":26,"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}}}},"KnowledgeSolutionBlock.jsonld-know_solution.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"spaceName":{"type":["string","null"]},"problemSummary":{"type":["string","null"]},"solutionHtml":{"type":["string","null"]},"canonicalArticleId":{"maxLength":26,"type":["string","null"]},"usageCount":{"type":["integer","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"rendered":{"description":"Fertige Lösung als Canned Response (nur /use).","type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Lösungsbaustein für den Support (04-10 §4.5).\n\n- CRUD + /use: liefert fertige Lösung als Canned Response für Ticket.\n- Zählt usageCount (Telemetrie für Wissenslücken)."},"KnowledgeSop-know_sop.read":{"type":"object","description":"Standard Operating Procedure (04-10 §4.3).\n\n- CRUD inkl. nummerierter Schritte + /apply: erzeugt Tasks/Checklisteneinträge im Ziel (Snapshot).\n- Sicht/Pflege space-zugriffsgefiltert; „Anwenden\" zusätzlich Apply-Recht.\n- /confirm-read: (Pflicht-)Lektüre-Bestätigung (S10-1, idempotent).\n- Offene Pflichtlektüre: ?mandatory=true&unconfirmed=true.","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":255,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"spaceName":{"type":["string","null"]},"purpose":{"type":["string","null"]},"scope":{"enum":["project","onboarding","support","internal"],"type":["string","null"]},"status":{"enum":["draft","published","archived"],"type":["string","null"]},"defaultTaskTemplateRef":{"type":["string","null"]},"ownerId":{"type":["integer","null"]},"isMandatory":{"type":["boolean","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"reviewIntervalDays":{"minimum":0,"type":["integer","null"]},"lastReviewedAt":{"type":["string","null"]},"needsReview":{"type":["boolean","null"]},"readConfirmedAt":{"description":"Lese-Bestätigung des aktuellen Nutzers (S10-1), ISO-Datum; NULL = noch nicht bestätigt.","type":["string","null"]},"steps":{"description":"Schritte: Liste von {sortOrder, title, instructionHtml, role, estimateMinutes, isCheckpoint, linkedArticleId}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"applied":{"description":"Ergebnis von /apply.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]}}},"KnowledgeSop-know_sop.write":{"type":"object","description":"Standard Operating Procedure (04-10 §4.3).\n\n- CRUD inkl. nummerierter Schritte + /apply: erzeugt Tasks/Checklisteneinträge im Ziel (Snapshot).\n- Sicht/Pflege space-zugriffsgefiltert; „Anwenden\" zusätzlich Apply-Recht.\n- /confirm-read: (Pflicht-)Lektüre-Bestätigung (S10-1, idempotent).\n- Offene Pflichtlektüre: ?mandatory=true&unconfirmed=true.","properties":{"title":{"maxLength":255,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"purpose":{"type":["string","null"]},"scope":{"enum":["project","onboarding","support","internal"],"type":["string","null"]},"status":{"enum":["draft","published","archived"],"type":["string","null"]},"isMandatory":{"type":["boolean","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"reviewIntervalDays":{"minimum":0,"type":["integer","null"]},"steps":{"description":"Schritte: Liste von {sortOrder, title, instructionHtml, role, estimateMinutes, isCheckpoint, linkedArticleId}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"targetType":{"description":"Schreibend (nur /apply): Ziel-Vorgang.","type":["string","null"]},"targetId":{"type":["string","null"]}}},"KnowledgeSop-know_sop.write.jsonMergePatch":{"type":"object","description":"Standard Operating Procedure (04-10 §4.3).\n\n- CRUD inkl. nummerierter Schritte + /apply: erzeugt Tasks/Checklisteneinträge im Ziel (Snapshot).\n- Sicht/Pflege space-zugriffsgefiltert; „Anwenden\" zusätzlich Apply-Recht.\n- /confirm-read: (Pflicht-)Lektüre-Bestätigung (S10-1, idempotent).\n- Offene Pflichtlektüre: ?mandatory=true&unconfirmed=true.","properties":{"title":{"maxLength":255,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"purpose":{"type":["string","null"]},"scope":{"enum":["project","onboarding","support","internal"],"type":["string","null"]},"status":{"enum":["draft","published","archived"],"type":["string","null"]},"isMandatory":{"type":["boolean","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"reviewIntervalDays":{"minimum":0,"type":["integer","null"]},"steps":{"description":"Schritte: Liste von {sortOrder, title, instructionHtml, role, estimateMinutes, isCheckpoint, linkedArticleId}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"targetType":{"description":"Schreibend (nur /apply): Ziel-Vorgang.","type":["string","null"]},"targetId":{"type":["string","null"]}}},"KnowledgeSop.jsonld-know_sop.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"title":{"maxLength":255,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"spaceName":{"type":["string","null"]},"purpose":{"type":["string","null"]},"scope":{"enum":["project","onboarding","support","internal"],"type":["string","null"]},"status":{"enum":["draft","published","archived"],"type":["string","null"]},"defaultTaskTemplateRef":{"type":["string","null"]},"ownerId":{"type":["integer","null"]},"isMandatory":{"type":["boolean","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"reviewIntervalDays":{"minimum":0,"type":["integer","null"]},"lastReviewedAt":{"type":["string","null"]},"needsReview":{"type":["boolean","null"]},"readConfirmedAt":{"description":"Lese-Bestätigung des aktuellen Nutzers (S10-1), ISO-Datum; NULL = noch nicht bestätigt.","type":["string","null"]},"steps":{"description":"Schritte: Liste von {sortOrder, title, instructionHtml, role, estimateMinutes, isCheckpoint, linkedArticleId}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"applied":{"description":"Ergebnis von /apply.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]}}}],"description":"Standard Operating Procedure (04-10 §4.3).\n\n- CRUD inkl. nummerierter Schritte + /apply: erzeugt Tasks/Checklisteneinträge im Ziel (Snapshot).\n- Sicht/Pflege space-zugriffsgefiltert; „Anwenden\" zusätzlich Apply-Recht.\n- /confirm-read: (Pflicht-)Lektüre-Bestätigung (S10-1, idempotent).\n- Offene Pflichtlektüre: ?mandatory=true&unconfirmed=true."},"KnowledgeSpace-know_space.read":{"type":"object","description":"Wissensbereich (04-10 §4.1).\n\n- CRUD inkl. Zugriffsrechte-Pflege (access: Rolle/Person × Stufe).\n- Liste/Detail zugriffsgefiltert über {@see \\Octi\\Plugin\\Knowledge\\Security\\KnowledgeSpaceVoter}.\n- myLevel: effektive Stufe des aktuellen Nutzers (für UI).","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"slug":{"maxLength":120,"type":["string","null"]},"description":{"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"type":{"enum":["wiki","handbook","sops","templates"],"type":["string","null"]},"visibility":{"enum":["org","restricted"],"type":["string","null"]},"isCurated":{"type":["boolean","null"]},"brandScope":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"archived":{"type":["boolean","null"]},"access":{"description":"Zugriffsvergaben: Liste von {principalType, principalId, level}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"myLevel":{"description":"Effektive Stufe des aktuellen Nutzers (read/contribute/manage).","type":["string","null"]},"createdAt":{"type":["string","null"]}}},"KnowledgeSpace-know_space.write":{"type":"object","description":"Wissensbereich (04-10 §4.1).\n\n- CRUD inkl. Zugriffsrechte-Pflege (access: Rolle/Person × Stufe).\n- Liste/Detail zugriffsgefiltert über {@see \\Octi\\Plugin\\Knowledge\\Security\\KnowledgeSpaceVoter}.\n- myLevel: effektive Stufe des aktuellen Nutzers (für UI).","properties":{"name":{"maxLength":200,"type":["string","null"]},"slug":{"maxLength":120,"type":["string","null"]},"description":{"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"type":{"enum":["wiki","handbook","sops","templates"],"type":["string","null"]},"visibility":{"enum":["org","restricted"],"type":["string","null"]},"isCurated":{"type":["boolean","null"]},"brandScope":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"archived":{"type":["boolean","null"]},"access":{"description":"Zugriffsvergaben: Liste von {principalType, principalId, level}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}},"KnowledgeSpace-know_space.write.jsonMergePatch":{"type":"object","description":"Wissensbereich (04-10 §4.1).\n\n- CRUD inkl. Zugriffsrechte-Pflege (access: Rolle/Person × Stufe).\n- Liste/Detail zugriffsgefiltert über {@see \\Octi\\Plugin\\Knowledge\\Security\\KnowledgeSpaceVoter}.\n- myLevel: effektive Stufe des aktuellen Nutzers (für UI).","properties":{"name":{"maxLength":200,"type":["string","null"]},"slug":{"maxLength":120,"type":["string","null"]},"description":{"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"type":{"enum":["wiki","handbook","sops","templates"],"type":["string","null"]},"visibility":{"enum":["org","restricted"],"type":["string","null"]},"isCurated":{"type":["boolean","null"]},"brandScope":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"archived":{"type":["boolean","null"]},"access":{"description":"Zugriffsvergaben: Liste von {principalType, principalId, level}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}},"KnowledgeSpace.jsonld-know_space.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"slug":{"maxLength":120,"type":["string","null"]},"description":{"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"type":{"enum":["wiki","handbook","sops","templates"],"type":["string","null"]},"visibility":{"enum":["org","restricted"],"type":["string","null"]},"isCurated":{"type":["boolean","null"]},"brandScope":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"archived":{"type":["boolean","null"]},"access":{"description":"Zugriffsvergaben: Liste von {principalType, principalId, level}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"myLevel":{"description":"Effektive Stufe des aktuellen Nutzers (read/contribute/manage).","type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Wissensbereich (04-10 §4.1).\n\n- CRUD inkl. Zugriffsrechte-Pflege (access: Rolle/Person × Stufe).\n- Liste/Detail zugriffsgefiltert über {@see \\Octi\\Plugin\\Knowledge\\Security\\KnowledgeSpaceVoter}.\n- myLevel: effektive Stufe des aktuellen Nutzers (für UI)."},"KnowledgeTemplate-know_template.read":{"type":"object","description":"Template-Bibliothek (04-10 §4.4): Dokument-/Text-, E-Mail-, Angebotsbausteine mit Platzhaltern.\n\n- CRUD + /render: füllt {{platzhalter}} aus Zielkontext, unbekannte bleiben markiert.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"spaceName":{"type":["string","null"]},"kind":{"enum":["document","email","quote_block","snippet"],"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"variables":{"description":"Erkannte Platzhalter.","type":["array","null"],"items":{"type":"string"}},"category":{"maxLength":100,"type":["string","null"]},"defaultBrandScope":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"productRef":{"maxLength":26,"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"rendered":{"description":"Ergebnis von /render.","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]}},"createdAt":{"type":["string","null"]}}},"KnowledgeTemplate-know_template.write":{"type":"object","description":"Template-Bibliothek (04-10 §4.4): Dokument-/Text-, E-Mail-, Angebotsbausteine mit Platzhaltern.\n\n- CRUD + /render: füllt {{platzhalter}} aus Zielkontext, unbekannte bleiben markiert.","properties":{"name":{"maxLength":200,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"kind":{"enum":["document","email","quote_block","snippet"],"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"category":{"maxLength":100,"type":["string","null"]},"defaultBrandScope":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"productRef":{"maxLength":26,"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"context":{"description":"Schreibend (nur /render): Kontext placeholder => Wert.","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}}},"KnowledgeTemplate-know_template.write.jsonMergePatch":{"type":"object","description":"Template-Bibliothek (04-10 §4.4): Dokument-/Text-, E-Mail-, Angebotsbausteine mit Platzhaltern.\n\n- CRUD + /render: füllt {{platzhalter}} aus Zielkontext, unbekannte bleiben markiert.","properties":{"name":{"maxLength":200,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"kind":{"enum":["document","email","quote_block","snippet"],"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"category":{"maxLength":100,"type":["string","null"]},"defaultBrandScope":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"productRef":{"maxLength":26,"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"context":{"description":"Schreibend (nur /render): Kontext placeholder => Wert.","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}}},"KnowledgeTemplate.jsonld-know_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]},"spaceName":{"type":["string","null"]},"kind":{"enum":["document","email","quote_block","snippet"],"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"variables":{"description":"Erkannte Platzhalter.","type":["array","null"],"items":{"type":"string"}},"category":{"maxLength":100,"type":["string","null"]},"defaultBrandScope":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"productRef":{"maxLength":26,"type":["string","null"]},"tags":{"type":["array","null"],"items":{"type":"string"}},"rendered":{"description":"Ergebnis von /render.","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]}},"createdAt":{"type":["string","null"]}}}],"description":"Template-Bibliothek (04-10 §4.4): Dokument-/Text-, E-Mail-, Angebotsbausteine mit Platzhaltern.\n\n- CRUD + /render: füllt {{platzhalter}} aus Zielkontext, unbekannte bleiben markiert."},"KnowledgeTicketDraft-know_ticket_draft.read":{"type":"object","description":"Artikelvorschlag aus gelöstem Ticket (04-10 §13 S10-2, K7). POST { \"ticketUlid\": \"…\", \"spaceUlid\": \"…\" }.\n\n- Erzeugt per KI (Fallback: Roh-Verlauf) Artikel im Status draft im gewählten Bereich.\n- Verknüpft Artikel per EntityLink mit Quell-Ticket.","properties":{"id":{"type":["string","null"]},"ticketUlid":{"maxLength":26,"type":["string","null"]},"articleUlid":{"type":["string","null"]},"title":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]}}},"KnowledgeTicketDraft-know_ticket_draft.write":{"type":"object","description":"Artikelvorschlag aus gelöstem Ticket (04-10 §13 S10-2, K7). POST { \"ticketUlid\": \"…\", \"spaceUlid\": \"…\" }.\n\n- Erzeugt per KI (Fallback: Roh-Verlauf) Artikel im Status draft im gewählten Bereich.\n- Verknüpft Artikel per EntityLink mit Quell-Ticket.","properties":{"ticketUlid":{"maxLength":26,"type":["string","null"]},"spaceUlid":{"maxLength":26,"type":["string","null"]}}},"KnowledgeTicketDraft.jsonld-know_ticket_draft.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"ticketUlid":{"maxLength":26,"type":["string","null"]},"articleUlid":{"type":["string","null"]},"title":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]}}}],"description":"Artikelvorschlag aus gelöstem Ticket (04-10 §13 S10-2, K7). POST { \"ticketUlid\": \"…\", \"spaceUlid\": \"…\" }.\n\n- Erzeugt per KI (Fallback: Roh-Verlauf) Artikel im Status draft im gewählten Bereich.\n- Verknüpft Artikel per EntityLink mit Quell-Ticket."},"LabelRender-label_render.read":{"type":"object","description":"Ein gerendertes Etikett (Doc 25 AP 4.6) — das Ergebnis, nicht die Vorlage.\n\n**Eigene Ressource, weil es ein anderes Ding ist:** eine Vorlage ist ein Datensatz mit Detail-\nRoute; ein gerendertes Etikett ist eine Antwort. Beides in eine Ressource zu legen hieße, ein\nErgebnis ohne Identität durch die Identifier-Maschinerie zu schicken.\n\n`render` und `print` sind bewusst getrennte Endpunkte: zwischen „ansehen\" und „hundert Etiketten\n * drucken\" soll mehr liegen als ein vergessenes Feld in einem gemeinsamen Aufruf.","properties":{"templateKey":{"description":"Identität der Antwort ist die angewandte Vorlage — ein Etikett ist kein Datensatz.","type":["string","null"]},"subjectType":{"type":["string","null"]},"format":{"type":["string","null"]},"payload":{"description":"Fertige ZPL-Nutzlast — genau das, was das Gerät bekommt.","type":["string","null"]},"jobUlid":{"description":"ULID des eingestellten Druckauftrags; null = kein passendes Gerät (Download-Rückfall).","type":["string","null"]}}},"LabelRender-label_render.write":{"type":"object","description":"Ein gerendertes Etikett (Doc 25 AP 4.6) — das Ergebnis, nicht die Vorlage.\n\n**Eigene Ressource, weil es ein anderes Ding ist:** eine Vorlage ist ein Datensatz mit Detail-\nRoute; ein gerendertes Etikett ist eine Antwort. Beides in eine Ressource zu legen hieße, ein\nErgebnis ohne Identität durch die Identifier-Maschinerie zu schicken.\n\n`render` und `print` sind bewusst getrennte Endpunkte: zwischen „ansehen\" und „hundert Etiketten\n * drucken\" soll mehr liegen als ein vergessenes Feld in einem gemeinsamen Aufruf.","properties":{"templateKey":{"description":"Identität der Antwort ist die angewandte Vorlage — ein Etikett ist kein Datensatz.","type":["string","null"]},"subjectType":{"type":["string","null"]},"subjectUlid":{"type":["string","null"]},"workplaceKey":{"type":["string","null"]},"copies":{"type":["integer","null"]}}},"LabelRender.jsonld-label_render.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"templateKey":{"description":"Identität der Antwort ist die angewandte Vorlage — ein Etikett ist kein Datensatz.","type":["string","null"]},"subjectType":{"type":["string","null"]},"format":{"type":["string","null"]},"payload":{"description":"Fertige ZPL-Nutzlast — genau das, was das Gerät bekommt.","type":["string","null"]},"jobUlid":{"description":"ULID des eingestellten Druckauftrags; null = kein passendes Gerät (Download-Rückfall).","type":["string","null"]}}}],"description":"Ein gerendertes Etikett (Doc 25 AP 4.6) — das Ergebnis, nicht die Vorlage.\n\n**Eigene Ressource, weil es ein anderes Ding ist:** eine Vorlage ist ein Datensatz mit Detail-\nRoute; ein gerendertes Etikett ist eine Antwort. Beides in eine Ressource zu legen hieße, ein\nErgebnis ohne Identität durch die Identifier-Maschinerie zu schicken.\n\n`render` und `print` sind bewusst getrennte Endpunkte: zwischen „ansehen\" und „hundert Etiketten\n * drucken\" soll mehr liegen als ein vergessenes Feld in einem gemeinsamen Aufruf."},"LabelSubject-label_subject.read":{"type":"object","description":"Welche Dinge ein Etikett bekommen können — und mit welchen Variablen (Doc 25 AP 4.6).\n\nDie Liste kommt aus den registrierten Anbietern\n({@see \\App\\Platform\\Commerce\\Contract\\LabelSubjectProviderInterface}), nicht aus einer Konstante:\nein abgeschaltetes Chargen-Modul bietet keine Chargen-Etiketten mehr an, und ein neues Plugin\nbringt seinen Typ mit, ohne dass jemand hier eine Zeile ergänzt.\n\n**Die Beispielwerte sind der eigentliche Nutzen.** Ohne sie müsste ein Mensch eine ZPL-Vorlage\nblind schreiben und drucken, um zu sehen, was `{{ ean }}` eigentlich liefert.","properties":{"subjectType":{"type":["string","null"]},"label":{"type":["string","null"]},"providerKey":{"description":"Wer den Typ besitzt (Plugin-Schlüssel) — für Provenance und Fehlersuche.","type":["string","null"]},"variables":{"description":"Erlaubte Variablen: {key, label, example}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"builtInTemplate":{"description":"Die MITGELIEFERTE Vorlage dieses Typs: {key, name, widthMm, heightMm, body}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"LabelSubject.jsonld-label_subject.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"subjectType":{"type":["string","null"]},"label":{"type":["string","null"]},"providerKey":{"description":"Wer den Typ besitzt (Plugin-Schlüssel) — für Provenance und Fehlersuche.","type":["string","null"]},"variables":{"description":"Erlaubte Variablen: {key, label, example}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"builtInTemplate":{"description":"Die MITGELIEFERTE Vorlage dieses Typs: {key, name, widthMm, heightMm, body}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"Welche Dinge ein Etikett bekommen können — und mit welchen Variablen (Doc 25 AP 4.6).\n\nDie Liste kommt aus den registrierten Anbietern\n({@see \\App\\Platform\\Commerce\\Contract\\LabelSubjectProviderInterface}), nicht aus einer Konstante:\nein abgeschaltetes Chargen-Modul bietet keine Chargen-Etiketten mehr an, und ein neues Plugin\nbringt seinen Typ mit, ohne dass jemand hier eine Zeile ergänzt.\n\n**Die Beispielwerte sind der eigentliche Nutzen.** Ohne sie müsste ein Mensch eine ZPL-Vorlage\nblind schreiben und drucken, um zu sehen, was `{{ ean }}` eigentlich liefert."},"LabelTemplate-label_template.read":{"type":"object","description":"Etiketten-Vorlagen (Doc 25 AP 4.6).\n\n**Die Liste zeigt auch die MITGELIEFERTEN Vorlagen** — sie stehen als Code und haben keine\nDatenbank-Zeile. Sie zu verschweigen hieße: die Verwaltung sagt „keine Vorlagen\", während das\nSystem druckt. Wer eine anpassen will, legt eine gleichnamige an; die gewinnt.\n\nRendern und Drucken liegen bewusst in einer EIGENEN Ressource\n({@see LabelRenderResource}): ein gerendertes Etikett ist eine Antwort, kein Datensatz.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"templateKey":{"type":["string","null"]},"name":{"type":["string","null"]},"subjectType":{"description":"product|bin|batch — muss ein registrierter Subjekt-Typ sein.","type":["string","null"]},"body":{"description":"ZPL mit `{{ variable }}`-Platzhaltern.","type":["string","null"]},"widthMm":{"type":["integer","null"]},"heightMm":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"builtIn":{"description":"true = mitgeliefert (Code, keine DB-Zeile); anpassbar durch Anlegen einer gleichnamigen.","type":["boolean","null"]},"format":{"type":["string","null"]}}},"LabelTemplate-label_template.write":{"type":"object","description":"Etiketten-Vorlagen (Doc 25 AP 4.6).\n\n**Die Liste zeigt auch die MITGELIEFERTEN Vorlagen** — sie stehen als Code und haben keine\nDatenbank-Zeile. Sie zu verschweigen hieße: die Verwaltung sagt „keine Vorlagen\", während das\nSystem druckt. Wer eine anpassen will, legt eine gleichnamige an; die gewinnt.\n\nRendern und Drucken liegen bewusst in einer EIGENEN Ressource\n({@see LabelRenderResource}): ein gerendertes Etikett ist eine Antwort, kein Datensatz.","properties":{"templateKey":{"type":["string","null"]},"name":{"type":["string","null"]},"subjectType":{"description":"product|bin|batch — muss ein registrierter Subjekt-Typ sein.","type":["string","null"]},"body":{"description":"ZPL mit `{{ variable }}`-Platzhaltern.","type":["string","null"]},"widthMm":{"type":["integer","null"]},"heightMm":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"LabelTemplate-label_template.write.jsonMergePatch":{"type":"object","description":"Etiketten-Vorlagen (Doc 25 AP 4.6).\n\n**Die Liste zeigt auch die MITGELIEFERTEN Vorlagen** — sie stehen als Code und haben keine\nDatenbank-Zeile. Sie zu verschweigen hieße: die Verwaltung sagt „keine Vorlagen\", während das\nSystem druckt. Wer eine anpassen will, legt eine gleichnamige an; die gewinnt.\n\nRendern und Drucken liegen bewusst in einer EIGENEN Ressource\n({@see LabelRenderResource}): ein gerendertes Etikett ist eine Antwort, kein Datensatz.","properties":{"templateKey":{"type":["string","null"]},"name":{"type":["string","null"]},"subjectType":{"description":"product|bin|batch — muss ein registrierter Subjekt-Typ sein.","type":["string","null"]},"body":{"description":"ZPL mit `{{ variable }}`-Platzhaltern.","type":["string","null"]},"widthMm":{"type":["integer","null"]},"heightMm":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"LabelTemplate.jsonld-label_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"templateKey":{"type":["string","null"]},"name":{"type":["string","null"]},"subjectType":{"description":"product|bin|batch — muss ein registrierter Subjekt-Typ sein.","type":["string","null"]},"body":{"description":"ZPL mit `{{ variable }}`-Platzhaltern.","type":["string","null"]},"widthMm":{"type":["integer","null"]},"heightMm":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"builtIn":{"description":"true = mitgeliefert (Code, keine DB-Zeile); anpassbar durch Anlegen einer gleichnamigen.","type":["boolean","null"]},"format":{"type":["string","null"]}}}],"description":"Etiketten-Vorlagen (Doc 25 AP 4.6).\n\n**Die Liste zeigt auch die MITGELIEFERTEN Vorlagen** — sie stehen als Code und haben keine\nDatenbank-Zeile. Sie zu verschweigen hieße: die Verwaltung sagt „keine Vorlagen\", während das\nSystem druckt. Wer eine anpassen will, legt eine gleichnamige an; die gewinnt.\n\nRendern und Drucken liegen bewusst in einer EIGENEN Ressource\n({@see LabelRenderResource}): ein gerendertes Etikett ist eine Antwort, kein Datensatz."},"Lead-lead.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische PK zusätzlich zur ULID — für Relations-Felder/EntityPicker im Frontend;\nanalog {@see \\App\\Platform\\Customer\\ApiResource\\ContactResource::$id}.","type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"companyName":{"maxLength":255,"type":["string","null"]},"locale":{"description":"Bevorzugte Kommunikationssprache ('de','en'); steuert die Sprache ausgehender Mails/Newsletter.","type":["string","null"]},"customerId":{"description":"Verknüpfter Bestandskunde (optional) — bei Konversion bevorzugt wiederverwendet.","type":["integer","null"]},"customerName":{"description":"Aufgelöster Kundenname zur Anzeige (read-only, vgl. {@see DealResource}).","type":["string","null"]},"primaryContactId":{"description":"Primärer Ansprechpartner des verknüpften Kunden (optional).","type":["integer","null"]},"primaryContactName":{"description":"Aufgelöster Ansprechpartner-Name zur Anzeige (read-only).","type":["string","null"]},"contactData":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"formulaFields":{"description":"Materialisierte Formelfelder (Doc 26 4.2 v2, E7): Feld-Schlüssel => read-time berechneter Wert.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sourceId":{"type":["integer","null"]},"sourceLabel":{"type":["string","null"]},"leadPipelineId":{"description":"Eigene Lead-Pipeline; fehlt sie, weist {@see \\Octi\\Plugin\\Crm\\Service\\PipelineRouter} regelbasiert zu.","type":["integer","null"]},"leadPipelineName":{"type":["string","null"]},"leadStageId":{"description":"Aktuelle Stufe innerhalb der Lead-Pipeline (muss zur {@see $leadPipelineId} gehören).","type":["integer","null"]},"leadStageName":{"type":["string","null"]},"leadStageCategory":{"description":"Lebenszyklus-Kategorie der aktuellen Lead-Stufe (open/active/done/cancelled), read-only.","type":["string","null"]},"leadStageStatusKey":{"description":"Lebenszyklus-Schlüssel ({@see \\Octi\\Plugin\\Crm\\Entity\\Stage::STATUS_KEY_*}), read-only. Seit\nDoc 28 C-2 SSoT des Lead-Lebenszyklus (ersetzt altes `status`-Feld); steuerbar nur über {@see $leadStageId}.","type":["string","null"]},"score":{"minimum":0,"default":0,"type":"integer"},"ownerId":{"type":["integer","null"]},"brandId":{"description":"Marke des Interessenten (Doc 42, ENT-MARKE-01…03). `null` = für alle Marken sichtbar.","type":["integer","null"]},"notes":{"type":["string","null"]},"utmParams":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"convertedDealId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"Lead-lead.write":{"type":"object","required":["name"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"companyName":{"maxLength":255,"type":["string","null"]},"locale":{"description":"Bevorzugte Kommunikationssprache ('de','en'); steuert die Sprache ausgehender Mails/Newsletter.","type":["string","null"]},"customerId":{"description":"Verknüpfter Bestandskunde (optional) — bei Konversion bevorzugt wiederverwendet.","type":["integer","null"]},"primaryContactId":{"description":"Primärer Ansprechpartner des verknüpften Kunden (optional).","type":["integer","null"]},"contactData":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"sourceId":{"type":["integer","null"]},"leadPipelineId":{"description":"Eigene Lead-Pipeline; fehlt sie, weist {@see \\Octi\\Plugin\\Crm\\Service\\PipelineRouter} regelbasiert zu.","type":["integer","null"]},"leadStageId":{"description":"Aktuelle Stufe innerhalb der Lead-Pipeline (muss zur {@see $leadPipelineId} gehören).","type":["integer","null"]},"score":{"minimum":0,"default":0,"type":"integer"},"ownerId":{"type":["integer","null"]},"brandId":{"description":"Marke des Interessenten (Doc 42, ENT-MARKE-01…03). `null` = für alle Marken sichtbar.","type":["integer","null"]},"notes":{"type":["string","null"]},"utmParams":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"customerUlid":{"description":"Bestehenden Kunden per ULID für Konversion erzwingen; leer → {@see $customerId} bevorzugt, sonst neuer Kunde.","type":["string","null"]},"newCustomerName":{"maxLength":255,"description":"Name des bei Konversion neu anzulegenden Kunden (Default: Firmenname/Lead-Name); getrennt von read-only {@see $customerName}.","type":["string","null"]},"newCustomerType":{"enum":["business","individual"],"description":"Kundentyp des bei der Konversion neu anzulegenden Kunden (business|individual).","type":["string","null"]},"createContact":{"description":"Kontakt aus den Lead-Kontaktdaten mit anlegen (Default true).","type":["boolean","null"]},"pipelineId":{"description":"Ziel-Pipeline des erzeugten Deals (Pflicht bei convert).","type":["integer","null"]},"stageId":{"description":"Ziel-Stage des erzeugten Deals (Pflicht bei convert).","type":["integer","null"]},"dealTitle":{"maxLength":500,"description":"Titel des erzeugten Deals (Default: Lead-/Firmenname).","type":["string","null"]}}},"Lead-lead.write.jsonMergePatch":{"type":"object","properties":{"name":{"maxLength":255,"default":"","type":"string"},"companyName":{"maxLength":255,"type":["string","null"]},"locale":{"description":"Bevorzugte Kommunikationssprache ('de','en'); steuert die Sprache ausgehender Mails/Newsletter.","type":["string","null"]},"customerId":{"description":"Verknüpfter Bestandskunde (optional) — bei Konversion bevorzugt wiederverwendet.","type":["integer","null"]},"primaryContactId":{"description":"Primärer Ansprechpartner des verknüpften Kunden (optional).","type":["integer","null"]},"contactData":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"sourceId":{"type":["integer","null"]},"leadPipelineId":{"description":"Eigene Lead-Pipeline; fehlt sie, weist {@see \\Octi\\Plugin\\Crm\\Service\\PipelineRouter} regelbasiert zu.","type":["integer","null"]},"leadStageId":{"description":"Aktuelle Stufe innerhalb der Lead-Pipeline (muss zur {@see $leadPipelineId} gehören).","type":["integer","null"]},"score":{"minimum":0,"default":0,"type":"integer"},"ownerId":{"type":["integer","null"]},"brandId":{"description":"Marke des Interessenten (Doc 42, ENT-MARKE-01…03). `null` = für alle Marken sichtbar.","type":["integer","null"]},"notes":{"type":["string","null"]},"utmParams":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"customerUlid":{"description":"Bestehenden Kunden per ULID für Konversion erzwingen; leer → {@see $customerId} bevorzugt, sonst neuer Kunde.","type":["string","null"]},"newCustomerName":{"maxLength":255,"description":"Name des bei Konversion neu anzulegenden Kunden (Default: Firmenname/Lead-Name); getrennt von read-only {@see $customerName}.","type":["string","null"]},"newCustomerType":{"enum":["business","individual"],"description":"Kundentyp des bei der Konversion neu anzulegenden Kunden (business|individual).","type":["string","null"]},"createContact":{"description":"Kontakt aus den Lead-Kontaktdaten mit anlegen (Default true).","type":["boolean","null"]},"pipelineId":{"description":"Ziel-Pipeline des erzeugten Deals (Pflicht bei convert).","type":["integer","null"]},"stageId":{"description":"Ziel-Stage des erzeugten Deals (Pflicht bei convert).","type":["integer","null"]},"dealTitle":{"maxLength":500,"description":"Titel des erzeugten Deals (Default: Lead-/Firmenname).","type":["string","null"]}}},"Lead.jsonld-lead.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische PK zusätzlich zur ULID — für Relations-Felder/EntityPicker im Frontend;\nanalog {@see \\App\\Platform\\Customer\\ApiResource\\ContactResource::$id}.","type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"companyName":{"maxLength":255,"type":["string","null"]},"locale":{"description":"Bevorzugte Kommunikationssprache ('de','en'); steuert die Sprache ausgehender Mails/Newsletter.","type":["string","null"]},"customerId":{"description":"Verknüpfter Bestandskunde (optional) — bei Konversion bevorzugt wiederverwendet.","type":["integer","null"]},"customerName":{"description":"Aufgelöster Kundenname zur Anzeige (read-only, vgl. {@see DealResource}).","type":["string","null"]},"primaryContactId":{"description":"Primärer Ansprechpartner des verknüpften Kunden (optional).","type":["integer","null"]},"primaryContactName":{"description":"Aufgelöster Ansprechpartner-Name zur Anzeige (read-only).","type":["string","null"]},"contactData":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"formulaFields":{"description":"Materialisierte Formelfelder (Doc 26 4.2 v2, E7): Feld-Schlüssel => read-time berechneter Wert.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sourceId":{"type":["integer","null"]},"sourceLabel":{"type":["string","null"]},"leadPipelineId":{"description":"Eigene Lead-Pipeline; fehlt sie, weist {@see \\Octi\\Plugin\\Crm\\Service\\PipelineRouter} regelbasiert zu.","type":["integer","null"]},"leadPipelineName":{"type":["string","null"]},"leadStageId":{"description":"Aktuelle Stufe innerhalb der Lead-Pipeline (muss zur {@see $leadPipelineId} gehören).","type":["integer","null"]},"leadStageName":{"type":["string","null"]},"leadStageCategory":{"description":"Lebenszyklus-Kategorie der aktuellen Lead-Stufe (open/active/done/cancelled), read-only.","type":["string","null"]},"leadStageStatusKey":{"description":"Lebenszyklus-Schlüssel ({@see \\Octi\\Plugin\\Crm\\Entity\\Stage::STATUS_KEY_*}), read-only. Seit\nDoc 28 C-2 SSoT des Lead-Lebenszyklus (ersetzt altes `status`-Feld); steuerbar nur über {@see $leadStageId}.","type":["string","null"]},"score":{"minimum":0,"default":0,"type":"integer"},"ownerId":{"type":["integer","null"]},"brandId":{"description":"Marke des Interessenten (Doc 42, ENT-MARKE-01…03). `null` = für alle Marken sichtbar.","type":["integer","null"]},"notes":{"type":["string","null"]},"utmParams":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"convertedDealId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}]},"LeadDuplicateGroup-lead_duplicate.read":{"type":"object","description":"Vorschlagsliste erkannter Lead-Dubletten (Doc 26 3.2): jede Zeile ist ein Cluster verdächtig\ngleicher Leads mit den auslösenden Gründen (`email` · `name`). Merge über\n`POST /v1/crm/leads/{ulid}/merge` (`crm.lead.manage`).","properties":{"key":{"default":"","type":"string"},"reasons":{"type":"array","items":{"type":"string"}},"members":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"LeadDuplicateGroup.jsonld-lead_duplicate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"default":"","type":"string"},"reasons":{"type":"array","items":{"type":"string"}},"members":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Vorschlagsliste erkannter Lead-Dubletten (Doc 26 3.2): jede Zeile ist ein Cluster verdächtig\ngleicher Leads mit den auslösenden Gründen (`email` · `name`). Merge über\n`POST /v1/crm/leads/{ulid}/merge` (`crm.lead.manage`)."},"LexofficeSyncRun-lexoffice_run.read":{"type":"object","description":"lexoffice-Sammellauf als API-Aktion (`POST /v1/billing-previews/lexoffice-sync-run` → {synced, skipped, failed}).\n- API-Pendant zu `finance:lexoffice-sync`; vorher nur Einzel-Handoff exponiert, Sammellauf nur CLI/Cron\n- selbe Service-Logik ({@see \\Octi\\Plugin\\Billing\\Service\\LexofficeSyncService::processPending()})\n  unter gleichem `default-schedule`-Lock wie Scheduler/CLI (belegt → 409).","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"LexofficeSyncRun-lexoffice_run.write":{"type":"object","description":"lexoffice-Sammellauf als API-Aktion (`POST /v1/billing-previews/lexoffice-sync-run` → {synced, skipped, failed}).\n- API-Pendant zu `finance:lexoffice-sync`; vorher nur Einzel-Handoff exponiert, Sammellauf nur CLI/Cron\n- selbe Service-Logik ({@see \\Octi\\Plugin\\Billing\\Service\\LexofficeSyncService::processPending()})\n  unter gleichem `default-schedule`-Lock wie Scheduler/CLI (belegt → 409).","properties":{"limit":{"minimum":1,"maximum":500,"description":"Maximale Anzahl Belege pro Lauf (Default 100) — wie `finance:lexoffice-sync --limit`.","type":["integer","null"]}}},"LexofficeSyncRun.jsonld-lexoffice_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"lexoffice-Sammellauf als API-Aktion (`POST /v1/billing-previews/lexoffice-sync-run` → {synced, skipped, failed}).\n- API-Pendant zu `finance:lexoffice-sync`; vorher nur Einzel-Handoff exponiert, Sammellauf nur CLI/Cron\n- selbe Service-Logik ({@see \\Octi\\Plugin\\Billing\\Service\\LexofficeSyncService::processPending()})\n  unter gleichem `default-schedule`-Lock wie Scheduler/CLI (belegt → 409)."},"License-license.read":{"type":"object","description":"Lizenz-/Abo-Resource (04-07 §5, API-First).\n- CRUD + Lebenszyklus-Aktionen (aktivieren/verlängern/Plan ändern/aussetzen/reaktivieren/\n  kündigen/ablaufen), je mit {@see \\Octi\\Plugin\\Licensing\\Entity\\LicenseEvent} + Δ-MRR\n- Lizenzschlüssel nur mit key.view sichtbar.","properties":{"ulid":{"type":["string","null"]},"licenseId":{"description":"Interne numerische ID (read-only) — Filter-Schlüssel für die LicenseEvent-Timeline.","type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"variantId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"licenseKey":{"description":"Nur mit products.license.key.view sichtbar; sonst null.","type":["string","null"]},"customerName":{"description":"Anzeigename des Kunden bzw. Produkts. Die Lizenz selbst hat keinen Titel und der\nLizenzschluessel ist ein key.view-geschuetztes Secret — ohne diese beiden Felder hatte die\nRessource fuer Listen-Konsumenten gar keinen anzeigbaren Text (Audit R25).","type":["string","null"]},"productName":{"type":["string","null"]},"status":{"type":["string","null"]},"seats":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"term":{"enum":["monthly","yearly","perpetual"],"description":"monthly | yearly | perpetual.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"renewsAt":{"type":["string","null"]},"autoRenew":{"type":["boolean","null"]},"cancelAt":{"description":"Kündigungsdatum (cancel-Aktion); bis dahin bleibt die Lizenz active.","type":["string","null"]},"mrrAmount":{"description":"Monatsnormalisierter wiederkehrender Erlös in Cent.","type":["integer","null"]},"arrAmount":{"description":"Jahreswert in Cent (= mrrAmount × 12).","type":["integer","null"]},"currentVersionId":{"type":["integer","null"]},"priceListRateId":{"type":["integer","null"]},"recurringBillingPlanId":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]},"entitlements":{"description":"Freigeschaltete Entitlements (nur Item-Detail): {featureKey, valueType,\ngrantedLimit, usedAmount, unit, blocked}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"License-license.write":{"type":"object","description":"Lizenz-/Abo-Resource (04-07 §5, API-First).\n- CRUD + Lebenszyklus-Aktionen (aktivieren/verlängern/Plan ändern/aussetzen/reaktivieren/\n  kündigen/ablaufen), je mit {@see \\Octi\\Plugin\\Licensing\\Entity\\LicenseEvent} + Δ-MRR\n- Lizenzschlüssel nur mit key.view sichtbar.","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"variantId":{"type":["integer","null"]},"variantUlid":{"description":"Variante als öffentliche ULID (nur Plan-Wechsel-Input).","type":["string","null"]},"brandId":{"type":["integer","null"]},"licenseKey":{"description":"Nur mit products.license.key.view sichtbar; sonst null.","type":["string","null"]},"seats":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"term":{"enum":["monthly","yearly","perpetual"],"description":"monthly | yearly | perpetual.","type":["string","null"]},"startsAt":{"type":["string","null"]},"autoRenew":{"type":["boolean","null"]},"cancelAt":{"description":"Kündigungsdatum (cancel-Aktion); bis dahin bleibt die Lizenz active.","type":["string","null"]},"immediate":{"description":"Sofortkündigung (cancel-Aktion).","type":["boolean","null"]},"currentVersionId":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]}}},"License-license.write.jsonMergePatch":{"type":"object","description":"Lizenz-/Abo-Resource (04-07 §5, API-First).\n- CRUD + Lebenszyklus-Aktionen (aktivieren/verlängern/Plan ändern/aussetzen/reaktivieren/\n  kündigen/ablaufen), je mit {@see \\Octi\\Plugin\\Licensing\\Entity\\LicenseEvent} + Δ-MRR\n- Lizenzschlüssel nur mit key.view sichtbar.","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"variantId":{"type":["integer","null"]},"variantUlid":{"description":"Variante als öffentliche ULID (nur Plan-Wechsel-Input).","type":["string","null"]},"brandId":{"type":["integer","null"]},"licenseKey":{"description":"Nur mit products.license.key.view sichtbar; sonst null.","type":["string","null"]},"seats":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"term":{"enum":["monthly","yearly","perpetual"],"description":"monthly | yearly | perpetual.","type":["string","null"]},"startsAt":{"type":["string","null"]},"autoRenew":{"type":["boolean","null"]},"cancelAt":{"description":"Kündigungsdatum (cancel-Aktion); bis dahin bleibt die Lizenz active.","type":["string","null"]},"immediate":{"description":"Sofortkündigung (cancel-Aktion).","type":["boolean","null"]},"currentVersionId":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]}}},"License.jsonld-license.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"licenseId":{"description":"Interne numerische ID (read-only) — Filter-Schlüssel für die LicenseEvent-Timeline.","type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"variantId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"licenseKey":{"description":"Nur mit products.license.key.view sichtbar; sonst null.","type":["string","null"]},"customerName":{"description":"Anzeigename des Kunden bzw. Produkts. Die Lizenz selbst hat keinen Titel und der\nLizenzschluessel ist ein key.view-geschuetztes Secret — ohne diese beiden Felder hatte die\nRessource fuer Listen-Konsumenten gar keinen anzeigbaren Text (Audit R25).","type":["string","null"]},"productName":{"type":["string","null"]},"status":{"type":["string","null"]},"seats":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"term":{"enum":["monthly","yearly","perpetual"],"description":"monthly | yearly | perpetual.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"renewsAt":{"type":["string","null"]},"autoRenew":{"type":["boolean","null"]},"cancelAt":{"description":"Kündigungsdatum (cancel-Aktion); bis dahin bleibt die Lizenz active.","type":["string","null"]},"mrrAmount":{"description":"Monatsnormalisierter wiederkehrender Erlös in Cent.","type":["integer","null"]},"arrAmount":{"description":"Jahreswert in Cent (= mrrAmount × 12).","type":["integer","null"]},"currentVersionId":{"type":["integer","null"]},"priceListRateId":{"type":["integer","null"]},"recurringBillingPlanId":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]},"entitlements":{"description":"Freigeschaltete Entitlements (nur Item-Detail): {featureKey, valueType,\ngrantedLimit, usedAmount, unit, blocked}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Lizenz-/Abo-Resource (04-07 §5, API-First).\n- CRUD + Lebenszyklus-Aktionen (aktivieren/verlängern/Plan ändern/aussetzen/reaktivieren/\n  kündigen/ablaufen), je mit {@see \\Octi\\Plugin\\Licensing\\Entity\\LicenseEvent} + Δ-MRR\n- Lizenzschlüssel nur mit key.view sichtbar."},"LicenseEvent-license_event.read":{"type":"object","description":"Lizenz-Lebenszyklus-Timeline (04-07 §5).\n- read-only, Filter `?licenseId=`, chronologisch absteigend\n- Append-only, Δ-MRR je Event.","properties":{"ulid":{"type":["string","null"]},"licenseId":{"type":["integer","null"]},"type":{"type":["string","null"]},"occurredAt":{"type":["string","null"]},"effectiveAt":{"type":["string","null"]},"actorId":{"type":["string","null"]},"mrrDelta":{"description":"Veränderung des MRR in Cent (signed).","type":["integer","null"]},"payload":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"note":{"type":["string","null"]}}},"LicenseEvent.jsonld-license_event.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"licenseId":{"type":["integer","null"]},"type":{"type":["string","null"]},"occurredAt":{"type":["string","null"]},"effectiveAt":{"type":["string","null"]},"actorId":{"type":["string","null"]},"mrrDelta":{"description":"Veränderung des MRR in Cent (signed).","type":["integer","null"]},"payload":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"note":{"type":["string","null"]}}}],"description":"Lizenz-Lebenszyklus-Timeline (04-07 §5).\n- read-only, Filter `?licenseId=`, chronologisch absteigend\n- Append-only, Δ-MRR je Event."},"LicenseLifecycleRun-license_lifecycle_run.read":{"type":"object","description":"Lizenz-Lebenszyklus-Lauf als API-Aktion (`POST /v1/licenses/lifecycle-run`) — API-Pendant zu\n`license:lifecycle` (P-1/P-3, Audit R21 PAR-7; vorher nur CLI/Cron; Vorbild\n`POST /v1/recurring-billing-plans/run`).\n- Service-Logik: {@see \\Octi\\Plugin\\Licensing\\Service\\LicenseSchedulerService::run()}\n- selbes `default-schedule`-Lock wie Scheduler/CLI ({@see \\App\\Shared\\Console\\AbstractScheduledJobsCommand}) —\n  sonst DOPPELTE Verlängerung bei API+Worker parallel (belegt → 409)\n- `lifecycle-run` kollidiert nicht mit `{ulid}`-Aktionsrouten.","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"LicenseLifecycleRun-license_lifecycle_run.write":{"type":"object","description":"Lizenz-Lebenszyklus-Lauf als API-Aktion (`POST /v1/licenses/lifecycle-run`) — API-Pendant zu\n`license:lifecycle` (P-1/P-3, Audit R21 PAR-7; vorher nur CLI/Cron; Vorbild\n`POST /v1/recurring-billing-plans/run`).\n- Service-Logik: {@see \\Octi\\Plugin\\Licensing\\Service\\LicenseSchedulerService::run()}\n- selbes `default-schedule`-Lock wie Scheduler/CLI ({@see \\App\\Shared\\Console\\AbstractScheduledJobsCommand}) —\n  sonst DOPPELTE Verlängerung bei API+Worker parallel (belegt → 409)\n- `lifecycle-run` kollidiert nicht mit `{ulid}`-Aktionsrouten.","properties":{"asOfDate":{"description":"Optionaler Stichtag (YYYY-MM-DD); ohne Angabe heute — wie `license:lifecycle --date`.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]}}},"LicenseLifecycleRun.jsonld-license_lifecycle_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"Lizenz-Lebenszyklus-Lauf als API-Aktion (`POST /v1/licenses/lifecycle-run`) — API-Pendant zu\n`license:lifecycle` (P-1/P-3, Audit R21 PAR-7; vorher nur CLI/Cron; Vorbild\n`POST /v1/recurring-billing-plans/run`).\n- Service-Logik: {@see \\Octi\\Plugin\\Licensing\\Service\\LicenseSchedulerService::run()}\n- selbes `default-schedule`-Lock wie Scheduler/CLI ({@see \\App\\Shared\\Console\\AbstractScheduledJobsCommand}) —\n  sonst DOPPELTE Verlängerung bei API+Worker parallel (belegt → 409)\n- `lifecycle-run` kollidiert nicht mit `{ulid}`-Aktionsrouten."},"LicenseStatus-license_status.read":{"type":"object","description":"Lizenz-/Abo-Status als Daten (04-07 §3).\n- konfigurierbar in Einstellungen, kein Code nötig\n- `key` == vormals License::STATUS_*.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"LicenseStatus-license_status.update.jsonMergePatch":{"type":"object","description":"Lizenz-/Abo-Status als Daten (04-07 §3).\n- konfigurierbar in Einstellungen, kein Code nötig\n- `key` == vormals License::STATUS_*.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"LicenseStatus-license_status.write":{"type":"object","description":"Lizenz-/Abo-Status als Daten (04-07 §3).\n- konfigurierbar in Einstellungen, kein Code nötig\n- `key` == vormals License::STATUS_*.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"LicenseStatus.jsonld-license_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Lizenz-/Abo-Status als Daten (04-07 §3).\n- konfigurierbar in Einstellungen, kein Code nötig\n- `key` == vormals License::STATUS_*."},"LicenseSummary-license_summary.read":{"type":"object","description":"Lizenz-Kennzahl-Aggregat (04-07 §5/§8) für die Listenansicht.\n- MRR/ARR + aktive/30-Tage-Verlängerungen, über GESAMTbestand (nicht nur geladene Seite)\n- read-only, markenscope-gefiltert, als Ein-Element-Collection.","properties":{"id":{"type":["string","null"]},"mrrAmount":{"description":"Gesamt-MRR in Cent über alle laufenden Lizenzen.","type":["integer","null"]},"arrAmount":{"description":"Gesamt-ARR in Cent (= MRR × 12).","type":["integer","null"]},"activeCount":{"description":"Anzahl aktiver Lizenzen (Status active).","type":["integer","null"]},"renewingSoonCount":{"description":"Anzahl laufender Lizenzen mit Verlängerung in den nächsten 30 Tagen.","type":["integer","null"]},"totalCount":{"description":"Gesamtzahl Lizenzen (nicht gelöscht) im Marken-Scope.","type":["integer","null"]}}},"LicenseSummary.jsonld-license_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"mrrAmount":{"description":"Gesamt-MRR in Cent über alle laufenden Lizenzen.","type":["integer","null"]},"arrAmount":{"description":"Gesamt-ARR in Cent (= MRR × 12).","type":["integer","null"]},"activeCount":{"description":"Anzahl aktiver Lizenzen (Status active).","type":["integer","null"]},"renewingSoonCount":{"description":"Anzahl laufender Lizenzen mit Verlängerung in den nächsten 30 Tagen.","type":["integer","null"]},"totalCount":{"description":"Gesamtzahl Lizenzen (nicht gelöscht) im Marken-Scope.","type":["integer","null"]}}}],"description":"Lizenz-Kennzahl-Aggregat (04-07 §5/§8) für die Listenansicht.\n- MRR/ARR + aktive/30-Tage-Verlängerungen, über GESAMTbestand (nicht nur geladene Seite)\n- read-only, markenscope-gefiltert, als Ein-Element-Collection."},"LicensingShopwareImportRun-shopware_import_run.read":{"type":"object","description":"Shopware-Lizenz-Import als API-Aktion (`POST /v1/licensing/shopware-import-run`) — API-Pendant\nzu `app:licensing:import-shopware` (P-1/P-3, Audit R18 #69; vorher nur CLI, ohne Scheduler/UI).\n- Lauf-Logik: {@see \\Octi\\Plugin\\Licensing\\Service\\ShopwareImportRunner}\n- selbe Lauf-Sperre wie CLI/Scheduler (belegt → 409; unkonfiguriert → 422).","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"LicensingShopwareImportRun-shopware_import_run.write":{"type":"object","description":"Shopware-Lizenz-Import als API-Aktion (`POST /v1/licensing/shopware-import-run`) — API-Pendant\nzu `app:licensing:import-shopware` (P-1/P-3, Audit R18 #69; vorher nur CLI, ohne Scheduler/UI).\n- Lauf-Logik: {@see \\Octi\\Plugin\\Licensing\\Service\\ShopwareImportRunner}\n- selbe Lauf-Sperre wie CLI/Scheduler (belegt → 409; unkonfiguriert → 422)."},"LicensingShopwareImportRun.jsonld-shopware_import_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"Shopware-Lizenz-Import als API-Aktion (`POST /v1/licensing/shopware-import-run`) — API-Pendant\nzu `app:licensing:import-shopware` (P-1/P-3, Audit R18 #69; vorher nur CLI, ohne Scheduler/UI).\n- Lauf-Logik: {@see \\Octi\\Plugin\\Licensing\\Service\\ShopwareImportRunner}\n- selbe Lauf-Sperre wie CLI/Scheduler (belegt → 409; unkonfiguriert → 422)."},"LinkableEmployee-linkable_employee.read":{"type":"object","description":"Schlanker Mitarbeiter-Lookup für die Konten-Verknüpfung in der Benutzerverwaltung (Settings).\n- Getrennt von {@see EmployeeResource}: Recht `platform.user.manage` statt `hr.employee.view`\n- Nur Auswahl-Felder, keine HR-Stammdaten (Kostensatz/Vertrag/Kontakt)\n- `linkedUserUlid` markiert bereits belegte Mitarbeiter fürs Frontend.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"displayName":{"type":["string","null"]},"personnelNumber":{"type":["string","null"]},"status":{"type":["string","null"]},"linkedUserUlid":{"description":"ULID des bereits verknüpften Benutzerkontos (null = frei verknüpfbar).","type":["string","null"]}}},"LinkableEmployee.jsonld-linkable_employee.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"displayName":{"type":["string","null"]},"personnelNumber":{"type":["string","null"]},"status":{"type":["string","null"]},"linkedUserUlid":{"description":"ULID des bereits verknüpften Benutzerkontos (null = frei verknüpfbar).","type":["string","null"]}}}],"description":"Schlanker Mitarbeiter-Lookup für die Konten-Verknüpfung in der Benutzerverwaltung (Settings).\n- Getrennt von {@see EmployeeResource}: Recht `platform.user.manage` statt `hr.employee.view`\n- Nur Auswahl-Felder, keine HR-Stammdaten (Kostensatz/Vertrag/Kontakt)\n- `linkedUserUlid` markiert bereits belegte Mitarbeiter fürs Frontend."},"LocalPluginCandidate":{"type":"object","description":"Unregistrierte Plugin-Ordner unter `plugins/` — additiv zu {@see PluginResource} (`/api/v1/plugins`).\n- `POST /v1/plugin-candidates/{dir}/install`: registrieren+bauen (async, {@see LocalPluginInstallProcessor});\n  Ergebnis über `GET /v1/plugin-install-jobs/{jobId}` ({@see PluginInstallJobResource}) verfolgen\n- `DELETE /v1/plugin-candidates/{dir}`: Ordner löschen ({@see LocalPluginDeleteProcessor})\n- Identifikator = Ordnername; `key` (plugin.json-`name`) erst nach Install stabil\n- Gated: `platform.plugin.manage`.","properties":{"dir":{"description":"Ordnername unter `plugins/` (z. B. `OctiFoo`) — der stabile Identifikator des Kandidaten.","default":"","type":"string"},"key":{"description":"Plugin-Schlüssel aus `plugin.json` (`name`, z. B. `octi.foo`); leer bei kaputtem Manifest.","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"technicalName":{"default":"","type":"string"},"packageName":{"default":"","type":"string"},"vendor":{"default":"","type":"string"},"description":{"default":"","type":"string"},"trustTier":{"default":"","type":"string"},"moduleFlag":{"default":"","type":"string"},"routeSegments":{"type":"array","items":{"type":"string"}},"hasFrontend":{"default":false,"type":"boolean"},"spiVersion":{"type":["string","null"]},"iconUrl":{"description":"Produkt-Icon als `data:`-URI (base64), direkt in ein `<img>` renderbar; null wenn keins hinterlegt.","type":["string","null"]},"installable":{"description":"Kann der Ordner sauber per Laufzeit-Install registriert werden? `false` + `error` sonst.","default":false,"type":"boolean"},"error":{"description":"Grund (Übersetzungs-Key oder Klartext), warum der Ordner nicht installierbar ist; null wenn installierbar.","type":["string","null"]},"jobId":{"description":"Job-ID des angestoßenen asynchronen Installs (nur in der Install-Antwort gesetzt).","type":["string","null"]},"status":{"description":"Status der Install-Antwort (`queued`), sonst null.","type":["string","null"]}}},"LocalPluginCandidate-plugin_candidate.read":{"type":"object","description":"Unregistrierte Plugin-Ordner unter `plugins/` — additiv zu {@see PluginResource} (`/api/v1/plugins`).\n- `POST /v1/plugin-candidates/{dir}/install`: registrieren+bauen (async, {@see LocalPluginInstallProcessor});\n  Ergebnis über `GET /v1/plugin-install-jobs/{jobId}` ({@see PluginInstallJobResource}) verfolgen\n- `DELETE /v1/plugin-candidates/{dir}`: Ordner löschen ({@see LocalPluginDeleteProcessor})\n- Identifikator = Ordnername; `key` (plugin.json-`name`) erst nach Install stabil\n- Gated: `platform.plugin.manage`.","properties":{"dir":{"description":"Ordnername unter `plugins/` (z. B. `OctiFoo`) — der stabile Identifikator des Kandidaten.","default":"","type":"string"},"key":{"description":"Plugin-Schlüssel aus `plugin.json` (`name`, z. B. `octi.foo`); leer bei kaputtem Manifest.","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"technicalName":{"default":"","type":"string"},"packageName":{"default":"","type":"string"},"vendor":{"default":"","type":"string"},"description":{"default":"","type":"string"},"trustTier":{"default":"","type":"string"},"moduleFlag":{"default":"","type":"string"},"routeSegments":{"type":"array","items":{"type":"string"}},"hasFrontend":{"default":false,"type":"boolean"},"spiVersion":{"type":["string","null"]},"iconUrl":{"description":"Produkt-Icon als `data:`-URI (base64), direkt in ein `<img>` renderbar; null wenn keins hinterlegt.","type":["string","null"]},"installable":{"description":"Kann der Ordner sauber per Laufzeit-Install registriert werden? `false` + `error` sonst.","default":false,"type":"boolean"},"error":{"description":"Grund (Übersetzungs-Key oder Klartext), warum der Ordner nicht installierbar ist; null wenn installierbar.","type":["string","null"]},"jobId":{"description":"Job-ID des angestoßenen asynchronen Installs (nur in der Install-Antwort gesetzt).","type":["string","null"]},"status":{"description":"Status der Install-Antwort (`queued`), sonst null.","type":["string","null"]}}},"LocalPluginCandidate.jsonld-plugin_candidate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"dir":{"description":"Ordnername unter `plugins/` (z. B. `OctiFoo`) — der stabile Identifikator des Kandidaten.","default":"","type":"string"},"key":{"description":"Plugin-Schlüssel aus `plugin.json` (`name`, z. B. `octi.foo`); leer bei kaputtem Manifest.","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"technicalName":{"default":"","type":"string"},"packageName":{"default":"","type":"string"},"vendor":{"default":"","type":"string"},"description":{"default":"","type":"string"},"trustTier":{"default":"","type":"string"},"moduleFlag":{"default":"","type":"string"},"routeSegments":{"type":"array","items":{"type":"string"}},"hasFrontend":{"default":false,"type":"boolean"},"spiVersion":{"type":["string","null"]},"iconUrl":{"description":"Produkt-Icon als `data:`-URI (base64), direkt in ein `<img>` renderbar; null wenn keins hinterlegt.","type":["string","null"]},"installable":{"description":"Kann der Ordner sauber per Laufzeit-Install registriert werden? `false` + `error` sonst.","default":false,"type":"boolean"},"error":{"description":"Grund (Übersetzungs-Key oder Klartext), warum der Ordner nicht installierbar ist; null wenn installierbar.","type":["string","null"]},"jobId":{"description":"Job-ID des angestoßenen asynchronen Installs (nur in der Install-Antwort gesetzt).","type":["string","null"]},"status":{"description":"Status der Install-Antwort (`queued`), sonst null.","type":["string","null"]}}}],"description":"Unregistrierte Plugin-Ordner unter `plugins/` — additiv zu {@see PluginResource} (`/api/v1/plugins`).\n- `POST /v1/plugin-candidates/{dir}/install`: registrieren+bauen (async, {@see LocalPluginInstallProcessor});\n  Ergebnis über `GET /v1/plugin-install-jobs/{jobId}` ({@see PluginInstallJobResource}) verfolgen\n- `DELETE /v1/plugin-candidates/{dir}`: Ordner löschen ({@see LocalPluginDeleteProcessor})\n- Identifikator = Ordnername; `key` (plugin.json-`name`) erst nach Install stabil\n- Gated: `platform.plugin.manage`."},"Locale-locale.read":{"type":"object","description":"Die vom System unterstützten Sprachen (Sprachpaket-Ausbau 2026-07-17).\n- Read-only: kommen aus installierten Sprachpaketen ({@see \\App\\Platform\\Plugin\\Contract\\LocaleProviderInterface}),\n  keine per API pflegbaren Stammdaten. „Sprache hinzufügen\" = „Sprachpaket installieren\".\n- API nötig (P-1/P-2), damit Automation/MCP gültige Sprach-Codes erfragen statt 'de'/'en' zu raten.\n- `ROLE_USER` genügt: keine schützenswerte Info, aber jeder Aufrufer braucht sie (Sprachumschalter etc.).","properties":{"code":{"description":"BCP-47-Kurzform (`de`, `en`, `fr`) — der in Sprachfeldern zu speichernde Wert.","type":"string"},"endonym":{"description":"Eigenbezeichnung IN der Sprache selbst („Deutsch\", „Français\") — nie übersetzt.","type":"string"},"intlTag":{"description":"Vollständiger BCP-47-Tag für Zahl-/Datums-/Geldformate (`de-DE`).","type":"string"},"rtl":{"description":"Textrichtung rechts-nach-links (Arabisch/Hebräisch).","type":"boolean"},"isDefault":{"description":"Fallback-Sprache des Systems: Übersetzungslücken fallen hierauf zurück.","type":"boolean"}}},"Locale.jsonld-locale.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"code":{"description":"BCP-47-Kurzform (`de`, `en`, `fr`) — der in Sprachfeldern zu speichernde Wert.","type":"string"},"endonym":{"description":"Eigenbezeichnung IN der Sprache selbst („Deutsch\", „Français\") — nie übersetzt.","type":"string"},"intlTag":{"description":"Vollständiger BCP-47-Tag für Zahl-/Datums-/Geldformate (`de-DE`).","type":"string"},"rtl":{"description":"Textrichtung rechts-nach-links (Arabisch/Hebräisch).","type":"boolean"},"isDefault":{"description":"Fallback-Sprache des Systems: Übersetzungslücken fallen hierauf zurück.","type":"boolean"}}}],"description":"Die vom System unterstützten Sprachen (Sprachpaket-Ausbau 2026-07-17).\n- Read-only: kommen aus installierten Sprachpaketen ({@see \\App\\Platform\\Plugin\\Contract\\LocaleProviderInterface}),\n  keine per API pflegbaren Stammdaten. „Sprache hinzufügen\" = „Sprachpaket installieren\".\n- API nötig (P-1/P-2), damit Automation/MCP gültige Sprach-Codes erfragen statt 'de'/'en' zu raten.\n- `ROLE_USER` genügt: keine schützenswerte Info, aber jeder Aufrufer braucht sie (Sprachumschalter etc.)."},"MailBlock-mail_block.read":{"type":"object","description":"Mail-Blacklist-Eintrag (04-04 §4 S4-2): blockt Absender/Domains global oder je Marke.","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["email","domain"],"description":"email|domain.","type":["string","null"]},"value":{"type":["string","null"]},"scope":{"enum":["global","brand"],"description":"global|brand.","type":["string","null"]},"brandId":{"type":["integer","null"]},"reason":{"type":["string","null"]},"active":{"type":["boolean","null"]}},"required":["value"]},"MailBlock-mail_block.write":{"type":"object","description":"Mail-Blacklist-Eintrag (04-04 §4 S4-2): blockt Absender/Domains global oder je Marke.","properties":{"type":{"enum":["email","domain"],"description":"email|domain.","type":["string","null"]},"value":{"type":["string","null"]},"scope":{"enum":["global","brand"],"description":"global|brand.","type":["string","null"]},"brandId":{"type":["integer","null"]},"reason":{"type":["string","null"]},"active":{"type":["boolean","null"]}},"required":["value"]},"MailBlock-mail_block.write.jsonMergePatch":{"type":"object","description":"Mail-Blacklist-Eintrag (04-04 §4 S4-2): blockt Absender/Domains global oder je Marke.","properties":{"type":{"enum":["email","domain"],"description":"email|domain.","type":["string","null"]},"value":{"type":["string","null"]},"scope":{"enum":["global","brand"],"description":"global|brand.","type":["string","null"]},"brandId":{"type":["integer","null"]},"reason":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"MailBlock.jsonld-mail_block.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["email","domain"],"description":"email|domain.","type":["string","null"]},"value":{"type":["string","null"]},"scope":{"enum":["global","brand"],"description":"global|brand.","type":["string","null"]},"brandId":{"type":["integer","null"]},"reason":{"type":["string","null"]},"active":{"type":["boolean","null"]}},"required":["value"]}],"description":"Mail-Blacklist-Eintrag (04-04 §4 S4-2): blockt Absender/Domains global oder je Marke."},"MailBlockType-mail_block.read":{"type":"object","description":"Baustein-Palette des MAIL-Editors (Doc 46 A1, ENT-MKT-01): serialisierbare Sicht auf die\n{@see \\App\\Platform\\Mail\\Block\\MailBlockTypeRegistry} — nur Typen MIT settingsSchema.\nBewusst GETRENNT vom Baukasten-Katalog: eine Mail-Palette darf nie Web-Bausteine anbieten.\nKein Brand-Scope (Katalog = Programm, keine Daten).","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"type":["string","null"]},"icon":{"type":["string","null"]},"supportsChildren":{"default":false,"type":"boolean"},"deprecated":{"default":false,"type":"boolean"},"settingsSchema":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"styleCapabilities":{"description":"Immer leer — Mail-Stil kommt ausschliesslich aus dem settingsSchema (ENT-MKT-01).","type":"array","items":{"type":"string"}},"provider":{"type":["string","null"]}}},"MailBlockType.jsonld-mail_block.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"type":["string","null"]},"icon":{"type":["string","null"]},"supportsChildren":{"default":false,"type":"boolean"},"deprecated":{"default":false,"type":"boolean"},"settingsSchema":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"styleCapabilities":{"description":"Immer leer — Mail-Stil kommt ausschliesslich aus dem settingsSchema (ENT-MKT-01).","type":"array","items":{"type":"string"}},"provider":{"type":["string","null"]}}}],"description":"Baustein-Palette des MAIL-Editors (Doc 46 A1, ENT-MKT-01): serialisierbare Sicht auf die\n{@see \\App\\Platform\\Mail\\Block\\MailBlockTypeRegistry} — nur Typen MIT settingsSchema.\nBewusst GETRENNT vom Baukasten-Katalog: eine Mail-Palette darf nie Web-Bausteine anbieten.\nKein Brand-Scope (Katalog = Programm, keine Daten)."},"MailCanvas-mail_canvas.write":{"type":"object","description":"Canvas-Render einer MAIL-Block-Flaeche (Doc 46 A2/A3, ENT-MKT-01).\n\nDer Editor schickt den BAUM und bekommt das ERZEUGNIS zurueck — genau das, was spaeter im\nPostfach steht. Kein Client-Renderer: eine zweite Render-Fassung im Browser waere eine zweite\nWahrheit, und die Abweichung faellt erst nach dem Versand auf.\n\nPersistiert nichts. Marken-Lese-Schranke wie bei der Vorschau: der Canvas rendert Marken-CI,\nein markenbeschraenkter Nutzer darf fremdes Branding nicht sehen.","properties":{"blocks":{"description":"Baustein-Baum (Knotenliste). Deckel: {@see \\App\\Platform\\Mail\\Service\\MailDesignCompiler::MAX_NODES}.","type":["array","null"],"items":{"type":"array","items":{"type":["string","null"]}}},"brandId":{"description":"Marke, deren CI-Token gelten (null = markenuebergreifende Vorgaben).","type":["integer","null"]},"locale":{"description":"Sprache, in der `{i18n:{…}}`-Werte aufgeloest werden (Vorgabe `de`).","type":["string","null"]},"slots":{"description":"Slot-Inhalte (Kampagnen-Sicht): Slot-Schluessel → Knotenliste.","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":["string","null"]}}}}}},"MailCanvas.MailCanvasResult-mail_canvas.read":{"type":"object","description":"Canvas-Render einer MAIL-Block-Flaeche (Doc 46 A2/A3, ENT-MKT-01).\n\nDer Editor schickt den BAUM und bekommt das ERZEUGNIS zurueck — genau das, was spaeter im\nPostfach steht. Kein Client-Renderer: eine zweite Render-Fassung im Browser waere eine zweite\nWahrheit, und die Abweichung faellt erst nach dem Versand auf.\n\nPersistiert nichts. Marken-Lese-Schranke wie bei der Vorschau: der Canvas rendert Marken-CI,\nein markenbeschraenkter Nutzer darf fremdes Branding nicht sehen.","properties":{"html":{"type":"string"},"text":{"type":"string"},"slotKeys":{"description":"Slot-Schluessel des Baums in Dokument-Reihenfolge — die Kampagnen-Maske baut daraus ihre Felder.","type":"array","items":{"type":"string"}}}},"MailCanvas.MailCanvasResult.jsonld-mail_canvas.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"html":{"type":"string"},"text":{"type":"string"},"slotKeys":{"description":"Slot-Schluessel des Baums in Dokument-Reihenfolge — die Kampagnen-Maske baut daraus ihre Felder.","type":"array","items":{"type":"string"}}}}],"description":"Canvas-Render einer MAIL-Block-Flaeche (Doc 46 A2/A3, ENT-MKT-01).\n\nDer Editor schickt den BAUM und bekommt das ERZEUGNIS zurueck — genau das, was spaeter im\nPostfach steht. Kein Client-Renderer: eine zweite Render-Fassung im Browser waere eine zweite\nWahrheit, und die Abweichung faellt erst nach dem Versand auf.\n\nPersistiert nichts. Marken-Lese-Schranke wie bei der Vorschau: der Canvas rendert Marken-CI,\nein markenbeschraenkter Nutzer darf fremdes Branding nicht sehen."},"MailLayout-mail_layout.read":{"type":"object","description":"Mail-Layout (Kopf-/Fußzeile, Marken-CI) für ausgehende Kommunikations-/Ticket-Mails — settings-\npflegbar, wird beim Versand um den Nachrichtentext gelegt (Fallback: roh ohne Layout).\n`brandId = null` = markenübergreifendes Standard-Layout.","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"description":"Marke (null = markenübergreifendes Standard-Layout/Fallback).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"locale":{"description":"Sprache des Layouts ('de','en',…); null = sprachübergreifend.","type":["string","null"]},"logoUrl":{"type":["string","null"]},"primaryColor":{"type":["string","null"]},"headerText":{"type":["string","null"]},"footerText":{"type":["string","null"]},"signatureHtml":{"type":["string","null"]},"headerHtml":{"type":["string","null"]},"footerHtml":{"type":["string","null"]},"active":{"type":["boolean","null"]},"createdAt":{"type":["string","null"]}},"required":["name"]},"MailLayout-mail_layout.write":{"type":"object","description":"Mail-Layout (Kopf-/Fußzeile, Marken-CI) für ausgehende Kommunikations-/Ticket-Mails — settings-\npflegbar, wird beim Versand um den Nachrichtentext gelegt (Fallback: roh ohne Layout).\n`brandId = null` = markenübergreifendes Standard-Layout.","required":["name"],"properties":{"name":{"type":["string","null"]},"brandId":{"description":"Marke (null = markenübergreifendes Standard-Layout/Fallback).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"locale":{"description":"Sprache des Layouts ('de','en',…); null = sprachübergreifend.","type":["string","null"]},"logoUrl":{"type":["string","null"]},"primaryColor":{"type":["string","null"]},"headerText":{"type":["string","null"]},"footerText":{"type":["string","null"]},"signatureHtml":{"type":["string","null"]},"headerHtml":{"type":["string","null"]},"footerHtml":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"MailLayout-mail_layout.write.jsonMergePatch":{"type":"object","description":"Mail-Layout (Kopf-/Fußzeile, Marken-CI) für ausgehende Kommunikations-/Ticket-Mails — settings-\npflegbar, wird beim Versand um den Nachrichtentext gelegt (Fallback: roh ohne Layout).\n`brandId = null` = markenübergreifendes Standard-Layout.","properties":{"name":{"type":["string","null"]},"brandId":{"description":"Marke (null = markenübergreifendes Standard-Layout/Fallback).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"locale":{"description":"Sprache des Layouts ('de','en',…); null = sprachübergreifend.","type":["string","null"]},"logoUrl":{"type":["string","null"]},"primaryColor":{"type":["string","null"]},"headerText":{"type":["string","null"]},"footerText":{"type":["string","null"]},"signatureHtml":{"type":["string","null"]},"headerHtml":{"type":["string","null"]},"footerHtml":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"MailLayout.jsonld-mail_layout.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"description":"Marke (null = markenübergreifendes Standard-Layout/Fallback).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"locale":{"description":"Sprache des Layouts ('de','en',…); null = sprachübergreifend.","type":["string","null"]},"logoUrl":{"type":["string","null"]},"primaryColor":{"type":["string","null"]},"headerText":{"type":["string","null"]},"footerText":{"type":["string","null"]},"signatureHtml":{"type":["string","null"]},"headerHtml":{"type":["string","null"]},"footerHtml":{"type":["string","null"]},"active":{"type":["boolean","null"]},"createdAt":{"type":["string","null"]}},"required":["name"]}],"description":"Mail-Layout (Kopf-/Fußzeile, Marken-CI) für ausgehende Kommunikations-/Ticket-Mails — settings-\npflegbar, wird beim Versand um den Nachrichtentext gelegt (Fallback: roh ohne Layout).\n`brandId = null` = markenübergreifendes Standard-Layout."},"MailLayoutPreview-mail_layout_preview.write":{"type":"object","description":"Live-Vorschau eines (auch ungespeicherten) Mail-Layouts — POST mit Layout-Feldern + optionalem\nBeispieltext liefert gerendertes HTML mit Demo-Platzhaltern. Nutzt denselben Renderer wie der\nreale Versand (Vorschau = 1:1 spätere Mail).","properties":{"brandId":{"type":["integer","null"]},"logoUrl":{"type":["string","null"]},"primaryColor":{"type":["string","null"]},"headerText":{"type":["string","null"]},"footerText":{"type":["string","null"]},"signatureHtml":{"type":["string","null"]},"headerHtml":{"type":["string","null"]},"footerHtml":{"type":["string","null"]},"sampleBody":{"description":"Optionaler Beispiel-Nachrichtentext; leer → Standard-Demotext.","type":["string","null"]}}},"MailLayoutPreview.MailLayoutPreviewResult-mail_layout_preview.read":{"type":"object","description":"Live-Vorschau eines (auch ungespeicherten) Mail-Layouts — POST mit Layout-Feldern + optionalem\nBeispieltext liefert gerendertes HTML mit Demo-Platzhaltern. Nutzt denselben Renderer wie der\nreale Versand (Vorschau = 1:1 spätere Mail).","properties":{"html":{"type":"string"}}},"MailLayoutPreview.MailLayoutPreviewResult.jsonld-mail_layout_preview.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"html":{"type":"string"}}}],"description":"Live-Vorschau eines (auch ungespeicherten) Mail-Layouts — POST mit Layout-Feldern + optionalem\nBeispieltext liefert gerendertes HTML mit Demo-Platzhaltern. Nutzt denselben Renderer wie der\nreale Versand (Vorschau = 1:1 spätere Mail)."},"MailRule-mail_rule.read":{"type":"object","description":"Mail-Filterregel (04-04 §6, S4-2) — geordnete Regeln werten Support-Mails vor Ticket-Erzeugung\naus: verwerfen oder Auto-Triage (Kategorie/Priorität/Status/Marke/Tags/Zuweisung). Settings-\npflegbar, Reihenfolge via `sortOrder`.","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"scope":{"enum":["global","brand"],"description":"global|brand.","type":["string","null"]},"brandId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"stopProcessing":{"description":"Beendet bei Treffer die weitere Regel-Auswertung.","type":["boolean","null"]},"matchType":{"enum":["all","any"],"description":"all|any — abgeleitete Anzeige des Bedingungs-Baums (Wurzel `all` vs. `any`). Seit W-AP6\n(Programm 28) aus `conditions` abgeleitet beim Schreiben, nicht separat gepflegt; Baum maßgeblich.","type":["string","null"]},"conditions":{"description":"Bedingungs-Baum im Core-Format der Automation-Engine (W-AP6):\n`{all|any: [{field, op, value}, …]}`, Core-Operatoren (eq/contains/starts_with/ends_with/\nregex/domain_is/…). Ohne Bedingungs-Zeile greift die Regel nie.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"actions":{"description":"Aktionen {drop, dropReason, categoryKey, assigneeId, teamId, priorityKey, statusKey, brandId, tags, markSpam}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}},"required":["name"]},"MailRule-mail_rule.write":{"type":"object","description":"Mail-Filterregel (04-04 §6, S4-2) — geordnete Regeln werten Support-Mails vor Ticket-Erzeugung\naus: verwerfen oder Auto-Triage (Kategorie/Priorität/Status/Marke/Tags/Zuweisung). Settings-\npflegbar, Reihenfolge via `sortOrder`.","required":["name"],"properties":{"name":{"type":["string","null"]},"description":{"type":["string","null"]},"scope":{"enum":["global","brand"],"description":"global|brand.","type":["string","null"]},"brandId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"stopProcessing":{"description":"Beendet bei Treffer die weitere Regel-Auswertung.","type":["boolean","null"]},"matchType":{"enum":["all","any"],"description":"all|any — abgeleitete Anzeige des Bedingungs-Baums (Wurzel `all` vs. `any`). Seit W-AP6\n(Programm 28) aus `conditions` abgeleitet beim Schreiben, nicht separat gepflegt; Baum maßgeblich.","type":["string","null"]},"conditions":{"description":"Bedingungs-Baum im Core-Format der Automation-Engine (W-AP6):\n`{all|any: [{field, op, value}, …]}`, Core-Operatoren (eq/contains/starts_with/ends_with/\nregex/domain_is/…). Ohne Bedingungs-Zeile greift die Regel nie.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"actions":{"description":"Aktionen {drop, dropReason, categoryKey, assigneeId, teamId, priorityKey, statusKey, brandId, tags, markSpam}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"MailRule-mail_rule.write.jsonMergePatch":{"type":"object","description":"Mail-Filterregel (04-04 §6, S4-2) — geordnete Regeln werten Support-Mails vor Ticket-Erzeugung\naus: verwerfen oder Auto-Triage (Kategorie/Priorität/Status/Marke/Tags/Zuweisung). Settings-\npflegbar, Reihenfolge via `sortOrder`.","properties":{"name":{"type":["string","null"]},"description":{"type":["string","null"]},"scope":{"enum":["global","brand"],"description":"global|brand.","type":["string","null"]},"brandId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"stopProcessing":{"description":"Beendet bei Treffer die weitere Regel-Auswertung.","type":["boolean","null"]},"matchType":{"enum":["all","any"],"description":"all|any — abgeleitete Anzeige des Bedingungs-Baums (Wurzel `all` vs. `any`). Seit W-AP6\n(Programm 28) aus `conditions` abgeleitet beim Schreiben, nicht separat gepflegt; Baum maßgeblich.","type":["string","null"]},"conditions":{"description":"Bedingungs-Baum im Core-Format der Automation-Engine (W-AP6):\n`{all|any: [{field, op, value}, …]}`, Core-Operatoren (eq/contains/starts_with/ends_with/\nregex/domain_is/…). Ohne Bedingungs-Zeile greift die Regel nie.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"actions":{"description":"Aktionen {drop, dropReason, categoryKey, assigneeId, teamId, priorityKey, statusKey, brandId, tags, markSpam}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"MailRule.jsonld-mail_rule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"scope":{"enum":["global","brand"],"description":"global|brand.","type":["string","null"]},"brandId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"stopProcessing":{"description":"Beendet bei Treffer die weitere Regel-Auswertung.","type":["boolean","null"]},"matchType":{"enum":["all","any"],"description":"all|any — abgeleitete Anzeige des Bedingungs-Baums (Wurzel `all` vs. `any`). Seit W-AP6\n(Programm 28) aus `conditions` abgeleitet beim Schreiben, nicht separat gepflegt; Baum maßgeblich.","type":["string","null"]},"conditions":{"description":"Bedingungs-Baum im Core-Format der Automation-Engine (W-AP6):\n`{all|any: [{field, op, value}, …]}`, Core-Operatoren (eq/contains/starts_with/ends_with/\nregex/domain_is/…). Ohne Bedingungs-Zeile greift die Regel nie.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"actions":{"description":"Aktionen {drop, dropReason, categoryKey, assigneeId, teamId, priorityKey, statusKey, brandId, tags, markSpam}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}},"required":["name"]}],"description":"Mail-Filterregel (04-04 §6, S4-2) — geordnete Regeln werten Support-Mails vor Ticket-Erzeugung\naus: verwerfen oder Auto-Triage (Kategorie/Priorität/Status/Marke/Tags/Zuweisung). Settings-\npflegbar, Reihenfolge via `sortOrder`."},"MailTemplate-mail_template.read":{"type":"object","description":"- Editierbare, markenabhängige, mehrsprachige Mailvorlage (CRUD + Test-Versand)\n- Sprachvarianten (Betreff + Render-Inhalt) in {@see $variants}\n- brandId = null: globale Standardvorlage; je (key, brandId) höchstens eine isDefault\n- Pflicht-Platzhalter je key aus {@see \\App\\Platform\\Mail\\MailTypeRegistry} (read-only locked).","properties":{"ulid":{"type":["string","null"]},"key":{"description":"Registry-Schlüssel (z. B. `portal.password_reset`) — Pflicht bei Anlage, danach unveränderlich.","type":["string","null"]},"category":{"type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"description":"Marke (null = markenübergreifende Standardvorlage/Fallback).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"mergeFields":{"type":["array","null"],"items":{"type":"string"}},"variants":{"description":"Sprachvarianten: je Eintrag `{locale, subject, mode, designJson, html, text}`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"locked":{"readOnly":true,"description":"Read-only: Pflicht-Platzhalter dieses Typs (aus der Registry) — für die gesperrten Editor-Blöcke.","default":false,"type":"boolean"},"requiredPlaceholders":{"readOnly":true,"type":"array","items":{"type":"string"}},"createdAt":{"type":["string","null"]}},"required":["key","name"]},"MailTemplate-mail_template.write":{"type":"object","description":"- Editierbare, markenabhängige, mehrsprachige Mailvorlage (CRUD + Test-Versand)\n- Sprachvarianten (Betreff + Render-Inhalt) in {@see $variants}\n- brandId = null: globale Standardvorlage; je (key, brandId) höchstens eine isDefault\n- Pflicht-Platzhalter je key aus {@see \\App\\Platform\\Mail\\MailTypeRegistry} (read-only locked).","required":["key","name"],"properties":{"key":{"description":"Registry-Schlüssel (z. B. `portal.password_reset`) — Pflicht bei Anlage, danach unveränderlich.","type":["string","null"]},"category":{"type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"description":"Marke (null = markenübergreifende Standardvorlage/Fallback).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"mergeFields":{"type":["array","null"],"items":{"type":"string"}},"variants":{"description":"Sprachvarianten: je Eintrag `{locale, subject, mode, designJson, html, text}`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"MailTemplate-mail_template.write.jsonMergePatch":{"type":"object","description":"- Editierbare, markenabhängige, mehrsprachige Mailvorlage (CRUD + Test-Versand)\n- Sprachvarianten (Betreff + Render-Inhalt) in {@see $variants}\n- brandId = null: globale Standardvorlage; je (key, brandId) höchstens eine isDefault\n- Pflicht-Platzhalter je key aus {@see \\App\\Platform\\Mail\\MailTypeRegistry} (read-only locked).","properties":{"key":{"description":"Registry-Schlüssel (z. B. `portal.password_reset`) — Pflicht bei Anlage, danach unveränderlich.","type":["string","null"]},"category":{"type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"description":"Marke (null = markenübergreifende Standardvorlage/Fallback).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"mergeFields":{"type":["array","null"],"items":{"type":"string"}},"variants":{"description":"Sprachvarianten: je Eintrag `{locale, subject, mode, designJson, html, text}`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"MailTemplate.MailTemplateTestSendResource-mail_template_testsend.read":{"type":"object","description":"- Editierbare, markenabhängige, mehrsprachige Mailvorlage (CRUD + Test-Versand)\n- Sprachvarianten (Betreff + Render-Inhalt) in {@see $variants}\n- brandId = null: globale Standardvorlage; je (key, brandId) höchstens eine isDefault\n- Pflicht-Platzhalter je key aus {@see \\App\\Platform\\Mail\\MailTypeRegistry} (read-only locked).","properties":{"ulid":{"type":["string","null"]},"toEmail":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"locale":{"description":"Optionales Locale; leer → Marken-Default bzw. 'de'.","type":["string","null"]},"sent":{"default":false,"type":"boolean"},"error":{"type":["string","null"]}},"required":["toEmail"]},"MailTemplate.MailTemplateTestSendResource-mail_template_testsend.write":{"type":"object","description":"- Editierbare, markenabhängige, mehrsprachige Mailvorlage (CRUD + Test-Versand)\n- Sprachvarianten (Betreff + Render-Inhalt) in {@see $variants}\n- brandId = null: globale Standardvorlage; je (key, brandId) höchstens eine isDefault\n- Pflicht-Platzhalter je key aus {@see \\App\\Platform\\Mail\\MailTypeRegistry} (read-only locked).","required":["toEmail"],"properties":{"toEmail":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"locale":{"description":"Optionales Locale; leer → Marken-Default bzw. 'de'.","type":["string","null"]}}},"MailTemplate.MailTemplateTestSendResource.jsonld-mail_template_testsend.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"toEmail":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"locale":{"description":"Optionales Locale; leer → Marken-Default bzw. 'de'.","type":["string","null"]},"sent":{"default":false,"type":"boolean"},"error":{"type":["string","null"]}},"required":["toEmail"]}],"description":"- Editierbare, markenabhängige, mehrsprachige Mailvorlage (CRUD + Test-Versand)\n- Sprachvarianten (Betreff + Render-Inhalt) in {@see $variants}\n- brandId = null: globale Standardvorlage; je (key, brandId) höchstens eine isDefault\n- Pflicht-Platzhalter je key aus {@see \\App\\Platform\\Mail\\MailTypeRegistry} (read-only locked)."},"MailTemplate.jsonld-mail_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"key":{"description":"Registry-Schlüssel (z. B. `portal.password_reset`) — Pflicht bei Anlage, danach unveränderlich.","type":["string","null"]},"category":{"type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"description":"Marke (null = markenübergreifende Standardvorlage/Fallback).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"mergeFields":{"type":["array","null"],"items":{"type":"string"}},"variants":{"description":"Sprachvarianten: je Eintrag `{locale, subject, mode, designJson, html, text}`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"locked":{"readOnly":true,"description":"Read-only: Pflicht-Platzhalter dieses Typs (aus der Registry) — für die gesperrten Editor-Blöcke.","default":false,"type":"boolean"},"requiredPlaceholders":{"readOnly":true,"type":"array","items":{"type":"string"}},"createdAt":{"type":["string","null"]}},"required":["key","name"]}],"description":"- Editierbare, markenabhängige, mehrsprachige Mailvorlage (CRUD + Test-Versand)\n- Sprachvarianten (Betreff + Render-Inhalt) in {@see $variants}\n- brandId = null: globale Standardvorlage; je (key, brandId) höchstens eine isDefault\n- Pflicht-Platzhalter je key aus {@see \\App\\Platform\\Mail\\MailTypeRegistry} (read-only locked)."},"MailTemplatePreview-mail_template_preview.write":{"type":"object","description":"- Live-Vorschau eines (auch ungespeicherten) Mailvorlagen-Inhalts\n- POST: Typ-Key + optionaler Markenbezug + aktuelles Betreff/HTML\n- Ausgabe: gerendertes HTML mit Demo-Platzhaltern, im Marken-Chrome (wie realer Versand).","properties":{"key":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"locale":{"type":["string","null"]},"subject":{"type":["string","null"]},"html":{"type":["string","null"]}}},"MailTemplatePreview.MailTemplatePreviewResult-mail_template_preview.read":{"type":"object","description":"- Live-Vorschau eines (auch ungespeicherten) Mailvorlagen-Inhalts\n- POST: Typ-Key + optionaler Markenbezug + aktuelles Betreff/HTML\n- Ausgabe: gerendertes HTML mit Demo-Platzhaltern, im Marken-Chrome (wie realer Versand).","properties":{"renderedSubject":{"type":"string"},"renderedHtml":{"type":"string"}}},"MailTemplatePreview.MailTemplatePreviewResult.jsonld-mail_template_preview.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"renderedSubject":{"type":"string"},"renderedHtml":{"type":"string"}}}],"description":"- Live-Vorschau eines (auch ungespeicherten) Mailvorlagen-Inhalts\n- POST: Typ-Key + optionaler Markenbezug + aktuelles Betreff/HTML\n- Ausgabe: gerendertes HTML mit Demo-Platzhaltern, im Marken-Chrome (wie realer Versand)."},"MailVariable-mkt_mail_variable.read":{"type":"object","description":"Die Platzhalter, die eine Marketing-Mail WIRKLICH ersetzt (Owner-Weisung 2026-09-03).\n\nWARUM ALS SCHNITTSTELLE und nicht als Liste im Browser: es ist eine Aussage des Servers\ndarüber, was er beim Versand tut. Eine im Frontend gepflegte Zweitliste wäre genau die Stelle,\nan der beide auseinanderlaufen — und der Unterschied fiele im Postfach des Empfängers auf.","properties":{"key":{"description":"Adress-taugliche Kennung — NICHT der Platzhalter selbst.","default":"","type":"string"},"token":{"description":"Der Platzhalter, wie man ihn schreibt — inklusive Klammern.","default":"","type":"string"},"name":{"default":"","type":"string"},"description":{"default":"","type":"string"},"example":{"description":"Ein Beispielwert — er beantwortet „was steht da nachher?\" ohne Testversand.","default":"","type":"string"},"source":{"description":"`recipient` | `contact` | `lead` | `system` — die Antwort auf „warum ist der leer?\".","default":"","type":"string"},"pattern":{"description":"`true` = kein fester Name, sondern eine Form (`cf.<feldname>`).","default":false,"type":"boolean"}}},"MailVariable.jsonld-mkt_mail_variable.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"description":"Adress-taugliche Kennung — NICHT der Platzhalter selbst.","default":"","type":"string"},"token":{"description":"Der Platzhalter, wie man ihn schreibt — inklusive Klammern.","default":"","type":"string"},"name":{"default":"","type":"string"},"description":{"default":"","type":"string"},"example":{"description":"Ein Beispielwert — er beantwortet „was steht da nachher?\" ohne Testversand.","default":"","type":"string"},"source":{"description":"`recipient` | `contact` | `lead` | `system` — die Antwort auf „warum ist der leer?\".","default":"","type":"string"},"pattern":{"description":"`true` = kein fester Name, sondern eine Form (`cf.<feldname>`).","default":false,"type":"boolean"}}}],"description":"Die Platzhalter, die eine Marketing-Mail WIRKLICH ersetzt (Owner-Weisung 2026-09-03).\n\nWARUM ALS SCHNITTSTELLE und nicht als Liste im Browser: es ist eine Aussage des Servers\ndarüber, was er beim Versand tut. Eine im Frontend gepflegte Zweitliste wäre genau die Stelle,\nan der beide auseinanderlaufen — und der Unterschied fiele im Postfach des Empfängers auf."},"MailboxConnection-mailbox_connection.read":{"type":"object","description":"Persönliches Vertriebs-Postfach eines Nutzers (Doc 26 1.1) auf dem Mail-Sync-Kernel. Streng\nself-scoped: der State-Layer bindet jede Operation an den aktuellen Nutzer (nie fremde Postfächer);\nGate `platform.mailbox.manage` ist in jeder Systemrolle. Das Passwort (IMAP) ist write-only und wird\nverschlüsselt gespeichert (CredentialCipher) — nie zurückgegeben.","properties":{"ulid":{"type":["string","null"]},"provider":{"enum":["imap","gmail","microsoft-graph"],"description":"Provider: imap | gmail | microsoft-graph.","default":"imap","type":"string"},"label":{"maxLength":100,"default":"","type":"string"},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"default":"","type":"string"},"brandId":{"description":"Optionaler Default-Marken-Scope.","type":["integer","null"]},"integrationId":{"description":"Google-/Microsoft-Integration (OAuth) — Pflicht für gmail/microsoft-graph.","type":["integer","null"]},"imapHost":{"maxLength":255,"type":["string","null"]},"imapPort":{"default":993,"type":["integer","null"]},"imapEncryption":{"enum":["ssl","tls","none"],"default":"ssl","type":["string","null"]},"imapUsername":{"maxLength":255,"type":["string","null"]},"imapFolder":{"maxLength":255,"default":"INBOX","type":["string","null"]},"hasPassword":{"description":"Read-only: ob ein Passwort hinterlegt ist (IMAP).","default":false,"type":"boolean"},"active":{"default":true,"type":"boolean"},"backfill":{"description":"Einmal-Trigger: Altbestand ab Verbindungszeitpunkt nachziehen.","default":false,"type":"boolean"},"documentIngest":{"description":"Beleg-Eingang: Anhänge dieses Postfachs werden als Beleg-Vorschlag gelesen (Doc 25 AP 5.4).","default":false,"type":"boolean"},"lastSyncedAt":{"type":["string","null"],"format":"date-time"},"lastError":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["provider","label","email"]},"MailboxConnection-mailbox_connection.write":{"type":"object","description":"Persönliches Vertriebs-Postfach eines Nutzers (Doc 26 1.1) auf dem Mail-Sync-Kernel. Streng\nself-scoped: der State-Layer bindet jede Operation an den aktuellen Nutzer (nie fremde Postfächer);\nGate `platform.mailbox.manage` ist in jeder Systemrolle. Das Passwort (IMAP) ist write-only und wird\nverschlüsselt gespeichert (CredentialCipher) — nie zurückgegeben.","required":["provider","label","email"],"properties":{"provider":{"enum":["imap","gmail","microsoft-graph"],"description":"Provider: imap | gmail | microsoft-graph.","default":"imap","type":"string"},"label":{"maxLength":100,"default":"","type":"string"},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"default":"","type":"string"},"brandId":{"description":"Optionaler Default-Marken-Scope.","type":["integer","null"]},"integrationId":{"description":"Google-/Microsoft-Integration (OAuth) — Pflicht für gmail/microsoft-graph.","type":["integer","null"]},"imapHost":{"maxLength":255,"type":["string","null"]},"imapPort":{"default":993,"type":["integer","null"]},"imapEncryption":{"enum":["ssl","tls","none"],"default":"ssl","type":["string","null"]},"imapUsername":{"maxLength":255,"type":["string","null"]},"imapFolder":{"maxLength":255,"default":"INBOX","type":["string","null"]},"password":{"maxLength":500,"description":"IMAP-Passwort — write-only (verschlüsselt gespeichert, nie zurückgegeben).","type":["string","null"]},"active":{"default":true,"type":"boolean"},"backfill":{"description":"Einmal-Trigger: Altbestand ab Verbindungszeitpunkt nachziehen.","default":false,"type":"boolean"},"documentIngest":{"description":"Beleg-Eingang: Anhänge dieses Postfachs werden als Beleg-Vorschlag gelesen (Doc 25 AP 5.4).","default":false,"type":"boolean"}}},"MailboxConnection-mailbox_connection.write.jsonMergePatch":{"type":"object","description":"Persönliches Vertriebs-Postfach eines Nutzers (Doc 26 1.1) auf dem Mail-Sync-Kernel. Streng\nself-scoped: der State-Layer bindet jede Operation an den aktuellen Nutzer (nie fremde Postfächer);\nGate `platform.mailbox.manage` ist in jeder Systemrolle. Das Passwort (IMAP) ist write-only und wird\nverschlüsselt gespeichert (CredentialCipher) — nie zurückgegeben.","properties":{"provider":{"enum":["imap","gmail","microsoft-graph"],"description":"Provider: imap | gmail | microsoft-graph.","default":"imap","type":"string"},"label":{"maxLength":100,"default":"","type":"string"},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"default":"","type":"string"},"brandId":{"description":"Optionaler Default-Marken-Scope.","type":["integer","null"]},"integrationId":{"description":"Google-/Microsoft-Integration (OAuth) — Pflicht für gmail/microsoft-graph.","type":["integer","null"]},"imapHost":{"maxLength":255,"type":["string","null"]},"imapPort":{"default":993,"type":["integer","null"]},"imapEncryption":{"enum":["ssl","tls","none"],"default":"ssl","type":["string","null"]},"imapUsername":{"maxLength":255,"type":["string","null"]},"imapFolder":{"maxLength":255,"default":"INBOX","type":["string","null"]},"password":{"maxLength":500,"description":"IMAP-Passwort — write-only (verschlüsselt gespeichert, nie zurückgegeben).","type":["string","null"]},"active":{"default":true,"type":"boolean"},"backfill":{"description":"Einmal-Trigger: Altbestand ab Verbindungszeitpunkt nachziehen.","default":false,"type":"boolean"},"documentIngest":{"description":"Beleg-Eingang: Anhänge dieses Postfachs werden als Beleg-Vorschlag gelesen (Doc 25 AP 5.4).","default":false,"type":"boolean"}}},"MailboxConnection.jsonld-mailbox_connection.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"provider":{"enum":["imap","gmail","microsoft-graph"],"description":"Provider: imap | gmail | microsoft-graph.","default":"imap","type":"string"},"label":{"maxLength":100,"default":"","type":"string"},"email":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"default":"","type":"string"},"brandId":{"description":"Optionaler Default-Marken-Scope.","type":["integer","null"]},"integrationId":{"description":"Google-/Microsoft-Integration (OAuth) — Pflicht für gmail/microsoft-graph.","type":["integer","null"]},"imapHost":{"maxLength":255,"type":["string","null"]},"imapPort":{"default":993,"type":["integer","null"]},"imapEncryption":{"enum":["ssl","tls","none"],"default":"ssl","type":["string","null"]},"imapUsername":{"maxLength":255,"type":["string","null"]},"imapFolder":{"maxLength":255,"default":"INBOX","type":["string","null"]},"hasPassword":{"description":"Read-only: ob ein Passwort hinterlegt ist (IMAP).","default":false,"type":"boolean"},"active":{"default":true,"type":"boolean"},"backfill":{"description":"Einmal-Trigger: Altbestand ab Verbindungszeitpunkt nachziehen.","default":false,"type":"boolean"},"documentIngest":{"description":"Beleg-Eingang: Anhänge dieses Postfachs werden als Beleg-Vorschlag gelesen (Doc 25 AP 5.4).","default":false,"type":"boolean"},"lastSyncedAt":{"type":["string","null"],"format":"date-time"},"lastError":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}},"required":["provider","label","email"]}],"description":"Persönliches Vertriebs-Postfach eines Nutzers (Doc 26 1.1) auf dem Mail-Sync-Kernel. Streng\nself-scoped: der State-Layer bindet jede Operation an den aktuellen Nutzer (nie fremde Postfächer);\nGate `platform.mailbox.manage` ist in jeder Systemrolle. Das Passwort (IMAP) ist write-only und wird\nverschlüsselt gespeichert (CredentialCipher) — nie zurückgegeben."},"MarketingAdCampaign-mkt_ads.read":{"type":"object","description":"Werbekampagne in einem sozialen Netzwerk (Programm 46 D, ENT-MKT-06).\n\nDREI RECHTE STATT EINEM, und die Trennung ist der ganze Punkt: sehen (`ads.view`), im Entwurf\naendern (`ads.manage`) und SCHARF SCHALTEN (`ads.publish`). Der Unterschied zwischen den\nletzten beiden ist Geld — ein Entwurf kostet nichts, eine aktive Kampagne gibt jeden Tag aus.\nWer Texte schreiben darf, darf deshalb nicht automatisch das Budget freigeben.\n\nWas hier NICHT steht: die Kennzahlen. Klickrate, Kosten je Ergebnis und Rendite kommen aus\n`/report`, weil sie GERECHNET und nicht gespeichert werden — sonst gaebe es zwei Wahrheiten,\nund die gespeicherte waere ab dem ersten Nachtrag falsch.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"platform":{"enum":["meta"],"type":["string","null"]},"objective":{"maxLength":40,"description":"Ziel im Vokabular der Plattform (z. B. `OUTCOME_TRAFFIC`, `OUTCOME_LEADS`).","type":["string","null"]},"status":{"type":["string","null"]},"syncState":{"description":"pending|synced|error|conflict — sagt, ob unser Stand und der der Plattform übereinstimmen.","type":["string","null"]},"syncError":{"type":["string","null"]},"dailyBudgetCent":{"minimum":0,"type":["integer","null"]},"lifetimeBudgetCent":{"minimum":0,"type":["integer","null"]},"budgetCapCent":{"minimum":0,"exclusiveMinimum":0,"description":"Die Obergrenze, die keine Automatik überschreiten darf.","type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"type":["string","null"]},"eurRate":{"description":"Eingefrorener Umrechnungskurs; nach dem Anlegen unveränderlich.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"campaignId":{"type":["integer","null"]},"campaignName":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"groups":{"description":"Anzeigengruppen mitsamt Anzeigen — beim Anlegen und Ändern in EINEM Zug.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"externalRefs":{"description":"Kennungen bei der Plattform (nur lesend) — der Schlüssel gegen doppelte Kampagnen.","type":["object","null"],"additionalProperties":{"type":"string"}},"createdAt":{"type":["string","null"]},"spendCent":{"description":"Summen des laufenden Zeitraums, damit die Liste ohne zweiten Aufruf etwas zeigen kann.","type":["integer","null"]},"conversions":{"type":["integer","null"]}},"required":["name"]},"MarketingAdCampaign-mkt_ads.write":{"type":"object","description":"Werbekampagne in einem sozialen Netzwerk (Programm 46 D, ENT-MKT-06).\n\nDREI RECHTE STATT EINEM, und die Trennung ist der ganze Punkt: sehen (`ads.view`), im Entwurf\naendern (`ads.manage`) und SCHARF SCHALTEN (`ads.publish`). Der Unterschied zwischen den\nletzten beiden ist Geld — ein Entwurf kostet nichts, eine aktive Kampagne gibt jeden Tag aus.\nWer Texte schreiben darf, darf deshalb nicht automatisch das Budget freigeben.\n\nWas hier NICHT steht: die Kennzahlen. Klickrate, Kosten je Ergebnis und Rendite kommen aus\n`/report`, weil sie GERECHNET und nicht gespeichert werden — sonst gaebe es zwei Wahrheiten,\nund die gespeicherte waere ab dem ersten Nachtrag falsch.","required":["name"],"properties":{"name":{"maxLength":200,"type":["string","null"]},"platform":{"enum":["meta"],"type":["string","null"]},"objective":{"maxLength":40,"description":"Ziel im Vokabular der Plattform (z. B. `OUTCOME_TRAFFIC`, `OUTCOME_LEADS`).","type":["string","null"]},"dailyBudgetCent":{"minimum":0,"type":["integer","null"]},"lifetimeBudgetCent":{"minimum":0,"type":["integer","null"]},"budgetCapCent":{"minimum":0,"exclusiveMinimum":0,"description":"Die Obergrenze, die keine Automatik überschreiten darf.","type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"campaignId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"groups":{"description":"Anzeigengruppen mitsamt Anzeigen — beim Anlegen und Ändern in EINEM Zug.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"MarketingAdCampaign-mkt_ads.write.jsonMergePatch":{"type":"object","description":"Werbekampagne in einem sozialen Netzwerk (Programm 46 D, ENT-MKT-06).\n\nDREI RECHTE STATT EINEM, und die Trennung ist der ganze Punkt: sehen (`ads.view`), im Entwurf\naendern (`ads.manage`) und SCHARF SCHALTEN (`ads.publish`). Der Unterschied zwischen den\nletzten beiden ist Geld — ein Entwurf kostet nichts, eine aktive Kampagne gibt jeden Tag aus.\nWer Texte schreiben darf, darf deshalb nicht automatisch das Budget freigeben.\n\nWas hier NICHT steht: die Kennzahlen. Klickrate, Kosten je Ergebnis und Rendite kommen aus\n`/report`, weil sie GERECHNET und nicht gespeichert werden — sonst gaebe es zwei Wahrheiten,\nund die gespeicherte waere ab dem ersten Nachtrag falsch.","properties":{"name":{"maxLength":200,"type":["string","null"]},"platform":{"enum":["meta"],"type":["string","null"]},"objective":{"maxLength":40,"description":"Ziel im Vokabular der Plattform (z. B. `OUTCOME_TRAFFIC`, `OUTCOME_LEADS`).","type":["string","null"]},"dailyBudgetCent":{"minimum":0,"type":["integer","null"]},"lifetimeBudgetCent":{"minimum":0,"type":["integer","null"]},"budgetCapCent":{"minimum":0,"exclusiveMinimum":0,"description":"Die Obergrenze, die keine Automatik überschreiten darf.","type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"campaignId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"groups":{"description":"Anzeigengruppen mitsamt Anzeigen — beim Anlegen und Ändern in EINEM Zug.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"MarketingAdCampaign.jsonld-mkt_ads.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"platform":{"enum":["meta"],"type":["string","null"]},"objective":{"maxLength":40,"description":"Ziel im Vokabular der Plattform (z. B. `OUTCOME_TRAFFIC`, `OUTCOME_LEADS`).","type":["string","null"]},"status":{"type":["string","null"]},"syncState":{"description":"pending|synced|error|conflict — sagt, ob unser Stand und der der Plattform übereinstimmen.","type":["string","null"]},"syncError":{"type":["string","null"]},"dailyBudgetCent":{"minimum":0,"type":["integer","null"]},"lifetimeBudgetCent":{"minimum":0,"type":["integer","null"]},"budgetCapCent":{"minimum":0,"exclusiveMinimum":0,"description":"Die Obergrenze, die keine Automatik überschreiten darf.","type":["integer","null"]},"currency":{"minLength":3,"maxLength":3,"type":["string","null"]},"eurRate":{"description":"Eingefrorener Umrechnungskurs; nach dem Anlegen unveränderlich.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"campaignId":{"type":["integer","null"]},"campaignName":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"groups":{"description":"Anzeigengruppen mitsamt Anzeigen — beim Anlegen und Ändern in EINEM Zug.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"externalRefs":{"description":"Kennungen bei der Plattform (nur lesend) — der Schlüssel gegen doppelte Kampagnen.","type":["object","null"],"additionalProperties":{"type":"string"}},"createdAt":{"type":["string","null"]},"spendCent":{"description":"Summen des laufenden Zeitraums, damit die Liste ohne zweiten Aufruf etwas zeigen kann.","type":["integer","null"]},"conversions":{"type":["integer","null"]}},"required":["name"]}],"description":"Werbekampagne in einem sozialen Netzwerk (Programm 46 D, ENT-MKT-06).\n\nDREI RECHTE STATT EINEM, und die Trennung ist der ganze Punkt: sehen (`ads.view`), im Entwurf\naendern (`ads.manage`) und SCHARF SCHALTEN (`ads.publish`). Der Unterschied zwischen den\nletzten beiden ist Geld — ein Entwurf kostet nichts, eine aktive Kampagne gibt jeden Tag aus.\nWer Texte schreiben darf, darf deshalb nicht automatisch das Budget freigeben.\n\nWas hier NICHT steht: die Kennzahlen. Klickrate, Kosten je Ergebnis und Rendite kommen aus\n`/report`, weil sie GERECHNET und nicht gespeichert werden — sonst gaebe es zwei Wahrheiten,\nund die gespeicherte waere ab dem ersten Nachtrag falsch."},"MarketingAdReport-mkt_ads_report.read":{"type":"object","description":"Auswertung der Werbekampagnen (Programm 46 D).\n\nALLE KENNZAHLEN WERDEN HIER GERECHNET, keine steht in der Datenbank. Das ist kein Sparzwang,\nsondern Richtigkeit: eine gespeicherte Klickrate waere ab dem Moment falsch, in dem das\nNetzwerk seine Zahlen nachtraeglich korrigiert — und das tut es bis zu drei Tage lang. Eine\ngerechnete Kennzahl korrigiert sich mit.\n\nDer Zeitraum ist Pflicht-Vokabular der Anfrage, nicht ein Filter unter vielen: „Kosten je\nAnfrage\" ohne Zeitraum ist keine Zahl, sondern eine Meinung.","properties":{"id":{"default":"report","type":"string"},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"level":{"default":"campaign","type":"string"},"rows":{"description":"Eine Zeile je Kampagne (oder Gruppe/Anzeige) mit Rohwerten UND Kennzahlen.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"totals":{"description":"Summe über alle Zeilen — nicht der Mittelwert der Kennzahlen.","type":"object","additionalProperties":{"type":["string","null"]}}}},"MarketingAdReport.jsonld-mkt_ads_report.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"default":"report","type":"string"},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"level":{"default":"campaign","type":"string"},"rows":{"description":"Eine Zeile je Kampagne (oder Gruppe/Anzeige) mit Rohwerten UND Kennzahlen.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"totals":{"description":"Summe über alle Zeilen — nicht der Mittelwert der Kennzahlen.","type":"object","additionalProperties":{"type":["string","null"]}}}}],"description":"Auswertung der Werbekampagnen (Programm 46 D).\n\nALLE KENNZAHLEN WERDEN HIER GERECHNET, keine steht in der Datenbank. Das ist kein Sparzwang,\nsondern Richtigkeit: eine gespeicherte Klickrate waere ab dem Moment falsch, in dem das\nNetzwerk seine Zahlen nachtraeglich korrigiert — und das tut es bis zu drei Tage lang. Eine\ngerechnete Kennzahl korrigiert sich mit.\n\nDer Zeitraum ist Pflicht-Vokabular der Anfrage, nicht ein Filter unter vielen: „Kosten je\nAnfrage\" ohne Zeitraum ist keine Zahl, sondern eine Meinung."},"MarketingAi-mkt_ai.read":{"type":"object","description":"KI-Assistenz fürs Marketing (04-13 S13-3): Betreffzeilen, Textentwurf, Segment-Idee. POST mit\n`{ \"kind\": \"subject|body|segment|image|campaign|ads_copy|ads_plan|ads_summary\", \"brief\": \"…\" }`. Degradiert ohne aktive KI sauber.\n\n`kind=image` (Programm 46 C1) erzeugt ein BILD und legt es in der Dateiablage ab — die Antwort\ntraegt die Datei-Kennung, nicht die Bytes. Ein eigenes Recht gibt es dafuer bewusst nicht: die\nDeckel sind das KI-Budget und die Drossel, und beide gelten fuer jeden Weg gleichermassen.","properties":{"id":{"type":["string","null"]},"kind":{"description":"subject | body | segment | image | campaign | ads_copy | ads_plan | ads_summary","type":["string","null"]},"brief":{"type":["string","null"]},"suggestions":{"type":["array","null"],"items":{"type":"string"}},"text":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]},"steps":{"description":"Nur `kind=campaign`: der Strecken-Entwurf als Schritt-Liste — er faellt in den Editor, nicht\nin eine laufende Strecke. Leer, wenn das Modell nichts Lesbares geliefert hat.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"size":{"description":"Nur `kind=image`: Kantenmass `1024x1024` | `1024x1536` | `1536x1024`.","type":["string","null"]},"fileUlid":{"description":"Nur `kind=image`: Kennung der abgelegten Bilddatei.","type":["string","null"]},"mimeType":{"description":"Nur `kind=image`: Medientyp der abgelegten Datei.","type":["string","null"]},"variants":{"description":"Nur `kind=ads_copy`: die Text-Varianten einer Anzeige.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"plan":{"description":"Nur `kind=ads_plan`: der Kampagnen-Entwurf als Struktur fuer die Maske.","type":"object","additionalProperties":{"type":["string","null"]}},"error":{"description":"Grund, warum kein Bild entstanden ist (Budget erschoepft, kein Anbieter, Anbieter-Fehler).","type":["string","null"]}}},"MarketingAi-mkt_ai.write":{"type":"object","description":"KI-Assistenz fürs Marketing (04-13 S13-3): Betreffzeilen, Textentwurf, Segment-Idee. POST mit\n`{ \"kind\": \"subject|body|segment|image|campaign|ads_copy|ads_plan|ads_summary\", \"brief\": \"…\" }`. Degradiert ohne aktive KI sauber.\n\n`kind=image` (Programm 46 C1) erzeugt ein BILD und legt es in der Dateiablage ab — die Antwort\ntraegt die Datei-Kennung, nicht die Bytes. Ein eigenes Recht gibt es dafuer bewusst nicht: die\nDeckel sind das KI-Budget und die Drossel, und beide gelten fuer jeden Weg gleichermassen.","properties":{"kind":{"description":"subject | body | segment | image | campaign | ads_copy | ads_plan | ads_summary","type":["string","null"]},"brief":{"type":["string","null"]},"size":{"description":"Nur `kind=image`: Kantenmass `1024x1024` | `1024x1536` | `1536x1024`.","type":["string","null"]}}},"MarketingAi.jsonld-mkt_ai.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"kind":{"description":"subject | body | segment | image | campaign | ads_copy | ads_plan | ads_summary","type":["string","null"]},"brief":{"type":["string","null"]},"suggestions":{"type":["array","null"],"items":{"type":"string"}},"text":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]},"steps":{"description":"Nur `kind=campaign`: der Strecken-Entwurf als Schritt-Liste — er faellt in den Editor, nicht\nin eine laufende Strecke. Leer, wenn das Modell nichts Lesbares geliefert hat.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"size":{"description":"Nur `kind=image`: Kantenmass `1024x1024` | `1024x1536` | `1536x1024`.","type":["string","null"]},"fileUlid":{"description":"Nur `kind=image`: Kennung der abgelegten Bilddatei.","type":["string","null"]},"mimeType":{"description":"Nur `kind=image`: Medientyp der abgelegten Datei.","type":["string","null"]},"variants":{"description":"Nur `kind=ads_copy`: die Text-Varianten einer Anzeige.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"plan":{"description":"Nur `kind=ads_plan`: der Kampagnen-Entwurf als Struktur fuer die Maske.","type":"object","additionalProperties":{"type":["string","null"]}},"error":{"description":"Grund, warum kein Bild entstanden ist (Budget erschoepft, kein Anbieter, Anbieter-Fehler).","type":["string","null"]}}}],"description":"KI-Assistenz fürs Marketing (04-13 S13-3): Betreffzeilen, Textentwurf, Segment-Idee. POST mit\n`{ \"kind\": \"subject|body|segment|image|campaign|ads_copy|ads_plan|ads_summary\", \"brief\": \"…\" }`. Degradiert ohne aktive KI sauber.\n\n`kind=image` (Programm 46 C1) erzeugt ein BILD und legt es in der Dateiablage ab — die Antwort\ntraegt die Datei-Kennung, nicht die Bytes. Ein eigenes Recht gibt es dafuer bewusst nicht: die\nDeckel sind das KI-Budget und die Drossel, und beide gelten fuer jeden Weg gleichermassen."},"MarketingAudience-mkt_audience.read":{"type":"object","description":"Empfängermenge / Segment (04-13 §4.3, AK#5). CRUD + `/preview` zur Live-Größenanzeige.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (nur lesend) — von Dispatch.audienceId referenziert (UI-Segment-\nauswahl). `identifier: false` verhindert Composite-Identifier (IRI).","type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"type":["string","null"]},"filterRule":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"members":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"consentRequired":{"description":"WARNUNG: false deaktiviert das Consent-Gate für dieses Segment — nur mit eigener Rechtsgrundlage (Art. 6 DSGVO/§7 UWG) verwenden. Jeder Versand ohne Gate wird auditiert. Default: true (strikt).","type":["boolean","null"]},"brandId":{"description":"Marke des Segments. Bei kind=dynamic schneidet sie die Empfängermenge: nur Kontakte und Interessenten dieser Marke, dazu alle ohne Marke (die gehören keiner). Leer = alle Empfänger. Bei kind=static bleibt die eingefrorene Mitgliederliste unverändert.","type":["integer","null"]},"estimatedSize":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"MarketingAudience-mkt_audience.write":{"type":"object","description":"Empfängermenge / Segment (04-13 §4.3, AK#5). CRUD + `/preview` zur Live-Größenanzeige.","properties":{"name":{"type":["string","null"]},"kind":{"type":["string","null"]},"filterRule":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"members":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"consentRequired":{"description":"WARNUNG: false deaktiviert das Consent-Gate für dieses Segment — nur mit eigener Rechtsgrundlage (Art. 6 DSGVO/§7 UWG) verwenden. Jeder Versand ohne Gate wird auditiert. Default: true (strikt).","type":["boolean","null"]},"brandId":{"description":"Marke des Segments. Bei kind=dynamic schneidet sie die Empfängermenge: nur Kontakte und Interessenten dieser Marke, dazu alle ohne Marke (die gehören keiner). Leer = alle Empfänger. Bei kind=static bleibt die eingefrorene Mitgliederliste unverändert.","type":["integer","null"]}}},"MarketingAudience-mkt_audience.write.jsonMergePatch":{"type":"object","description":"Empfängermenge / Segment (04-13 §4.3, AK#5). CRUD + `/preview` zur Live-Größenanzeige.","properties":{"name":{"type":["string","null"]},"kind":{"type":["string","null"]},"filterRule":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"members":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"consentRequired":{"description":"WARNUNG: false deaktiviert das Consent-Gate für dieses Segment — nur mit eigener Rechtsgrundlage (Art. 6 DSGVO/§7 UWG) verwenden. Jeder Versand ohne Gate wird auditiert. Default: true (strikt).","type":["boolean","null"]},"brandId":{"description":"Marke des Segments. Bei kind=dynamic schneidet sie die Empfängermenge: nur Kontakte und Interessenten dieser Marke, dazu alle ohne Marke (die gehören keiner). Leer = alle Empfänger. Bei kind=static bleibt die eingefrorene Mitgliederliste unverändert.","type":["integer","null"]}}},"MarketingAudience.jsonld-mkt_audience.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (nur lesend) — von Dispatch.audienceId referenziert (UI-Segment-\nauswahl). `identifier: false` verhindert Composite-Identifier (IRI).","type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"type":["string","null"]},"filterRule":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"members":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"consentRequired":{"description":"WARNUNG: false deaktiviert das Consent-Gate für dieses Segment — nur mit eigener Rechtsgrundlage (Art. 6 DSGVO/§7 UWG) verwenden. Jeder Versand ohne Gate wird auditiert. Default: true (strikt).","type":["boolean","null"]},"brandId":{"description":"Marke des Segments. Bei kind=dynamic schneidet sie die Empfängermenge: nur Kontakte und Interessenten dieser Marke, dazu alle ohne Marke (die gehören keiner). Leer = alle Empfänger. Bei kind=static bleibt die eingefrorene Mitgliederliste unverändert.","type":["integer","null"]},"estimatedSize":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Empfängermenge / Segment (04-13 §4.3, AK#5). CRUD + `/preview` zur Live-Größenanzeige."},"MarketingCampaign-mkt_campaign.read":{"type":"object","description":"Mail-STRECKE (Programm 46 B3, ENT-MKT-03) — die Sicht auf die Metadaten-Huelle.\n\nWas hier NICHT steht, ist Absicht: die SCHRITTE gehoeren der Automation und werden ueber\n`/v1/automations/{ulid}` gepflegt. Zwei Wege, dieselben Schritte zu schreiben, waeren zwei\nValidierungen — und die zweite waere die laschere.\n\n`active` ist LESEND und spiegelt `automation.active`. Ein eigener Schalter waere ein zweiter\nZustand fuer dieselbe Sache; der eine Tag, an dem beide auseinanderfallen, ist der Tag, an dem\neine abgeschaltete Strecke weiter versendet.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK — mitgeliefert, weil andere Zeilen sie als Fremdverweis tragen.","type":["integer","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"automationUlid":{"description":"ULID der ausfuehrenden Automation (nur lesend — die Zuordnung entsteht beim Anlegen).","type":["string","null"]},"active":{"description":"Aktiv-Zustand; gespiegelt aus der Automation (dort schalten).","default":false,"type":"boolean"},"entryMode":{"description":"per_recipient (Strecke, Lauf je Empfänger) | bulk (Newsletter, ein Versandlauf). Nur beim Anlegen setzbar.","type":["string","null"]},"sendAt":{"description":"Versand-Zeitpunkt der bulk-Kampagne (ISO 8601). Der Relativ-Trigger der Automation liest ihn.","type":["string","null"]},"utmCampaign":{"description":"UTM-Name fuer Attribution; leer = kein UTM-Bezug.","type":["string","null"]},"goal":{"description":"Wofuer die Kampagne laeuft, in einem Satz.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"ownerId":{"type":["integer","null"]},"derivedStatus":{"description":"Abgeleitet aus Automation-Zustand, sendAt und endsAt: draft | scheduled | running | done.","type":["string","null"]},"audienceId":{"type":["integer","null"]},"entryTag":{"description":"Schlagwort, dessen Vergabe sofort aufnimmt (die Zielgruppe wird nur täglich abgeklappert).","type":["string","null"]},"reentryDays":{"description":"Frist bis zum Wiedereintritt in Tagen; 0 = nie erneut.","type":["integer","null"]},"exitRules":{"description":"Zusaetzliche Ausstiegs-Regeln (Bedingungsbaum). Der Ausstieg bei ABMELDUNG steht bewusst\nNICHT hier — er ist hart und nicht konfigurierbar (ENT-MKT-03).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]},"stepCount":{"description":"Anzahl der Schritte der Automation (Listen-Auskunft ohne zweiten Abruf).","type":["integer","null"]},"createdAt":{"type":["string","null"]},"enrolled":{"description":"Nur bei `/scan`: wie viele Empfänger tatsächlich NEU aufgenommen wurden.","type":["integer","null"]},"stats":{"description":"Nur über /stats befüllt: Zahlen je Schritt-Position plus Lauf-Zustände.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"MarketingCampaign-mkt_campaign.write":{"type":"object","description":"Mail-STRECKE (Programm 46 B3, ENT-MKT-03) — die Sicht auf die Metadaten-Huelle.\n\nWas hier NICHT steht, ist Absicht: die SCHRITTE gehoeren der Automation und werden ueber\n`/v1/automations/{ulid}` gepflegt. Zwei Wege, dieselben Schritte zu schreiben, waeren zwei\nValidierungen — und die zweite waere die laschere.\n\n`active` ist LESEND und spiegelt `automation.active`. Ein eigener Schalter waere ein zweiter\nZustand fuer dieselbe Sache; der eine Tag, an dem beide auseinanderfallen, ist der Tag, an dem\neine abgeschaltete Strecke weiter versendet.","properties":{"name":{"type":["string","null"]},"description":{"type":["string","null"]},"entryMode":{"description":"per_recipient (Strecke, Lauf je Empfänger) | bulk (Newsletter, ein Versandlauf). Nur beim Anlegen setzbar.","type":["string","null"]},"sendAt":{"description":"Versand-Zeitpunkt der bulk-Kampagne (ISO 8601). Der Relativ-Trigger der Automation liest ihn.","type":["string","null"]},"utmCampaign":{"description":"UTM-Name fuer Attribution; leer = kein UTM-Bezug.","type":["string","null"]},"goal":{"description":"Wofuer die Kampagne laeuft, in einem Satz.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"ownerId":{"type":["integer","null"]},"audienceId":{"type":["integer","null"]},"entryTag":{"description":"Schlagwort, dessen Vergabe sofort aufnimmt (die Zielgruppe wird nur täglich abgeklappert).","type":["string","null"]},"reentryDays":{"description":"Frist bis zum Wiedereintritt in Tagen; 0 = nie erneut.","type":["integer","null"]},"exitRules":{"description":"Zusaetzliche Ausstiegs-Regeln (Bedingungsbaum). Der Ausstieg bei ABMELDUNG steht bewusst\nNICHT hier — er ist hart und nicht konfigurierbar (ENT-MKT-03).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]}}},"MarketingCampaign-mkt_campaign.write.jsonMergePatch":{"type":"object","description":"Mail-STRECKE (Programm 46 B3, ENT-MKT-03) — die Sicht auf die Metadaten-Huelle.\n\nWas hier NICHT steht, ist Absicht: die SCHRITTE gehoeren der Automation und werden ueber\n`/v1/automations/{ulid}` gepflegt. Zwei Wege, dieselben Schritte zu schreiben, waeren zwei\nValidierungen — und die zweite waere die laschere.\n\n`active` ist LESEND und spiegelt `automation.active`. Ein eigener Schalter waere ein zweiter\nZustand fuer dieselbe Sache; der eine Tag, an dem beide auseinanderfallen, ist der Tag, an dem\neine abgeschaltete Strecke weiter versendet.","properties":{"name":{"type":["string","null"]},"description":{"type":["string","null"]},"entryMode":{"description":"per_recipient (Strecke, Lauf je Empfänger) | bulk (Newsletter, ein Versandlauf). Nur beim Anlegen setzbar.","type":["string","null"]},"sendAt":{"description":"Versand-Zeitpunkt der bulk-Kampagne (ISO 8601). Der Relativ-Trigger der Automation liest ihn.","type":["string","null"]},"utmCampaign":{"description":"UTM-Name fuer Attribution; leer = kein UTM-Bezug.","type":["string","null"]},"goal":{"description":"Wofuer die Kampagne laeuft, in einem Satz.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"ownerId":{"type":["integer","null"]},"audienceId":{"type":["integer","null"]},"entryTag":{"description":"Schlagwort, dessen Vergabe sofort aufnimmt (die Zielgruppe wird nur täglich abgeklappert).","type":["string","null"]},"reentryDays":{"description":"Frist bis zum Wiedereintritt in Tagen; 0 = nie erneut.","type":["integer","null"]},"exitRules":{"description":"Zusaetzliche Ausstiegs-Regeln (Bedingungsbaum). Der Ausstieg bei ABMELDUNG steht bewusst\nNICHT hier — er ist hart und nicht konfigurierbar (ENT-MKT-03).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]}}},"MarketingCampaign.jsonld-mkt_campaign.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK — mitgeliefert, weil andere Zeilen sie als Fremdverweis tragen.","type":["integer","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"automationUlid":{"description":"ULID der ausfuehrenden Automation (nur lesend — die Zuordnung entsteht beim Anlegen).","type":["string","null"]},"active":{"description":"Aktiv-Zustand; gespiegelt aus der Automation (dort schalten).","default":false,"type":"boolean"},"entryMode":{"description":"per_recipient (Strecke, Lauf je Empfänger) | bulk (Newsletter, ein Versandlauf). Nur beim Anlegen setzbar.","type":["string","null"]},"sendAt":{"description":"Versand-Zeitpunkt der bulk-Kampagne (ISO 8601). Der Relativ-Trigger der Automation liest ihn.","type":["string","null"]},"utmCampaign":{"description":"UTM-Name fuer Attribution; leer = kein UTM-Bezug.","type":["string","null"]},"goal":{"description":"Wofuer die Kampagne laeuft, in einem Satz.","type":["string","null"]},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"ownerId":{"type":["integer","null"]},"derivedStatus":{"description":"Abgeleitet aus Automation-Zustand, sendAt und endsAt: draft | scheduled | running | done.","type":["string","null"]},"audienceId":{"type":["integer","null"]},"entryTag":{"description":"Schlagwort, dessen Vergabe sofort aufnimmt (die Zielgruppe wird nur täglich abgeklappert).","type":["string","null"]},"reentryDays":{"description":"Frist bis zum Wiedereintritt in Tagen; 0 = nie erneut.","type":["integer","null"]},"exitRules":{"description":"Zusaetzliche Ausstiegs-Regeln (Bedingungsbaum). Der Ausstieg bei ABMELDUNG steht bewusst\nNICHT hier — er ist hart und nicht konfigurierbar (ENT-MKT-03).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]},"stepCount":{"description":"Anzahl der Schritte der Automation (Listen-Auskunft ohne zweiten Abruf).","type":["integer","null"]},"createdAt":{"type":["string","null"]},"enrolled":{"description":"Nur bei `/scan`: wie viele Empfänger tatsächlich NEU aufgenommen wurden.","type":["integer","null"]},"stats":{"description":"Nur über /stats befüllt: Zahlen je Schritt-Position plus Lauf-Zustände.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"Mail-STRECKE (Programm 46 B3, ENT-MKT-03) — die Sicht auf die Metadaten-Huelle.\n\nWas hier NICHT steht, ist Absicht: die SCHRITTE gehoeren der Automation und werden ueber\n`/v1/automations/{ulid}` gepflegt. Zwei Wege, dieselben Schritte zu schreiben, waeren zwei\nValidierungen — und die zweite waere die laschere.\n\n`active` ist LESEND und spiegelt `automation.active`. Ein eigener Schalter waere ein zweiter\nZustand fuer dieselbe Sache; der eine Tag, an dem beide auseinanderfallen, ist der Tag, an dem\neine abgeschaltete Strecke weiter versendet."},"MarketingCampaignEnroll-mkt_campaign_enroll.read":{"type":"object","description":"Empfaenger von Hand in eine Strecke aufnehmen (Programm 46 B4).\n\nDer Weg ist bewusst DERSELBE wie der automatische: es wird ein Aufnahme-Ereignis ausgeloest,\nkein Lauf von Hand gestartet. Ein zweiter Startweg haette die Dedupe-Zusage umgangen — und\ngenau die haelt einen Empfaenger davon ab, dieselbe Strecke zweimal zu bekommen.","properties":{"ulid":{"type":["string","null"]},"emails":{"description":"Adressen der Aufzunehmenden (eine oder mehrere).","type":["array","null"],"items":{"type":"string"}},"enrolled":{"description":"Anzahl ausgelöster Aufnahmen (gesperrte/ungültige Adressen zählen nicht mit).","default":0,"type":"integer"},"skipped":{"description":"Anzahl übersprungener Adressen (Sperrliste, ungültig, Strecke inaktiv).","default":0,"type":"integer"}}},"MarketingCampaignEnroll-mkt_campaign_enroll.write":{"type":"object","description":"Empfaenger von Hand in eine Strecke aufnehmen (Programm 46 B4).\n\nDer Weg ist bewusst DERSELBE wie der automatische: es wird ein Aufnahme-Ereignis ausgeloest,\nkein Lauf von Hand gestartet. Ein zweiter Startweg haette die Dedupe-Zusage umgangen — und\ngenau die haelt einen Empfaenger davon ab, dieselbe Strecke zweimal zu bekommen.","properties":{"emails":{"description":"Adressen der Aufzunehmenden (eine oder mehrere).","type":["array","null"],"items":{"type":"string"}},"enrolled":{"description":"Anzahl ausgelöster Aufnahmen (gesperrte/ungültige Adressen zählen nicht mit).","default":0,"type":"integer"},"skipped":{"description":"Anzahl übersprungener Adressen (Sperrliste, ungültig, Strecke inaktiv).","default":0,"type":"integer"}}},"MarketingCampaignEnroll.jsonld-mkt_campaign_enroll.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"emails":{"description":"Adressen der Aufzunehmenden (eine oder mehrere).","type":["array","null"],"items":{"type":"string"}},"enrolled":{"description":"Anzahl ausgelöster Aufnahmen (gesperrte/ungültige Adressen zählen nicht mit).","default":0,"type":"integer"},"skipped":{"description":"Anzahl übersprungener Adressen (Sperrliste, ungültig, Strecke inaktiv).","default":0,"type":"integer"}}}],"description":"Empfaenger von Hand in eine Strecke aufnehmen (Programm 46 B4).\n\nDer Weg ist bewusst DERSELBE wie der automatische: es wird ein Aufnahme-Ereignis ausgeloest,\nkein Lauf von Hand gestartet. Ein zweiter Startweg haette die Dedupe-Zusage umgangen — und\ngenau die haelt einen Empfaenger davon ab, dieselbe Strecke zweimal zu bekommen."},"MarketingCampaignMessageTest-mkt_campaign_msgtest.read":{"type":"object","description":"Testmail EINER Nachricht der Strecke (Programm 47 Stufe 47-2).\n\nWARUM AN DER NACHRICHT und nicht an der Strecke: wer die vierte Mail schreibt, will die vierte\nMail sehen. Ein Test, der immer die erste schickt, beantwortet die Frage nicht — und einen\nganzen Streckenlauf abzuwarten dauert Tage.\n\nDie Nachricht wird ueber ihre POSITION angesprochen. Eine Nachricht IST ein Automations-Schritt\nund hat bewusst keine zweite Wahrheit daneben (ENT-MKT-12); die Position ist damit die einzige\nAdresse, die es gibt — dieselbe, an der auch Sprungziele und Schritt-Zahlen haengen.\n\nEIGENE Ressource statt einer Zusatz-Operation an der Strecke (Muster {@see CampaignEnrollResource}):\nFelder, die es nur fuer EINE Operation gibt, an der Haupt-Ressource zu fuehren macht deren\nSchreib-Vertrag unscharf — und in OpenAPI/MCP taucht dann bei jedem PATCH ein `testEmail` auf,\ndas dort nichts bewirkt.","properties":{"ulid":{"type":["string","null"]},"stepPosition":{"minimum":0,"exclusiveMinimum":0,"description":"Position des Nachrichten-Schritts (dieselbe, die die Strecken-Ansicht zeigt).","type":["integer","null"]},"testEmail":{"format":"email","description":"Empfänger der Testmail.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"locale":{"description":"Sprache, in der gerendert wird; leer = Standardsprache der Nachricht.","type":["string","null"]}}},"MarketingCampaignMessageTest-mkt_campaign_msgtest.write":{"type":"object","description":"Testmail EINER Nachricht der Strecke (Programm 47 Stufe 47-2).\n\nWARUM AN DER NACHRICHT und nicht an der Strecke: wer die vierte Mail schreibt, will die vierte\nMail sehen. Ein Test, der immer die erste schickt, beantwortet die Frage nicht — und einen\nganzen Streckenlauf abzuwarten dauert Tage.\n\nDie Nachricht wird ueber ihre POSITION angesprochen. Eine Nachricht IST ein Automations-Schritt\nund hat bewusst keine zweite Wahrheit daneben (ENT-MKT-12); die Position ist damit die einzige\nAdresse, die es gibt — dieselbe, an der auch Sprungziele und Schritt-Zahlen haengen.\n\nEIGENE Ressource statt einer Zusatz-Operation an der Strecke (Muster {@see CampaignEnrollResource}):\nFelder, die es nur fuer EINE Operation gibt, an der Haupt-Ressource zu fuehren macht deren\nSchreib-Vertrag unscharf — und in OpenAPI/MCP taucht dann bei jedem PATCH ein `testEmail` auf,\ndas dort nichts bewirkt.","properties":{"stepPosition":{"minimum":0,"exclusiveMinimum":0,"description":"Position des Nachrichten-Schritts (dieselbe, die die Strecken-Ansicht zeigt).","type":["integer","null"]},"testEmail":{"format":"email","description":"Empfänger der Testmail.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"locale":{"description":"Sprache, in der gerendert wird; leer = Standardsprache der Nachricht.","type":["string","null"]}}},"MarketingCampaignMessageTest.jsonld-mkt_campaign_msgtest.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"stepPosition":{"minimum":0,"exclusiveMinimum":0,"description":"Position des Nachrichten-Schritts (dieselbe, die die Strecken-Ansicht zeigt).","type":["integer","null"]},"testEmail":{"format":"email","description":"Empfänger der Testmail.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"locale":{"description":"Sprache, in der gerendert wird; leer = Standardsprache der Nachricht.","type":["string","null"]}}}],"description":"Testmail EINER Nachricht der Strecke (Programm 47 Stufe 47-2).\n\nWARUM AN DER NACHRICHT und nicht an der Strecke: wer die vierte Mail schreibt, will die vierte\nMail sehen. Ein Test, der immer die erste schickt, beantwortet die Frage nicht — und einen\nganzen Streckenlauf abzuwarten dauert Tage.\n\nDie Nachricht wird ueber ihre POSITION angesprochen. Eine Nachricht IST ein Automations-Schritt\nund hat bewusst keine zweite Wahrheit daneben (ENT-MKT-12); die Position ist damit die einzige\nAdresse, die es gibt — dieselbe, an der auch Sprungziele und Schritt-Zahlen haengen.\n\nEIGENE Ressource statt einer Zusatz-Operation an der Strecke (Muster {@see CampaignEnrollResource}):\nFelder, die es nur fuer EINE Operation gibt, an der Haupt-Ressource zu fuehren macht deren\nSchreib-Vertrag unscharf — und in OpenAPI/MCP taucht dann bei jedem PATCH ein `testEmail` auf,\ndas dort nichts bewirkt."},"MarketingConsent-mkt_consent.read":{"type":"object","description":"Einwilligungs-Verwaltung (04-13 §4.2, §5). Read + manuelle Erfassung (dokumentierter Nachweis) +\n`/withdraw` (Abmeldung → Suppression) + `/resend-doi` (DOI-Mail erneut versenden, nur `pending`).","properties":{"ulid":{"type":["string","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"channel":{"enum":["email","phone","post"],"type":["string","null"]},"purpose":{"type":["string","null"]},"status":{"type":["string","null"]},"source":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"contactRef":{"type":["string","null"]},"confirmedAt":{"type":["string","null"]},"withdrawnAt":{"type":["string","null"]},"ipHash":{"description":"DSGVO-Nachweis: gehashte IP der Einwilligung (read-only).","type":["string","null"]},"doiSentAt":{"description":"Zeitpunkt des DOI-Mailversands (read-only).","type":["string","null"]},"expiresAt":{"description":"Frist für die DOI-Bestätigung (read-only).","type":["string","null"]},"proofText":{"type":["string","null"]},"createdAt":{"type":["string","null"]}},"required":["email"]},"MarketingConsent-mkt_consent.write":{"type":"object","description":"Einwilligungs-Verwaltung (04-13 §4.2, §5). Read + manuelle Erfassung (dokumentierter Nachweis) +\n`/withdraw` (Abmeldung → Suppression) + `/resend-doi` (DOI-Mail erneut versenden, nur `pending`).","required":["email"],"properties":{"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"channel":{"enum":["email","phone","post"],"type":["string","null"]},"purpose":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"proofText":{"type":["string","null"]},"alreadyConfirmed":{"description":"Nur beim Anlegen: dokumentierter Nachweis vorhanden → direkte Bestätigung ohne erneutes DOI.","type":["boolean","null"]}}},"MarketingConsent.jsonld-mkt_consent.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"channel":{"enum":["email","phone","post"],"type":["string","null"]},"purpose":{"type":["string","null"]},"status":{"type":["string","null"]},"source":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"contactRef":{"type":["string","null"]},"confirmedAt":{"type":["string","null"]},"withdrawnAt":{"type":["string","null"]},"ipHash":{"description":"DSGVO-Nachweis: gehashte IP der Einwilligung (read-only).","type":["string","null"]},"doiSentAt":{"description":"Zeitpunkt des DOI-Mailversands (read-only).","type":["string","null"]},"expiresAt":{"description":"Frist für die DOI-Bestätigung (read-only).","type":["string","null"]},"proofText":{"type":["string","null"]},"createdAt":{"type":["string","null"]}},"required":["email"]}],"description":"Einwilligungs-Verwaltung (04-13 §4.2, §5). Read + manuelle Erfassung (dokumentierter Nachweis) +\n`/withdraw` (Abmeldung → Suppression) + `/resend-doi` (DOI-Mail erneut versenden, nur `pending`)."},"MarketingDashboard-mkt_dashboard.read":{"type":"object","description":"Marketing-Dashboard-Kacheln (04-13 §5): neue Submissions, aktive Kampagnen, ausstehende Consents,\nletzte Versände, Leads-je-Quelle — read-only Aggregat. Markenscope-gefiltert (04-13 §7).","properties":{"id":{"type":["string","null"]},"newSubmissionsCount":{"description":"Eingegangene, noch nicht übernommene Submissions (status=received).","default":0,"type":"integer"},"activeCampaignsCount":{"description":"Laufende Kampagnen (status=active).","default":0,"type":"integer"},"pendingConsentsCount":{"description":"Offene Double-Opt-In-Einwilligungen (status=pending).","default":0,"type":"integer"},"recentSends":{"description":"Die jüngsten Versände (status sent/sending) mit Basis-Statistik.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"object","additionalProperties":{"type":"integer"}},{"type":"string"},{"type":"null"}]}}},"leadsBySource":{"description":"Leads je Quelle (First-Touch-Attribution-Rollup, wiederverwendet aus dem Akquise-Report).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"mailerConfigured":{"description":"False ohne konfigurierten Versand-Provider (Postmark server_token) — Versand schlägt dann\nfail-loud fehl (Audit R18 #66); UI zeigt Konfigurations-Hinweis.","default":true,"type":"boolean"},"capabilities":{"description":"Funktionsstand je Faehigkeit — je Eintrag `{key, state, detail}`, `state` aus\n`ok|warning|missing|off` (Programm 47 Stufe 47-9).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"MarketingDashboard.jsonld-mkt_dashboard.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"newSubmissionsCount":{"description":"Eingegangene, noch nicht übernommene Submissions (status=received).","default":0,"type":"integer"},"activeCampaignsCount":{"description":"Laufende Kampagnen (status=active).","default":0,"type":"integer"},"pendingConsentsCount":{"description":"Offene Double-Opt-In-Einwilligungen (status=pending).","default":0,"type":"integer"},"recentSends":{"description":"Die jüngsten Versände (status sent/sending) mit Basis-Statistik.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"object","additionalProperties":{"type":"integer"}},{"type":"string"},{"type":"null"}]}}},"leadsBySource":{"description":"Leads je Quelle (First-Touch-Attribution-Rollup, wiederverwendet aus dem Akquise-Report).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"mailerConfigured":{"description":"False ohne konfigurierten Versand-Provider (Postmark server_token) — Versand schlägt dann\nfail-loud fehl (Audit R18 #66); UI zeigt Konfigurations-Hinweis.","default":true,"type":"boolean"},"capabilities":{"description":"Funktionsstand je Faehigkeit — je Eintrag `{key, state, detail}`, `state` aus\n`ok|warning|missing|off` (Programm 47 Stufe 47-9).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Marketing-Dashboard-Kacheln (04-13 §5): neue Submissions, aktive Kampagnen, ausstehende Consents,\nletzte Versände, Leads-je-Quelle — read-only Aggregat. Markenscope-gefiltert (04-13 §7)."},"MarketingDispatch-mkt_ec.read":{"type":"object","description":"Newsletter-/Kampagnen-Versand (04-13 §4.3, §9). CRUD + `/schedule`, `/send-now` (async,\ngedrosselt), `/test`. Versand erhöht geschützt (`marketing.campaign.send`).","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"campaignId":{"type":["integer","null"]},"campaignName":{"description":"Anzeigename der referenzierten Kampagne (nur lesend, vom Provider aufgelöst).","type":["string","null"]},"subject":{"maxLength":255,"type":["string","null"]},"subjectVariantB":{"maxLength":255,"type":["string","null"]},"abConfig":{"description":"Split-Test: enabled, testShare (10–50), winnerMetric (open|click), decisionAfterHours (1–168). Der Gewinner ist server-eigen.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"templateId":{"type":["integer","null"]},"templateName":{"description":"Anzeigename der referenzierten E-Mail-Vorlage (nur lesend, vom Provider aufgelöst).","type":["string","null"]},"fromBrandId":{"type":["integer","null"]},"audienceId":{"type":["integer","null"]},"audienceName":{"description":"Anzeigename des referenzierten Segments (nur lesend, vom Provider aufgelöst).","type":["string","null"]},"audienceEstimatedSize":{"description":"Geschätzte Größe des referenzierten Segments (nur lesend, vom Provider aufgelöst).","type":["integer","null"]},"scheduledAt":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"status":{"type":["string","null"]},"stats":{"type":["object","null"],"additionalProperties":{"type":"integer"}},"contentBlocks":{"description":"Kampagnen-Inhalte je Slot der Vorlage; nur in draft/scheduled änderbar.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]}}},"MarketingDispatch-mkt_ec.write":{"type":"object","description":"Newsletter-/Kampagnen-Versand (04-13 §4.3, §9). CRUD + `/schedule`, `/send-now` (async,\ngedrosselt), `/test`. Versand erhöht geschützt (`marketing.campaign.send`).","properties":{"name":{"maxLength":200,"type":["string","null"]},"campaignId":{"type":["integer","null"]},"subject":{"maxLength":255,"type":["string","null"]},"subjectVariantB":{"maxLength":255,"type":["string","null"]},"abConfig":{"description":"Split-Test: enabled, testShare (10–50), winnerMetric (open|click), decisionAfterHours (1–168). Der Gewinner ist server-eigen.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"templateId":{"type":["integer","null"]},"fromBrandId":{"type":["integer","null"]},"audienceId":{"type":["integer","null"]},"scheduledAt":{"type":["string","null"]},"contentBlocks":{"description":"Kampagnen-Inhalte je Slot der Vorlage; nur in draft/scheduled änderbar.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"testEmail":{"format":"email","description":"Nur für `/test`: Empfänger der Testmail.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]}}},"MarketingDispatch-mkt_ec.write.jsonMergePatch":{"type":"object","description":"Newsletter-/Kampagnen-Versand (04-13 §4.3, §9). CRUD + `/schedule`, `/send-now` (async,\ngedrosselt), `/test`. Versand erhöht geschützt (`marketing.campaign.send`).","properties":{"name":{"maxLength":200,"type":["string","null"]},"campaignId":{"type":["integer","null"]},"subject":{"maxLength":255,"type":["string","null"]},"subjectVariantB":{"maxLength":255,"type":["string","null"]},"abConfig":{"description":"Split-Test: enabled, testShare (10–50), winnerMetric (open|click), decisionAfterHours (1–168). Der Gewinner ist server-eigen.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"templateId":{"type":["integer","null"]},"fromBrandId":{"type":["integer","null"]},"audienceId":{"type":["integer","null"]},"scheduledAt":{"type":["string","null"]},"contentBlocks":{"description":"Kampagnen-Inhalte je Slot der Vorlage; nur in draft/scheduled änderbar.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"testEmail":{"format":"email","description":"Nur für `/test`: Empfänger der Testmail.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]}}},"MarketingDispatch.jsonld-mkt_ec.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"campaignId":{"type":["integer","null"]},"campaignName":{"description":"Anzeigename der referenzierten Kampagne (nur lesend, vom Provider aufgelöst).","type":["string","null"]},"subject":{"maxLength":255,"type":["string","null"]},"subjectVariantB":{"maxLength":255,"type":["string","null"]},"abConfig":{"description":"Split-Test: enabled, testShare (10–50), winnerMetric (open|click), decisionAfterHours (1–168). Der Gewinner ist server-eigen.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"templateId":{"type":["integer","null"]},"templateName":{"description":"Anzeigename der referenzierten E-Mail-Vorlage (nur lesend, vom Provider aufgelöst).","type":["string","null"]},"fromBrandId":{"type":["integer","null"]},"audienceId":{"type":["integer","null"]},"audienceName":{"description":"Anzeigename des referenzierten Segments (nur lesend, vom Provider aufgelöst).","type":["string","null"]},"audienceEstimatedSize":{"description":"Geschätzte Größe des referenzierten Segments (nur lesend, vom Provider aufgelöst).","type":["integer","null"]},"scheduledAt":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"status":{"type":["string","null"]},"stats":{"type":["object","null"],"additionalProperties":{"type":"integer"}},"contentBlocks":{"description":"Kampagnen-Inhalte je Slot der Vorlage; nur in draft/scheduled änderbar.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]}}}],"description":"Newsletter-/Kampagnen-Versand (04-13 §4.3, §9). CRUD + `/schedule`, `/send-now` (async,\ngedrosselt), `/test`. Versand erhöht geschützt (`marketing.campaign.send`)."},"MarketingEmailEvent-mkt_event.read":{"type":"object","description":"Tracking-Ereignisse eines Versands (04-13 §4.3). Read-only, gefiltert über den PFLICHT-Parameter\n`?dispatchId=` (deklariert, damit Automation/MCP ihn kennen — Audit R28/APIUI-02).","properties":{"ulid":{"type":["string","null"]},"dispatchId":{"type":["integer","null"]},"contactRef":{"type":["string","null"]},"type":{"type":["string","null"]},"url":{"type":["string","null"]},"occurredAt":{"type":["string","null"]}}},"MarketingEmailEvent.jsonld-mkt_event.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"dispatchId":{"type":["integer","null"]},"contactRef":{"type":["string","null"]},"type":{"type":["string","null"]},"url":{"type":["string","null"]},"occurredAt":{"type":["string","null"]}}}],"description":"Tracking-Ereignisse eines Versands (04-13 §4.3). Read-only, gefiltert über den PFLICHT-Parameter\n`?dispatchId=` (deklariert, damit Automation/MCP ihn kennen — Audit R28/APIUI-02)."},"MarketingEmailTemplate-mkt_template.read":{"type":"object","description":"Wiederverwendbare E-Mail-Vorlage in Marken-CI (04-13 §3, S13-2). CRUD; Abmeldeblock ist Pflicht.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (nur lesend) — von Dispatch.templateId und\n`marketing_send_message`-Automation-Schritten referenziert (UI-Vorlagenauswahl).","type":["integer","null"]},"name":{"type":["string","null"]},"subject":{"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"bodyText":{"type":["string","null"]},"mergeFields":{"type":["array","null"],"items":{"type":"string"}},"unsubscribeBlock":{"type":["string","null"]},"translations":{"description":"Pro-Sprache-Übersetzungen (Empfängersprache): Map locale → {subject, bodyHtml, bodyText}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}},"contentMode":{"description":"Bearbeitungs-Art: html (Vorgabe) oder visual (Baustein-Baum).","type":["string","null"]},"design":{"description":"Baustein-Baum der Vorlage (Format mail-blocks/1); im visuellen Modus die Wahrheit, bodyHtml ist sein Erzeugnis.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"previewSubject":{"description":"Gerenderter Betreff (nur über /preview befüllt).","type":["string","null"]},"previewHtml":{"description":"Gerenderter HTML-Body (nur über /preview befüllt).","type":["string","null"]},"previewText":{"description":"Gerenderter Text-Body (nur über /preview befüllt).","type":["string","null"]}}},"MarketingEmailTemplate-mkt_template.write":{"type":"object","description":"Wiederverwendbare E-Mail-Vorlage in Marken-CI (04-13 §3, S13-2). CRUD; Abmeldeblock ist Pflicht.","properties":{"name":{"type":["string","null"]},"subject":{"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"bodyText":{"type":["string","null"]},"mergeFields":{"type":["array","null"],"items":{"type":"string"}},"unsubscribeBlock":{"type":["string","null"]},"translations":{"description":"Pro-Sprache-Übersetzungen (Empfängersprache): Map locale → {subject, bodyHtml, bodyText}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}},"contentMode":{"description":"Bearbeitungs-Art: html (Vorgabe) oder visual (Baustein-Baum).","type":["string","null"]},"design":{"description":"Baustein-Baum der Vorlage (Format mail-blocks/1); im visuellen Modus die Wahrheit, bodyHtml ist sein Erzeugnis.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]}}},"MarketingEmailTemplate-mkt_template.write.jsonMergePatch":{"type":"object","description":"Wiederverwendbare E-Mail-Vorlage in Marken-CI (04-13 §3, S13-2). CRUD; Abmeldeblock ist Pflicht.","properties":{"name":{"type":["string","null"]},"subject":{"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"bodyText":{"type":["string","null"]},"mergeFields":{"type":["array","null"],"items":{"type":"string"}},"unsubscribeBlock":{"type":["string","null"]},"translations":{"description":"Pro-Sprache-Übersetzungen (Empfängersprache): Map locale → {subject, bodyHtml, bodyText}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}},"contentMode":{"description":"Bearbeitungs-Art: html (Vorgabe) oder visual (Baustein-Baum).","type":["string","null"]},"design":{"description":"Baustein-Baum der Vorlage (Format mail-blocks/1); im visuellen Modus die Wahrheit, bodyHtml ist sein Erzeugnis.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]}}},"MarketingEmailTemplate.jsonld-mkt_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (nur lesend) — von Dispatch.templateId und\n`marketing_send_message`-Automation-Schritten referenziert (UI-Vorlagenauswahl).","type":["integer","null"]},"name":{"type":["string","null"]},"subject":{"type":["string","null"]},"bodyHtml":{"type":["string","null"]},"bodyText":{"type":["string","null"]},"mergeFields":{"type":["array","null"],"items":{"type":"string"}},"unsubscribeBlock":{"type":["string","null"]},"translations":{"description":"Pro-Sprache-Übersetzungen (Empfängersprache): Map locale → {subject, bodyHtml, bodyText}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}},"contentMode":{"description":"Bearbeitungs-Art: html (Vorgabe) oder visual (Baustein-Baum).","type":["string","null"]},"design":{"description":"Baustein-Baum der Vorlage (Format mail-blocks/1); im visuellen Modus die Wahrheit, bodyHtml ist sein Erzeugnis.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"previewSubject":{"description":"Gerenderter Betreff (nur über /preview befüllt).","type":["string","null"]},"previewHtml":{"description":"Gerenderter HTML-Body (nur über /preview befüllt).","type":["string","null"]},"previewText":{"description":"Gerenderter Text-Body (nur über /preview befüllt).","type":["string","null"]}}}],"description":"Wiederverwendbare E-Mail-Vorlage in Marken-CI (04-13 §3, S13-2). CRUD; Abmeldeblock ist Pflicht."},"MarketingEmailTemplateTestSend-mkt_template_test.read":{"type":"object","description":"Testversand einer Kampagnen-Vorlage (Doc 46 A3).\n\nDer Grund, warum es das braucht: eine Vorlage sieht im Canvas richtig aus und im Postfach\ntrotzdem falsch — Outlook rechnet Zeilenhoehen um, Gmail schneidet `<style>` weg, ein\nBild-Proxy skaliert. Nur ein echter Versand beantwortet das.\n\nKein Bulk-Weg: EIN Empfaenger, Betreff mit `[Test]`-Vorsatz, Demo-Empfaengerdaten. Der\nKampagnen-Versand laeuft unveraendert ueber seine eigene Strecke.","properties":{"ulid":{"type":["string","null"]},"toEmail":{"description":"Empfaenger des Testversands (eine Adresse).","type":["string","null"]},"locale":{"description":"Sprache der Fassung; leer = Standardsprache.","type":["string","null"]},"sent":{"default":false,"type":"boolean"},"error":{"description":"Transport-Fehlermeldung (nur bei sent=false).","type":["string","null"]}}},"MarketingEmailTemplateTestSend-mkt_template_test.write":{"type":"object","description":"Testversand einer Kampagnen-Vorlage (Doc 46 A3).\n\nDer Grund, warum es das braucht: eine Vorlage sieht im Canvas richtig aus und im Postfach\ntrotzdem falsch — Outlook rechnet Zeilenhoehen um, Gmail schneidet `<style>` weg, ein\nBild-Proxy skaliert. Nur ein echter Versand beantwortet das.\n\nKein Bulk-Weg: EIN Empfaenger, Betreff mit `[Test]`-Vorsatz, Demo-Empfaengerdaten. Der\nKampagnen-Versand laeuft unveraendert ueber seine eigene Strecke.","properties":{"toEmail":{"description":"Empfaenger des Testversands (eine Adresse).","type":["string","null"]},"locale":{"description":"Sprache der Fassung; leer = Standardsprache.","type":["string","null"]}}},"MarketingEmailTemplateTestSend.jsonld-mkt_template_test.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"toEmail":{"description":"Empfaenger des Testversands (eine Adresse).","type":["string","null"]},"locale":{"description":"Sprache der Fassung; leer = Standardsprache.","type":["string","null"]},"sent":{"default":false,"type":"boolean"},"error":{"description":"Transport-Fehlermeldung (nur bei sent=false).","type":["string","null"]}}}],"description":"Testversand einer Kampagnen-Vorlage (Doc 46 A3).\n\nDer Grund, warum es das braucht: eine Vorlage sieht im Canvas richtig aus und im Postfach\ntrotzdem falsch — Outlook rechnet Zeilenhoehen um, Gmail schneidet `<style>` weg, ein\nBild-Proxy skaliert. Nur ein echter Versand beantwortet das.\n\nKein Bulk-Weg: EIN Empfaenger, Betreff mit `[Test]`-Vorsatz, Demo-Empfaengerdaten. Der\nKampagnen-Versand laeuft unveraendert ueber seine eigene Strecke."},"MarketingFormSubmission-mkt_sub.read":{"type":"object","description":"Eingegangene Formular-Absendungen (04-13 §4.1, §5 Posteingang). Read + `/convert` (zu Lead),\n`/spam`/`/unspam` (Spam-Korrektur). Lead-Anlage automatisch bei Eingang; `/convert`\nre-konvertiert z.B. vormals als Spam markierte Einträge.","properties":{"ulid":{"type":["string","null"]},"webFormId":{"type":["integer","null"]},"webFormName":{"description":"Aufgelöster Formularname (für den Posteingang statt „#id\"); null, wenn das Formular nicht (mehr) auffindbar ist.","type":["string","null"]},"webFormUlid":{"description":"ULID des Formulars (stabiler Verweis für die SPA).","type":["string","null"]},"payload":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"utm":{"type":["object","null"],"additionalProperties":{"type":"string"}},"email":{"type":["string","null"]},"referrer":{"type":["string","null"]},"status":{"type":["string","null"]},"leadId":{"type":["integer","null"]},"leadUlid":{"description":"ULID des erzeugten CRM-Leads (Deep-Link aus dem Posteingang), null solange nicht konvertiert.","type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"MarketingFormSubmission-mkt_sub.write":{"type":"object","description":"Eingegangene Formular-Absendungen (04-13 §4.1, §5 Posteingang). Read + `/convert` (zu Lead),\n`/spam`/`/unspam` (Spam-Korrektur). Lead-Anlage automatisch bei Eingang; `/convert`\nre-konvertiert z.B. vormals als Spam markierte Einträge."},"MarketingFormSubmission.jsonld-mkt_sub.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"webFormId":{"type":["integer","null"]},"webFormName":{"description":"Aufgelöster Formularname (für den Posteingang statt „#id\"); null, wenn das Formular nicht (mehr) auffindbar ist.","type":["string","null"]},"webFormUlid":{"description":"ULID des Formulars (stabiler Verweis für die SPA).","type":["string","null"]},"payload":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"utm":{"type":["object","null"],"additionalProperties":{"type":"string"}},"email":{"type":["string","null"]},"referrer":{"type":["string","null"]},"status":{"type":["string","null"]},"leadId":{"type":["integer","null"]},"leadUlid":{"description":"ULID des erzeugten CRM-Leads (Deep-Link aus dem Posteingang), null solange nicht konvertiert.","type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Eingegangene Formular-Absendungen (04-13 §4.1, §5 Posteingang). Read + `/convert` (zu Lead),\n`/spam`/`/unspam` (Spam-Korrektur). Lead-Anlage automatisch bei Eingang; `/convert`\nre-konvertiert z.B. vormals als Spam markierte Einträge."},"MarketingMailCanvas-mkt_mail_canvas.write":{"type":"object","description":"Canvas-Render der KAMPAGNEN-Vorlagen (Doc 46 A2, ENT-MKT-01/-02).\n\nEigener Endpunkt, weil das Recht ein anderes ist ({@see MarketingPermissions::CAMPAIGN_MANAGE}\nstatt der Systemmail-Verwaltung) und der Abmelde-Baustein hier PFLICHT ist. Die Render-Logik\ndahinter ist dieselbe wie fuer Systemmails ({@see \\App\\Platform\\Mail\\Service\\MailCanvasService})\n— zwei Fassungen hiessen zwei Erzeugnisse aus demselben Baum.\n\nPersistiert nichts.","properties":{"blocks":{"type":["array","null"],"items":{"type":"array","items":{"type":["string","null"]}}},"brandId":{"type":["integer","null"]},"locale":{"type":["string","null"]},"slots":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":["string","null"]}}}}}},"MarketingMailCanvas.MailCanvasResult-mail_canvas.read":{"type":"object","description":"Canvas-Render der KAMPAGNEN-Vorlagen (Doc 46 A2, ENT-MKT-01/-02).\n\nEigener Endpunkt, weil das Recht ein anderes ist ({@see MarketingPermissions::CAMPAIGN_MANAGE}\nstatt der Systemmail-Verwaltung) und der Abmelde-Baustein hier PFLICHT ist. Die Render-Logik\ndahinter ist dieselbe wie fuer Systemmails ({@see \\App\\Platform\\Mail\\Service\\MailCanvasService})\n— zwei Fassungen hiessen zwei Erzeugnisse aus demselben Baum.\n\nPersistiert nichts.","properties":{"html":{"type":"string"},"text":{"type":"string"},"slotKeys":{"description":"Slot-Schluessel des Baums in Dokument-Reihenfolge — die Kampagnen-Maske baut daraus ihre Felder.","type":"array","items":{"type":"string"}}}},"MarketingMailCanvas.MailCanvasResult.jsonld-mail_canvas.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"html":{"type":"string"},"text":{"type":"string"},"slotKeys":{"description":"Slot-Schluessel des Baums in Dokument-Reihenfolge — die Kampagnen-Maske baut daraus ihre Felder.","type":"array","items":{"type":"string"}}}}],"description":"Canvas-Render der KAMPAGNEN-Vorlagen (Doc 46 A2, ENT-MKT-01/-02).\n\nEigener Endpunkt, weil das Recht ein anderes ist ({@see MarketingPermissions::CAMPAIGN_MANAGE}\nstatt der Systemmail-Verwaltung) und der Abmelde-Baustein hier PFLICHT ist. Die Render-Logik\ndahinter ist dieselbe wie fuer Systemmails ({@see \\App\\Platform\\Mail\\Service\\MailCanvasService})\n— zwei Fassungen hiessen zwei Erzeugnisse aus demselben Baum.\n\nPersistiert nichts."},"MarketingReport-mkt_report.read":{"type":"object","description":"Akquise-Auswertung (04-13 §4.4, AK#7): Leads je Quelle/Kampagne und die Conversion-Kette. Filter\nüber `?from=` / `?to=` (ISO-8601). Read-only Aggregat.","properties":{"id":{"type":["string","null"]},"leadsBySource":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"leadsByCampaign":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"landingPages":{"description":"Landeseiten des Zeitraums mit Aufrufen, Absendungen und Quote.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"totals":{"type":["object","null"],"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"}]}}}},"MarketingReport.jsonld-mkt_report.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"leadsBySource":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"leadsByCampaign":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"landingPages":{"description":"Landeseiten des Zeitraums mit Aufrufen, Absendungen und Quote.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"totals":{"type":["object","null"],"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"}]}}}}],"description":"Akquise-Auswertung (04-13 §4.4, AK#7): Leads je Quelle/Kampagne und die Conversion-Kette. Filter\nüber `?from=` / `?to=` (ISO-8601). Read-only Aggregat."},"MarketingSuppression-mkt_supp.read":{"type":"object","description":"Versand-Sperren / Blacklist (04-13 §4.2, §6, M6). Liste + manuelle Sperre + Aufhebung (Löschen).","properties":{"ulid":{"type":["string","null"]},"reason":{"enum":["unsubscribe","bounce","complaint","manual"],"type":["string","null"]},"scope":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"MarketingSuppression-mkt_supp.write":{"type":"object","description":"Versand-Sperren / Blacklist (04-13 §4.2, §6, M6). Liste + manuelle Sperre + Aufhebung (Löschen).","required":["email"],"properties":{"email":{"format":"email","description":"Beim Anlegen: Klartext-Adresse, die gesperrt wird.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"reason":{"enum":["unsubscribe","bounce","complaint","manual"],"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"MarketingSuppression.jsonld-mkt_supp.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"reason":{"enum":["unsubscribe","bounce","complaint","manual"],"type":["string","null"]},"scope":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Versand-Sperren / Blacklist (04-13 §4.2, §6, M6). Liste + manuelle Sperre + Aufhebung (Löschen)."},"MarketingWebForm-mkt_form.read":{"type":"object","description":"Einbettbares Web-Formular (04-13 §4.1). CRUD inkl. Embed-Snippet; öffentliche Absendung über\n{@see \\Octi\\Plugin\\Marketing\\Controller\\PublicFormController}.","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"embedKey":{"type":["string","null"]},"fields":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"sourceId":{"type":["integer","null"]},"defaultUtm":{"type":["object","null"],"additionalProperties":{"type":"string"}},"doubleOptIn":{"type":["boolean","null"]},"consentPurpose":{"type":["string","null"]},"consentText":{"type":["string","null"]},"redirectUrl":{"type":["string","null"]},"targets":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"embedSnippet":{"description":"Fertiges Einbettungs-Snippet für die eigene Website.","type":["string","null"]},"createdAt":{"type":["string","null"]}}},"MarketingWebForm-mkt_form.write":{"type":"object","description":"Einbettbares Web-Formular (04-13 §4.1). CRUD inkl. Embed-Snippet; öffentliche Absendung über\n{@see \\Octi\\Plugin\\Marketing\\Controller\\PublicFormController}.","properties":{"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"fields":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"sourceId":{"type":["integer","null"]},"defaultUtm":{"type":["object","null"],"additionalProperties":{"type":"string"}},"doubleOptIn":{"type":["boolean","null"]},"consentPurpose":{"type":["string","null"]},"consentText":{"type":["string","null"]},"redirectUrl":{"type":["string","null"]},"targets":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"MarketingWebForm-mkt_form.write.jsonMergePatch":{"type":"object","description":"Einbettbares Web-Formular (04-13 §4.1). CRUD inkl. Embed-Snippet; öffentliche Absendung über\n{@see \\Octi\\Plugin\\Marketing\\Controller\\PublicFormController}.","properties":{"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"fields":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"sourceId":{"type":["integer","null"]},"defaultUtm":{"type":["object","null"],"additionalProperties":{"type":"string"}},"doubleOptIn":{"type":["boolean","null"]},"consentPurpose":{"type":["string","null"]},"consentText":{"type":["string","null"]},"redirectUrl":{"type":["string","null"]},"targets":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"MarketingWebForm.jsonld-mkt_form.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"embedKey":{"type":["string","null"]},"fields":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"sourceId":{"type":["integer","null"]},"defaultUtm":{"type":["object","null"],"additionalProperties":{"type":"string"}},"doubleOptIn":{"type":["boolean","null"]},"consentPurpose":{"type":["string","null"]},"consentText":{"type":["string","null"]},"redirectUrl":{"type":["string","null"]},"targets":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"embedSnippet":{"description":"Fertiges Einbettungs-Snippet für die eigene Website.","type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Einbettbares Web-Formular (04-13 §4.1). CRUD inkl. Embed-Snippet; öffentliche Absendung über\n{@see \\Octi\\Plugin\\Marketing\\Controller\\PublicFormController}."},"McpCommand-mcp.read":{"type":"object","description":"In-App-KI-Kommandozeile (⌘K): natürlichsprachliche Befehle, LESEN (sofort) oder SCHREIBEN\n(Vorschau + Bestätigung).\n\n- Beide Operationen nur ROLE_USER; Lese-/Schreibrecht zusätzlich über denselben Voter-/\n  Marken-Scope wie die reguläre API ({@see \\App\\Platform\\LlmGateway\\Service\\McpCommandExecutor})\n  — KI umgeht nie die Berechtigungen.\n- POST /mcp/query {query} → Lese-Absicht: sofort ausgeführt. Schreib-Absicht: Vorschau +\n  `requiresConfirmation: true` + HMAC-signiertes, ablaufendes `action`-Token, ohne Mutation.\n- POST /mcp/confirm {action} → prüft Signatur/Ablauf/Nutzer-Bindung, re-validiert tool/args\n  gegen Whitelist, führt erst dann aus.","properties":{"id":{"description":"Kein echter Identifier (DTO ohne Persistenz) — ohne `identifier: false` würde API Platform eine IRI erzwingen → 400.","type":["string","null"]},"response":{"description":"Antworttext (deutsch) — Lese-Ergebnis, Schreib-Vorschau oder Bestätigungs-Ergebnis.","default":"","type":"string"},"requiresConfirmation":{"description":"true = Schreib-Absicht, wird erst nach /mcp/confirm ausgeführt.","default":false,"type":"boolean"},"action":{"description":"Opakes HMAC-Token; gesetzt wenn requiresConfirmation=true. Client reicht es unverändert an /mcp/confirm zurück.","type":["string","null"]}}},"McpCommand-mcp.write":{"type":"object","description":"In-App-KI-Kommandozeile (⌘K): natürlichsprachliche Befehle, LESEN (sofort) oder SCHREIBEN\n(Vorschau + Bestätigung).\n\n- Beide Operationen nur ROLE_USER; Lese-/Schreibrecht zusätzlich über denselben Voter-/\n  Marken-Scope wie die reguläre API ({@see \\App\\Platform\\LlmGateway\\Service\\McpCommandExecutor})\n  — KI umgeht nie die Berechtigungen.\n- POST /mcp/query {query} → Lese-Absicht: sofort ausgeführt. Schreib-Absicht: Vorschau +\n  `requiresConfirmation: true` + HMAC-signiertes, ablaufendes `action`-Token, ohne Mutation.\n- POST /mcp/confirm {action} → prüft Signatur/Ablauf/Nutzer-Bindung, re-validiert tool/args\n  gegen Whitelist, führt erst dann aus.","properties":{"query":{"description":"Eingabe für /mcp/query: der natürlichsprachliche Befehl.","type":["string","null"]},"action":{"description":"Opakes HMAC-Token; gesetzt wenn requiresConfirmation=true. Client reicht es unverändert an /mcp/confirm zurück.","type":["string","null"]}}},"McpCommand.jsonld-mcp.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Kein echter Identifier (DTO ohne Persistenz) — ohne `identifier: false` würde API Platform eine IRI erzwingen → 400.","type":["string","null"]},"response":{"description":"Antworttext (deutsch) — Lese-Ergebnis, Schreib-Vorschau oder Bestätigungs-Ergebnis.","default":"","type":"string"},"requiresConfirmation":{"description":"true = Schreib-Absicht, wird erst nach /mcp/confirm ausgeführt.","default":false,"type":"boolean"},"action":{"description":"Opakes HMAC-Token; gesetzt wenn requiresConfirmation=true. Client reicht es unverändert an /mcp/confirm zurück.","type":["string","null"]}}}],"description":"In-App-KI-Kommandozeile (⌘K): natürlichsprachliche Befehle, LESEN (sofort) oder SCHREIBEN\n(Vorschau + Bestätigung).\n\n- Beide Operationen nur ROLE_USER; Lese-/Schreibrecht zusätzlich über denselben Voter-/\n  Marken-Scope wie die reguläre API ({@see \\App\\Platform\\LlmGateway\\Service\\McpCommandExecutor})\n  — KI umgeht nie die Berechtigungen.\n- POST /mcp/query {query} → Lese-Absicht: sofort ausgeführt. Schreib-Absicht: Vorschau +\n  `requiresConfirmation: true` + HMAC-signiertes, ablaufendes `action`-Token, ohne Mutation.\n- POST /mcp/confirm {action} → prüft Signatur/Ablauf/Nutzer-Bindung, re-validiert tool/args\n  gegen Whitelist, führt erst dann aus."},"Member-member.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"displayName":{"type":["string","null"]},"email":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"active":{"default":false,"type":"boolean"}}},"Member.jsonld-member.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"displayName":{"type":["string","null"]},"email":{"type":["string","null"]},"avatarUrl":{"type":["string","null"]},"active":{"default":false,"type":"boolean"}}}]},"Milestone-milestone.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"projectUlid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"color":{"maxLength":20,"description":"Farbe für Timeline/Gantt (Doc 27 2.6), z.B. '#3b82f6'.","type":["string","null"]},"dueAt":{"type":["string","null"]},"statusKey":{"maxLength":50,"type":["string","null"]},"statusLabel":{"type":["string","null"]},"billable":{"default":false,"type":"boolean"},"billingAmount":{"minimum":0,"description":"Festpreis-Tranche in Cent.","type":["integer","null"]},"quoteItemRef":{"type":["string","null"]},"acceptanceRequired":{"default":false,"type":"boolean"},"sortOrder":{"minimum":0,"default":0,"type":"integer"},"reachedAt":{"type":["string","null"],"format":"date-time"},"acceptedAt":{"type":["string","null"],"format":"date-time"},"billedAt":{"type":["string","null"],"format":"date-time"}},"required":["projectId","name"]},"Milestone-milestone.write":{"type":"object","required":["projectId","name"],"properties":{"projectId":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"color":{"maxLength":20,"description":"Farbe für Timeline/Gantt (Doc 27 2.6), z.B. '#3b82f6'.","type":["string","null"]},"dueAt":{"type":["string","null"]},"statusKey":{"maxLength":50,"type":["string","null"]},"billable":{"default":false,"type":"boolean"},"billingAmount":{"minimum":0,"description":"Festpreis-Tranche in Cent.","type":["integer","null"]},"quoteItemRef":{"type":["string","null"]},"acceptanceRequired":{"default":false,"type":"boolean"},"sortOrder":{"minimum":0,"default":0,"type":"integer"}}},"Milestone-milestone.write.jsonMergePatch":{"type":"object","properties":{"projectId":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"color":{"maxLength":20,"description":"Farbe für Timeline/Gantt (Doc 27 2.6), z.B. '#3b82f6'.","type":["string","null"]},"dueAt":{"type":["string","null"]},"statusKey":{"maxLength":50,"type":["string","null"]},"billable":{"default":false,"type":"boolean"},"billingAmount":{"minimum":0,"description":"Festpreis-Tranche in Cent.","type":["integer","null"]},"quoteItemRef":{"type":["string","null"]},"acceptanceRequired":{"default":false,"type":"boolean"},"sortOrder":{"minimum":0,"default":0,"type":"integer"}}},"Milestone.jsonld-milestone.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"projectUlid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"color":{"maxLength":20,"description":"Farbe für Timeline/Gantt (Doc 27 2.6), z.B. '#3b82f6'.","type":["string","null"]},"dueAt":{"type":["string","null"]},"statusKey":{"maxLength":50,"type":["string","null"]},"statusLabel":{"type":["string","null"]},"billable":{"default":false,"type":"boolean"},"billingAmount":{"minimum":0,"description":"Festpreis-Tranche in Cent.","type":["integer","null"]},"quoteItemRef":{"type":["string","null"]},"acceptanceRequired":{"default":false,"type":"boolean"},"sortOrder":{"minimum":0,"default":0,"type":"integer"},"reachedAt":{"type":["string","null"],"format":"date-time"},"acceptedAt":{"type":["string","null"],"format":"date-time"},"billedAt":{"type":["string","null"],"format":"date-time"}},"required":["projectId","name"]}]},"MilestoneStatus-milestone_status.read":{"type":"object","description":"Meilenstein-Status als Daten (konfigurierbar ohne Code).\n`category` bildet den Lebenszyklus open|active|done|cancelled ab.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"MilestoneStatus-milestone_status.update.jsonMergePatch":{"type":"object","description":"Meilenstein-Status als Daten (konfigurierbar ohne Code).\n`category` bildet den Lebenszyklus open|active|done|cancelled ab.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"MilestoneStatus-milestone_status.write":{"type":"object","description":"Meilenstein-Status als Daten (konfigurierbar ohne Code).\n`category` bildet den Lebenszyklus open|active|done|cancelled ab.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"MilestoneStatus.jsonld-milestone_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Meilenstein-Status als Daten (konfigurierbar ohne Code).\n`category` bildet den Lebenszyklus open|active|done|cancelled ab."},"Notification-notification.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"type":{"default":"","type":"string"},"channel":{"default":"","type":"string"},"title":{"default":"","type":"string"},"body":{"type":["string","null"]},"actionUrl":{"type":["string","null"]},"payload":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"read":{"description":"true = als gelesen markieren (setzt readAt).","type":["boolean","null"]},"readAt":{"type":["string","null"],"format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"markedCount":{"description":"Nur in der Antwort von `POST /v1/notifications/mark-all-read`: Anzahl neu als gelesen markierter.","type":["integer","null"]}}},"Notification-notification.write":{"type":"object","properties":{"read":{"description":"true = als gelesen markieren (setzt readAt).","type":["boolean","null"]}}},"Notification-notification.write.jsonMergePatch":{"type":"object","properties":{"read":{"description":"true = als gelesen markieren (setzt readAt).","type":["boolean","null"]}}},"Notification.jsonld-notification.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"type":{"default":"","type":"string"},"channel":{"default":"","type":"string"},"title":{"default":"","type":"string"},"body":{"type":["string","null"]},"actionUrl":{"type":["string","null"]},"payload":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"read":{"description":"true = als gelesen markieren (setzt readAt).","type":["boolean","null"]},"readAt":{"type":["string","null"],"format":"date-time"},"sentAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"markedCount":{"description":"Nur in der Antwort von `POST /v1/notifications/mark-all-read`: Anzahl neu als gelesen markierter.","type":["integer","null"]}}}]},"NotificationChannel-notification_channel.read":{"type":"object","description":"Angebotsliste der Benachrichtigungs-Kanäle (Audit R23).\n\nDie Präferenz-Oberfläche kannte bis dahin nur die zwei hart kodierten Core-Kanäle `email`/`slack`\n— ein über den offenen SPI beigesteuerter Plugin-Kanal (z.B. `slack_project`) war damit weder\nein- noch ausschaltbar, obwohl Registry, Validator und Zustellung ihn längst führen. Diese\nRessource ist die fehlende Lese-Naht: enablement-GEFILTERT\n({@see \\App\\Platform\\Notification\\Service\\NotificationChannelRegistry::available()}), damit\nKanäle deaktivierter Plugins gar nicht erst angeboten werden.\n\n`enabledByDefault` gehört dazu, weil der Dispatcher ohne Präferenzzeile genau diesen Default\nanwendet: eine UI, die stattdessen „an\" annimmt, zeigt Opt-in-Kanäle fälschlich als aktiv.\n\nSelf-scoped wie die Präferenzen selbst (`platform.notification.view`, jede Rolle hat es).","properties":{"key":{"type":"string"},"enabledByDefault":{"description":"Zustellung ohne Präferenzzeile — `false` heißt Opt-in (Nutzer muss aktiv einschalten).","type":"boolean"},"configurable":{"description":"`in_app` ist die verbindliche Zustellung und deshalb nicht abschaltbar.","type":"boolean"}}},"NotificationChannel.jsonld-notification_channel.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":"string"},"enabledByDefault":{"description":"Zustellung ohne Präferenzzeile — `false` heißt Opt-in (Nutzer muss aktiv einschalten).","type":"boolean"},"configurable":{"description":"`in_app` ist die verbindliche Zustellung und deshalb nicht abschaltbar.","type":"boolean"}}}],"description":"Angebotsliste der Benachrichtigungs-Kanäle (Audit R23).\n\nDie Präferenz-Oberfläche kannte bis dahin nur die zwei hart kodierten Core-Kanäle `email`/`slack`\n— ein über den offenen SPI beigesteuerter Plugin-Kanal (z.B. `slack_project`) war damit weder\nein- noch ausschaltbar, obwohl Registry, Validator und Zustellung ihn längst führen. Diese\nRessource ist die fehlende Lese-Naht: enablement-GEFILTERT\n({@see \\App\\Platform\\Notification\\Service\\NotificationChannelRegistry::available()}), damit\nKanäle deaktivierter Plugins gar nicht erst angeboten werden.\n\n`enabledByDefault` gehört dazu, weil der Dispatcher ohne Präferenzzeile genau diesen Default\nanwendet: eine UI, die stattdessen „an\" annimmt, zeigt Opt-in-Kanäle fälschlich als aktiv.\n\nSelf-scoped wie die Präferenzen selbst (`platform.notification.view`, jede Rolle hat es)."},"NotificationPreference-notification_pref.read":{"type":"object","description":"Benachrichtigungs-Präferenzen je (Event-Typ, Kanal), 04-00 §4.4.\n- Nur eigene Präferenzen; State-Layer hart auf User gescoped (IDOR-fest).\n- in_app nicht deaktivierbar — Präferenz wird ignoriert/abgewiesen.","properties":{"id":{"type":["integer","null"]},"type":{"maxLength":100,"default":"","type":"string"},"channel":{"description":"Kanal: in_app | email | slack + Plugin-Kanäle (Tag `app.notification.channel`).","default":"","type":"string"},"enabled":{"default":true,"type":"boolean"},"digest":{"default":false,"type":"boolean"}},"required":["type","channel"]},"NotificationPreference-notification_pref.write":{"type":"object","description":"Benachrichtigungs-Präferenzen je (Event-Typ, Kanal), 04-00 §4.4.\n- Nur eigene Präferenzen; State-Layer hart auf User gescoped (IDOR-fest).\n- in_app nicht deaktivierbar — Präferenz wird ignoriert/abgewiesen.","required":["type","channel"],"properties":{"type":{"maxLength":100,"default":"","type":"string"},"channel":{"description":"Kanal: in_app | email | slack + Plugin-Kanäle (Tag `app.notification.channel`).","default":"","type":"string"},"enabled":{"default":true,"type":"boolean"},"digest":{"default":false,"type":"boolean"}}},"NotificationPreference-notification_pref.write.jsonMergePatch":{"type":"object","description":"Benachrichtigungs-Präferenzen je (Event-Typ, Kanal), 04-00 §4.4.\n- Nur eigene Präferenzen; State-Layer hart auf User gescoped (IDOR-fest).\n- in_app nicht deaktivierbar — Präferenz wird ignoriert/abgewiesen.","properties":{"type":{"maxLength":100,"default":"","type":"string"},"channel":{"description":"Kanal: in_app | email | slack + Plugin-Kanäle (Tag `app.notification.channel`).","default":"","type":"string"},"enabled":{"default":true,"type":"boolean"},"digest":{"default":false,"type":"boolean"}}},"NotificationPreference.jsonld-notification_pref.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["integer","null"]},"type":{"maxLength":100,"default":"","type":"string"},"channel":{"description":"Kanal: in_app | email | slack + Plugin-Kanäle (Tag `app.notification.channel`).","default":"","type":"string"},"enabled":{"default":true,"type":"boolean"},"digest":{"default":false,"type":"boolean"}},"required":["type","channel"]}],"description":"Benachrichtigungs-Präferenzen je (Event-Typ, Kanal), 04-00 §4.4.\n- Nur eigene Präferenzen; State-Layer hart auf User gescoped (IDOR-fest).\n- in_app nicht deaktivierbar — Präferenz wird ignoriert/abgewiesen."},"NumberScheme-number_scheme.read":{"type":"object","description":"Admin-Verwaltung der Nummernkreise (15 §3, ENT-ERP-NUMBERING-01): Muster, Reset-Policy,\nMarken-Scope, Zählerstand je Nummern-Typ — ohne Deploy. Nur registrierte Typen\n(fail-closed, {@see \\App\\Platform\\Commerce\\Numbering\\Service\\NumberedTypeRegistry}).","properties":{"ulid":{"type":["string","null"]},"schemeKey":{"description":"Registrierter Nummern-Typ (z. B. \"invoice\") — nach Anlage unveränderlich.","type":["string","null"]},"label":{"description":"Anzeigename des Typs aus der Registry (read-only).","type":["string","null"]},"brandId":{"type":["integer","null"]},"pattern":{"maxLength":120,"description":"Muster: Literale · {BRAND} · {YYYY}/{YY}/{MM}/{DD} · {SEQ}/{SEQ:n}.","type":["string","null"]},"resetPolicy":{"enum":["never","yearly","monthly"],"type":["string","null"]},"gapless":{"description":"Lückenlos (GoBD) — Zug in der Fach-Transaktion; Rollback gibt die Nummer zurück.","type":["boolean","null"]},"nextValue":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"padding":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"active":{"type":["boolean","null"]},"lastResetPeriod":{"type":["string","null"]},"preview":{"description":"Vorschau der nächsten Nummer (read-only, Reset-Policy eingerechnet).","type":["string","null"]}}},"NumberScheme-number_scheme.write":{"type":"object","description":"Admin-Verwaltung der Nummernkreise (15 §3, ENT-ERP-NUMBERING-01): Muster, Reset-Policy,\nMarken-Scope, Zählerstand je Nummern-Typ — ohne Deploy. Nur registrierte Typen\n(fail-closed, {@see \\App\\Platform\\Commerce\\Numbering\\Service\\NumberedTypeRegistry}).","properties":{"schemeKey":{"description":"Registrierter Nummern-Typ (z. B. \"invoice\") — nach Anlage unveränderlich.","type":["string","null"]},"brandId":{"type":["integer","null"]},"pattern":{"maxLength":120,"description":"Muster: Literale · {BRAND} · {YYYY}/{YY}/{MM}/{DD} · {SEQ}/{SEQ:n}.","type":["string","null"]},"resetPolicy":{"enum":["never","yearly","monthly"],"type":["string","null"]},"gapless":{"description":"Lückenlos (GoBD) — Zug in der Fach-Transaktion; Rollback gibt die Nummer zurück.","type":["boolean","null"]},"nextValue":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"padding":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"NumberScheme-number_scheme.write.jsonMergePatch":{"type":"object","description":"Admin-Verwaltung der Nummernkreise (15 §3, ENT-ERP-NUMBERING-01): Muster, Reset-Policy,\nMarken-Scope, Zählerstand je Nummern-Typ — ohne Deploy. Nur registrierte Typen\n(fail-closed, {@see \\App\\Platform\\Commerce\\Numbering\\Service\\NumberedTypeRegistry}).","properties":{"schemeKey":{"description":"Registrierter Nummern-Typ (z. B. \"invoice\") — nach Anlage unveränderlich.","type":["string","null"]},"brandId":{"type":["integer","null"]},"pattern":{"maxLength":120,"description":"Muster: Literale · {BRAND} · {YYYY}/{YY}/{MM}/{DD} · {SEQ}/{SEQ:n}.","type":["string","null"]},"resetPolicy":{"enum":["never","yearly","monthly"],"type":["string","null"]},"gapless":{"description":"Lückenlos (GoBD) — Zug in der Fach-Transaktion; Rollback gibt die Nummer zurück.","type":["boolean","null"]},"nextValue":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"padding":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"NumberScheme.jsonld-number_scheme.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"schemeKey":{"description":"Registrierter Nummern-Typ (z. B. \"invoice\") — nach Anlage unveränderlich.","type":["string","null"]},"label":{"description":"Anzeigename des Typs aus der Registry (read-only).","type":["string","null"]},"brandId":{"type":["integer","null"]},"pattern":{"maxLength":120,"description":"Muster: Literale · {BRAND} · {YYYY}/{YY}/{MM}/{DD} · {SEQ}/{SEQ:n}.","type":["string","null"]},"resetPolicy":{"enum":["never","yearly","monthly"],"type":["string","null"]},"gapless":{"description":"Lückenlos (GoBD) — Zug in der Fach-Transaktion; Rollback gibt die Nummer zurück.","type":["boolean","null"]},"nextValue":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"padding":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"active":{"type":["boolean","null"]},"lastResetPeriod":{"type":["string","null"]},"preview":{"description":"Vorschau der nächsten Nummer (read-only, Reset-Policy eingerechnet).","type":["string","null"]}}}],"description":"Admin-Verwaltung der Nummernkreise (15 §3, ENT-ERP-NUMBERING-01): Muster, Reset-Policy,\nMarken-Scope, Zählerstand je Nummern-Typ — ohne Deploy. Nur registrierte Typen\n(fail-closed, {@see \\App\\Platform\\Commerce\\Numbering\\Service\\NumberedTypeRegistry})."},"NumberedType-numbered_type.read":{"type":"object","description":"Read-only-Katalog der registrierten Nummern-Typen (15 §3 Key-Registry): Core + aktive\nPlugins, Default-Muster, gapless/brandScoped — Grundlage der Nummernkreis-Verwaltung.","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"defaultPattern":{"type":["string","null"]},"gapless":{"type":["boolean","null"]},"brandScoped":{"type":["boolean","null"]},"providerKey":{"type":["string","null"]}}},"NumberedType.jsonld-numbered_type.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"defaultPattern":{"type":["string","null"]},"gapless":{"type":["boolean","null"]},"brandScoped":{"type":["boolean","null"]},"providerKey":{"type":["string","null"]}}}],"description":"Read-only-Katalog der registrierten Nummern-Typen (15 §3 Key-Registry): Core + aktive\nPlugins, Default-Muster, gapless/brandScoped — Grundlage der Nummernkreis-Verwaltung."},"OssReport-oss_report.read":{"type":"object","description":"OSS-Quartalsmeldung (Doc 25 AP 10.3, Spec 04-51 §5).\n\n**Drei Schritte, bewusst getrennt:** erzeugen → freigeben → herunterladen.\n\nDie Freigabe ist das **Steuerberater-Gate** (06-R14) und hängt an einem eigenen Recht\n(`international.oss.confirm`). Sie ist nicht Bürokratie: eine OSS-Meldung ist eine\nSteuererklärung. Das System kann rechnen, aber nicht wissen, ob es alle Umsätze gesehen hat —\ndie Frage beantwortet ein Mensch, und die Antwort steht danach mit Name und Zeitpunkt im\nPrüfpfad.\n\nHerunterladen lässt sich nur eine FREIGEGEBENE Meldung: was beim BZSt eingereicht wird, soll\nniemand versehentlich aus einem Entwurf gezogen haben.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"year":{"minimum":2000,"maximum":2999,"type":["integer","null"]},"quarter":{"minimum":1,"maximum":4,"type":["integer","null"]},"status":{"description":"`draft` | `confirmed`.","type":["string","null"]},"lines":{"description":"Eingefrorene Meldezeilen je Bestimmungsland und Satz.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"netTotal":{"description":"Summe der Nettoumsätze in EUR-Cent.","type":["integer","null"]},"taxTotal":{"description":"Summe der geschuldeten Steuer in EUR-Cent — der Betrag, der an das BZSt geht.","type":["integer","null"]},"entryCount":{"description":"Anzahl der Meldebuch-Zeilen hinter den Summen — Plausibilitätsanker für den Prüfer.","type":["integer","null"]},"confirmedAt":{"type":["string","null"]},"confirmedBy":{"type":["string","null"]},"confirmationNote":{"maxLength":500,"type":["string","null"]}}},"OssReport-oss_report.write":{"type":"object","description":"OSS-Quartalsmeldung (Doc 25 AP 10.3, Spec 04-51 §5).\n\n**Drei Schritte, bewusst getrennt:** erzeugen → freigeben → herunterladen.\n\nDie Freigabe ist das **Steuerberater-Gate** (06-R14) und hängt an einem eigenen Recht\n(`international.oss.confirm`). Sie ist nicht Bürokratie: eine OSS-Meldung ist eine\nSteuererklärung. Das System kann rechnen, aber nicht wissen, ob es alle Umsätze gesehen hat —\ndie Frage beantwortet ein Mensch, und die Antwort steht danach mit Name und Zeitpunkt im\nPrüfpfad.\n\nHerunterladen lässt sich nur eine FREIGEGEBENE Meldung: was beim BZSt eingereicht wird, soll\nniemand versehentlich aus einem Entwurf gezogen haben.","properties":{"year":{"minimum":2000,"maximum":2999,"type":["integer","null"]},"quarter":{"minimum":1,"maximum":4,"type":["integer","null"]},"confirmationNote":{"maxLength":500,"type":["string","null"]}}},"OssReport.jsonld-oss_report.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"year":{"minimum":2000,"maximum":2999,"type":["integer","null"]},"quarter":{"minimum":1,"maximum":4,"type":["integer","null"]},"status":{"description":"`draft` | `confirmed`.","type":["string","null"]},"lines":{"description":"Eingefrorene Meldezeilen je Bestimmungsland und Satz.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"netTotal":{"description":"Summe der Nettoumsätze in EUR-Cent.","type":["integer","null"]},"taxTotal":{"description":"Summe der geschuldeten Steuer in EUR-Cent — der Betrag, der an das BZSt geht.","type":["integer","null"]},"entryCount":{"description":"Anzahl der Meldebuch-Zeilen hinter den Summen — Plausibilitätsanker für den Prüfer.","type":["integer","null"]},"confirmedAt":{"type":["string","null"]},"confirmedBy":{"type":["string","null"]},"confirmationNote":{"maxLength":500,"type":["string","null"]}}}],"description":"OSS-Quartalsmeldung (Doc 25 AP 10.3, Spec 04-51 §5).\n\n**Drei Schritte, bewusst getrennt:** erzeugen → freigeben → herunterladen.\n\nDie Freigabe ist das **Steuerberater-Gate** (06-R14) und hängt an einem eigenen Recht\n(`international.oss.confirm`). Sie ist nicht Bürokratie: eine OSS-Meldung ist eine\nSteuererklärung. Das System kann rechnen, aber nicht wissen, ob es alle Umsätze gesehen hat —\ndie Frage beantwortet ein Mensch, und die Antwort steht danach mit Name und Zeitpunkt im\nPrüfpfad.\n\nHerunterladen lässt sich nur eine FREIGEGEBENE Meldung: was beim BZSt eingereicht wird, soll\nniemand versehentlich aus einem Entwurf gezogen haben."},"OssThreshold-oss_threshold.read":{"type":"object","description":"Stand der EU-Lieferschwelle (Doc 25 AP 10.3, § 3c Abs. 4 UStG).\n\nDie Kennzahl, die man BRAUCHT, BEVOR etwas passiert: 10 000 € netto im Kalenderjahr, EU-weit\nzusammengerechnet, für Fernverkäufe an Privatpersonen. Wer sie überschreitet, versteuert ab dem\nüberschreitenden Umsatz im Bestimmungsland — praktisch heisst das, sich beim BZSt für OSS\nanzumelden. Eine Zahl, die man erst im Nachhinein sieht, kommt für diese Entscheidung zu spät.","properties":{"id":{"type":["string","null"]},"year":{"type":["integer","null"]},"netAmount":{"description":"Netto-Fernverkäufe an EU-Privatkunden im Jahr, in EUR-Cent.","type":["integer","null"]},"threshold":{"description":"Schwelle in EUR-Cent (Vorgabe 10 000 € = 1 000 000).","type":["integer","null"]},"exceeded":{"type":["boolean","null"]},"ossEnabled":{"description":"Ist die OSS-Teilnahme im System eingeschaltet? Überschritten UND aus = Handlungsbedarf.","type":["boolean","null"]},"remaining":{"description":"Rest bis zur Schwelle in EUR-Cent; 0 sobald überschritten.","type":["integer","null"]},"countries":{"description":"Aufteilung nach Bestimmungsland (ISO-Code => Netto in EUR-Cent).","type":["object","null"],"additionalProperties":{"type":"integer"}}}},"OssThreshold.jsonld-oss_threshold.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"year":{"type":["integer","null"]},"netAmount":{"description":"Netto-Fernverkäufe an EU-Privatkunden im Jahr, in EUR-Cent.","type":["integer","null"]},"threshold":{"description":"Schwelle in EUR-Cent (Vorgabe 10 000 € = 1 000 000).","type":["integer","null"]},"exceeded":{"type":["boolean","null"]},"ossEnabled":{"description":"Ist die OSS-Teilnahme im System eingeschaltet? Überschritten UND aus = Handlungsbedarf.","type":["boolean","null"]},"remaining":{"description":"Rest bis zur Schwelle in EUR-Cent; 0 sobald überschritten.","type":["integer","null"]},"countries":{"description":"Aufteilung nach Bestimmungsland (ISO-Code => Netto in EUR-Cent).","type":["object","null"],"additionalProperties":{"type":"integer"}}}}],"description":"Stand der EU-Lieferschwelle (Doc 25 AP 10.3, § 3c Abs. 4 UStG).\n\nDie Kennzahl, die man BRAUCHT, BEVOR etwas passiert: 10 000 € netto im Kalenderjahr, EU-weit\nzusammengerechnet, für Fernverkäufe an Privatpersonen. Wer sie überschreitet, versteuert ab dem\nüberschreitenden Umsatz im Bestimmungsland — praktisch heisst das, sich beim BZSt für OSS\nanzumelden. Eine Zahl, die man erst im Nachhinein sieht, kommt für diese Entscheidung zu spät."},"PackSession-pack_session.read":{"type":"object","description":"Der Packtisch (Doc 25 AP 4.3 / B4 (b)).\n\nFünf Operationen, weil der Packtisch fünf Handgriffe hat: identifizieren, scannen, Packstück\nzumachen, abschließen, abbrechen. Alles andere ist Anzeige.\n\n`identify` nimmt einen ROHEN Scan — Auftragsnummer oder Picklisten-Nummer. Am Packtisch tippt\nniemand eine ULID ab; der Scanner liefert, was auf dem Zettel steht.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"status":{"description":"open|completed|cancelled.","type":["string","null"]},"orderId":{"type":["integer","null"]},"orderNumber":{"type":["string","null"]},"pickListId":{"type":["integer","null"]},"carrierPluginKey":{"type":["string","null"]},"service":{"type":["string","null"]},"deliveryNoteNumber":{"description":"Lieferschein des abgeschlossenen Vorgangs.","type":["string","null"]},"trackingNumber":{"description":"Sendungsnummer des gekauften Etiketts (null ohne angebundenen Dienstleister).","type":["string","null"]},"complete":{"description":"Ist jede Position vollständig im Karton? Die Zahl, auf die der Packtisch wartet.","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"items":{"description":"Positionen: {ulid, description, productId, qtyExpected, qtyScanned, complete}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"packages":{"description":"Packstücke: {ulid, position, packagingCode, weightGrams, lengthMm, widthMm, heightMm}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"weighingMode":{"description":"Wiegepflicht-Stufe (`none`/`prefill`/`required`) — nur in der Waagen-Auskunft belegt.","type":["string","null"]},"scaleAvailable":{"description":"Ist am angefragten Arbeitsplatz eine Waage angebunden?","type":["boolean","null"]},"scaleWeightGrams":{"description":"Aktuelle Wägung in Gramm; null = keine Waage oder kein Wert.","type":["integer","null"]},"scaleStable":{"description":"Eingeschwungen? Nur ein stabiler Wert darf ein Packstück bepreisen.","type":["boolean","null"]},"computedWeightGrams":{"description":"Rechengewicht aus den Artikelgewichten der gescannten Mengen plus Zuschlag.","type":["integer","null"]}}},"PackSession-pack_session.write":{"type":"object","description":"Der Packtisch (Doc 25 AP 4.3 / B4 (b)).\n\nFünf Operationen, weil der Packtisch fünf Handgriffe hat: identifizieren, scannen, Packstück\nzumachen, abschließen, abbrechen. Alles andere ist Anzeige.\n\n`identify` nimmt einen ROHEN Scan — Auftragsnummer oder Picklisten-Nummer. Am Packtisch tippt\nniemand eine ULID ab; der Scanner liefert, was auf dem Zettel steht.","properties":{"carrierPluginKey":{"type":["string","null"]},"service":{"type":["string","null"]},"scan":{"description":"Roher Scan (nur Eingabe der identify-Operation).","type":["string","null"]}}},"PackSession.jsonld-pack_session.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"status":{"description":"open|completed|cancelled.","type":["string","null"]},"orderId":{"type":["integer","null"]},"orderNumber":{"type":["string","null"]},"pickListId":{"type":["integer","null"]},"carrierPluginKey":{"type":["string","null"]},"service":{"type":["string","null"]},"deliveryNoteNumber":{"description":"Lieferschein des abgeschlossenen Vorgangs.","type":["string","null"]},"trackingNumber":{"description":"Sendungsnummer des gekauften Etiketts (null ohne angebundenen Dienstleister).","type":["string","null"]},"complete":{"description":"Ist jede Position vollständig im Karton? Die Zahl, auf die der Packtisch wartet.","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"items":{"description":"Positionen: {ulid, description, productId, qtyExpected, qtyScanned, complete}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"packages":{"description":"Packstücke: {ulid, position, packagingCode, weightGrams, lengthMm, widthMm, heightMm}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"weighingMode":{"description":"Wiegepflicht-Stufe (`none`/`prefill`/`required`) — nur in der Waagen-Auskunft belegt.","type":["string","null"]},"scaleAvailable":{"description":"Ist am angefragten Arbeitsplatz eine Waage angebunden?","type":["boolean","null"]},"scaleWeightGrams":{"description":"Aktuelle Wägung in Gramm; null = keine Waage oder kein Wert.","type":["integer","null"]},"scaleStable":{"description":"Eingeschwungen? Nur ein stabiler Wert darf ein Packstück bepreisen.","type":["boolean","null"]},"computedWeightGrams":{"description":"Rechengewicht aus den Artikelgewichten der gescannten Mengen plus Zuschlag.","type":["integer","null"]}}}],"description":"Der Packtisch (Doc 25 AP 4.3 / B4 (b)).\n\nFünf Operationen, weil der Packtisch fünf Handgriffe hat: identifizieren, scannen, Packstück\nzumachen, abschließen, abbrechen. Alles andere ist Anzeige.\n\n`identify` nimmt einen ROHEN Scan — Auftragsnummer oder Picklisten-Nummer. Am Packtisch tippt\nniemand eine ULID ab; der Scanner liefert, was auf dem Zettel steht."},"Page-pages_page.move":{"type":"object","description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4).","properties":{"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"position":{"description":"Nur `POST /move`: Zielposition unter Geschwistern (0-basiert; fehlend = ans Ende).","type":["integer","null"]}}},"Page-pages_page.read":{"type":"object","description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workspaceUlid":{"description":"Beim Anlegen erforderlich; danach unveränderlich (Seiten wandern nur im Baum).","type":["string","null"]},"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"kind":{"enum":["doc","database"],"type":["string","null"]},"sourceEntity":{"maxLength":40,"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (z.B. work_item/deal/customer) — nur bei\n`kind=database` beim Anlegen, danach unveränderlich. Zeilen read-only aus der ERP-Quelle\n(deren Rechte-Gate greift).","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"ownerId":{"type":["integer","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasChildren":{"type":["boolean","null"]}}},"Page-pages_page.read_pages_page.collab":{"type":"object","description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workspaceUlid":{"description":"Beim Anlegen erforderlich; danach unveränderlich (Seiten wandern nur im Baum).","type":["string","null"]},"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"kind":{"enum":["doc","database"],"type":["string","null"]},"sourceEntity":{"maxLength":40,"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (z.B. work_item/deal/customer) — nur bei\n`kind=database` beim Anlegen, danach unveränderlich. Zeilen read-only aus der ERP-Quelle\n(deren Rechte-Gate greift).","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"ownerId":{"type":["integer","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasChildren":{"type":["boolean","null"]},"collabToken":{"type":["string","null"]},"documentUlid":{"description":"ULID des Kernel-Dokuments (== `doc`-Claim des Tickets) — WebSocket-`documentName` der SPA.","type":["string","null"]},"collabUrl":{"type":["string","null"]},"collabExpiresIn":{"type":["integer","null"]}}},"Page-pages_page.read_pages_page.detail":{"type":"object","description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workspaceUlid":{"description":"Beim Anlegen erforderlich; danach unveränderlich (Seiten wandern nur im Baum).","type":["string","null"]},"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"kind":{"enum":["doc","database"],"type":["string","null"]},"sourceEntity":{"maxLength":40,"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (z.B. work_item/deal/customer) — nur bei\n`kind=database` beim Anlegen, danach unveränderlich. Zeilen read-only aus der ERP-Quelle\n(deren Rechte-Gate greift).","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"ownerId":{"type":["integer","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasChildren":{"type":["boolean","null"]},"databaseUlid":{"description":"Datenbank-ULID bei `kind=database` (Schema via `GET /v1/pages/databases/{ulid}`).","type":["string","null"]},"canEdit":{"description":"Effektive Objekt-Rechte des Aufrufers (UI-Gates; dieselbe Logik wie der PageVoter).","type":["boolean","null"]},"canComment":{"type":["boolean","null"]},"canDelete":{"type":["boolean","null"]},"ancestorUlids":{"description":"ULIDs der Vorfahren, Wurzel zuerst — Baum-Aufdeckung bei Deep-Links.","type":["array","null"],"items":{"type":"string"}},"ancestors":{"description":"Vorfahren mit Anzeige-Daten (Wurzel zuerst) — Breadcrumb der Detail-Ansicht.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"coverFileId":{"description":"Cover-Bild (Platform File): int-ID schreibbar, `0` entfernt das Cover.","type":["integer","null"]},"coverFileUlid":{"description":"File-ULID des Covers (read-only) — authentifizierter Blob-Download der SPA.","type":["string","null"]},"blocks":{"description":"Block-Knoten des Kernel-Dokuments (17 §3). Schreiben ersetzt den Inhalt komplett.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"markdown":{"description":"Markdown-Repräsentation (MCP-Wire-Format); Schreiben hat Vorrang vor `blocks`.","type":["string","null"]},"publicToken":{"type":["string","null"]},"publicTokenExpiry":{"type":["string","null"]},"portalPublished":{"type":["boolean","null"]},"canShare":{"description":"Effektives Teilen-Recht des Aufrufers (UI-Gate).","type":["boolean","null"]},"accessGrants":{"description":"ACL-Grants: `[{principalType: role|user, principalId: int, level: read|comment|edit|full,\ninheritanceMode: extend|replace}]`. Schreiben ersetzt den kompletten Satz, erfordert\nfull-Level (Muster WorkspaceResource.accessGrants).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"canManageAccess":{"description":"Effektives ACL-Verwaltungsrecht des Aufrufers (UI-Gate; PageVoter::MANAGE_ACCESS).","type":["boolean","null"]}}},"Page-pages_page.write":{"type":"object","description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4).","properties":{"workspaceUlid":{"description":"Beim Anlegen erforderlich; danach unveränderlich (Seiten wandern nur im Baum).","type":["string","null"]},"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"kind":{"enum":["doc","database"],"type":["string","null"]},"sourceEntity":{"maxLength":40,"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (z.B. work_item/deal/customer) — nur bei\n`kind=database` beim Anlegen, danach unveränderlich. Zeilen read-only aus der ERP-Quelle\n(deren Rechte-Gate greift).","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"coverFileId":{"description":"Cover-Bild (Platform File): int-ID schreibbar, `0` entfernt das Cover.","type":["integer","null"]},"blocks":{"description":"Block-Knoten des Kernel-Dokuments (17 §3). Schreiben ersetzt den Inhalt komplett.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"markdown":{"description":"Markdown-Repräsentation (MCP-Wire-Format); Schreiben hat Vorrang vor `blocks`.","type":["string","null"]},"shareAction":{"enum":["create","rotate","revoke","portal"],"description":"Aktion des /share-Endpunkts: create|rotate (neuer Token), revoke (Widerruf), portal (Portal-Flag).","type":["string","null"]},"publicTokenExpiresAt":{"description":"Ablauf des Public-Links (nur bei create/rotate; null = unbefristet).","type":["string","null"],"format":"date-time"},"publishedToPortal":{"description":"Portal-Freigabe setzen (nur bei shareAction=portal).","type":["boolean","null"]},"accessGrants":{"description":"ACL-Grants: `[{principalType: role|user, principalId: int, level: read|comment|edit|full,\ninheritanceMode: extend|replace}]`. Schreiben ersetzt den kompletten Satz, erfordert\nfull-Level (Muster WorkspaceResource.accessGrants).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Page-pages_page.write.jsonMergePatch":{"type":"object","description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4).","properties":{"workspaceUlid":{"description":"Beim Anlegen erforderlich; danach unveränderlich (Seiten wandern nur im Baum).","type":["string","null"]},"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"kind":{"enum":["doc","database"],"type":["string","null"]},"sourceEntity":{"maxLength":40,"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (z.B. work_item/deal/customer) — nur bei\n`kind=database` beim Anlegen, danach unveränderlich. Zeilen read-only aus der ERP-Quelle\n(deren Rechte-Gate greift).","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"coverFileId":{"description":"Cover-Bild (Platform File): int-ID schreibbar, `0` entfernt das Cover.","type":["integer","null"]},"blocks":{"description":"Block-Knoten des Kernel-Dokuments (17 §3). Schreiben ersetzt den Inhalt komplett.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"markdown":{"description":"Markdown-Repräsentation (MCP-Wire-Format); Schreiben hat Vorrang vor `blocks`.","type":["string","null"]},"shareAction":{"enum":["create","rotate","revoke","portal"],"description":"Aktion des /share-Endpunkts: create|rotate (neuer Token), revoke (Widerruf), portal (Portal-Flag).","type":["string","null"]},"publicTokenExpiresAt":{"description":"Ablauf des Public-Links (nur bei create/rotate; null = unbefristet).","type":["string","null"],"format":"date-time"},"publishedToPortal":{"description":"Portal-Freigabe setzen (nur bei shareAction=portal).","type":["boolean","null"]},"accessGrants":{"description":"ACL-Grants: `[{principalType: role|user, principalId: int, level: read|comment|edit|full,\ninheritanceMode: extend|replace}]`. Schreiben ersetzt den kompletten Satz, erfordert\nfull-Level (Muster WorkspaceResource.accessGrants).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Page.jsonld-pages_page.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workspaceUlid":{"description":"Beim Anlegen erforderlich; danach unveränderlich (Seiten wandern nur im Baum).","type":["string","null"]},"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"kind":{"enum":["doc","database"],"type":["string","null"]},"sourceEntity":{"maxLength":40,"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (z.B. work_item/deal/customer) — nur bei\n`kind=database` beim Anlegen, danach unveränderlich. Zeilen read-only aus der ERP-Quelle\n(deren Rechte-Gate greift).","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"ownerId":{"type":["integer","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasChildren":{"type":["boolean","null"]}}}],"description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4)."},"Page.jsonld-pages_page.read_pages_page.collab":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workspaceUlid":{"description":"Beim Anlegen erforderlich; danach unveränderlich (Seiten wandern nur im Baum).","type":["string","null"]},"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"kind":{"enum":["doc","database"],"type":["string","null"]},"sourceEntity":{"maxLength":40,"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (z.B. work_item/deal/customer) — nur bei\n`kind=database` beim Anlegen, danach unveränderlich. Zeilen read-only aus der ERP-Quelle\n(deren Rechte-Gate greift).","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"ownerId":{"type":["integer","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasChildren":{"type":["boolean","null"]},"collabToken":{"type":["string","null"]},"documentUlid":{"description":"ULID des Kernel-Dokuments (== `doc`-Claim des Tickets) — WebSocket-`documentName` der SPA.","type":["string","null"]},"collabUrl":{"type":["string","null"]},"collabExpiresIn":{"type":["integer","null"]}}}],"description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4)."},"Page.jsonld-pages_page.read_pages_page.detail":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workspaceUlid":{"description":"Beim Anlegen erforderlich; danach unveränderlich (Seiten wandern nur im Baum).","type":["string","null"]},"parentUlid":{"description":"Ziel-Elternseite; Sentinel `root` = auf oberste Ebene verschieben.","type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"kind":{"enum":["doc","database"],"type":["string","null"]},"sourceEntity":{"maxLength":40,"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (z.B. work_item/deal/customer) — nur bei\n`kind=database` beim Anlegen, danach unveränderlich. Zeilen read-only aus der ERP-Quelle\n(deren Rechte-Gate greift).","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"ownerId":{"type":["integer","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasChildren":{"type":["boolean","null"]},"databaseUlid":{"description":"Datenbank-ULID bei `kind=database` (Schema via `GET /v1/pages/databases/{ulid}`).","type":["string","null"]},"canEdit":{"description":"Effektive Objekt-Rechte des Aufrufers (UI-Gates; dieselbe Logik wie der PageVoter).","type":["boolean","null"]},"canComment":{"type":["boolean","null"]},"canDelete":{"type":["boolean","null"]},"ancestorUlids":{"description":"ULIDs der Vorfahren, Wurzel zuerst — Baum-Aufdeckung bei Deep-Links.","type":["array","null"],"items":{"type":"string"}},"ancestors":{"description":"Vorfahren mit Anzeige-Daten (Wurzel zuerst) — Breadcrumb der Detail-Ansicht.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"coverFileId":{"description":"Cover-Bild (Platform File): int-ID schreibbar, `0` entfernt das Cover.","type":["integer","null"]},"coverFileUlid":{"description":"File-ULID des Covers (read-only) — authentifizierter Blob-Download der SPA.","type":["string","null"]},"blocks":{"description":"Block-Knoten des Kernel-Dokuments (17 §3). Schreiben ersetzt den Inhalt komplett.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"markdown":{"description":"Markdown-Repräsentation (MCP-Wire-Format); Schreiben hat Vorrang vor `blocks`.","type":["string","null"]},"publicToken":{"type":["string","null"]},"publicTokenExpiry":{"type":["string","null"]},"portalPublished":{"type":["boolean","null"]},"canShare":{"description":"Effektives Teilen-Recht des Aufrufers (UI-Gate).","type":["boolean","null"]},"accessGrants":{"description":"ACL-Grants: `[{principalType: role|user, principalId: int, level: read|comment|edit|full,\ninheritanceMode: extend|replace}]`. Schreiben ersetzt den kompletten Satz, erfordert\nfull-Level (Muster WorkspaceResource.accessGrants).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"canManageAccess":{"description":"Effektives ACL-Verwaltungsrecht des Aufrufers (UI-Gate; PageVoter::MANAGE_ACCESS).","type":["boolean","null"]}}}],"description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4)."},"PageBacklink-pages_backlink.read":{"type":"object","description":"Backlinks einer Seite (\"Verlinkt von\", 04-31 §4): Quellseiten mit `pageLink` auf diese Seite,\naus `pages_backlink` ({@see \\Octi\\Plugin\\Pages\\Service\\PageBacklinkIndexer}) — ACL-gefiltert,\nohne Papierkorb/gelöscht, sortiert nach Titel.","properties":{"ulid":{"description":"ULID der verlinkenden QUELL-Seite.","type":["string","null"]},"title":{"type":["string","null"]},"icon":{"description":"Emoji-Icon der Quell-Seite (Unicode) — null = Fallback-Icon im Client.","type":["string","null"]}}},"PageBacklink.jsonld-pages_backlink.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID der verlinkenden QUELL-Seite.","type":["string","null"]},"title":{"type":["string","null"]},"icon":{"description":"Emoji-Icon der Quell-Seite (Unicode) — null = Fallback-Icon im Client.","type":["string","null"]}}}],"description":"Backlinks einer Seite (\"Verlinkt von\", 04-31 §4): Quellseiten mit `pageLink` auf diese Seite,\naus `pages_backlink` ({@see \\Octi\\Plugin\\Pages\\Service\\PageBacklinkIndexer}) — ACL-gefiltert,\nohne Papierkorb/gelöscht, sortiert nach Titel."},"PageComment-pages_comment.read":{"type":"object","description":"Kommentare an Seiten (04-31 §3/§4): Threads (`parentUlid`), Block-Anker (`blockId`), Resolve,\nMentions (Notification-Pipeline). Lesen/Verfassen: PageVoter (Verfassen ab Level `comment`);\nAuflösen: `pages.comment.resolve`; Löschen: eigene immer, fremde nur mit `pages.comment.delete`.","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"parentUlid":{"description":"Thread-Elternkommentar (nur Wurzelkommentare haben Antworten).","type":["string","null"]},"blockId":{"maxLength":64,"description":"Stabile Block-ID des Editors (Anker); leer = seitenweiter Kommentar.","type":["string","null"]},"body":{"maxLength":10000,"type":["string","null"]},"bodyFormat":{"type":["string","null"]},"authorId":{"type":["integer","null"]},"authorName":{"type":["string","null"]},"mentionedUserIds":{"description":"Erwähnte Nutzer (User-IDs) — lösen Mention-Notifications aus.","type":["array","null"],"items":{"type":"integer"}},"resolved":{"description":"Resolve-Zustand; auf `/resolve` schreibbar (`false` öffnet den Thread wieder).","type":["boolean","null"]},"resolvedAt":{"type":["string","null"]},"resolvedById":{"type":["integer","null"]},"canDelete":{"description":"Effektives Löschrecht des Aufrufers (eigener Kommentar oder Moderation).","type":["boolean","null"]},"createdAt":{"type":["string","null"]}}},"PageComment-pages_comment.write":{"type":"object","description":"Kommentare an Seiten (04-31 §3/§4): Threads (`parentUlid`), Block-Anker (`blockId`), Resolve,\nMentions (Notification-Pipeline). Lesen/Verfassen: PageVoter (Verfassen ab Level `comment`);\nAuflösen: `pages.comment.resolve`; Löschen: eigene immer, fremde nur mit `pages.comment.delete`.","properties":{"parentUlid":{"description":"Thread-Elternkommentar (nur Wurzelkommentare haben Antworten).","type":["string","null"]},"blockId":{"maxLength":64,"description":"Stabile Block-ID des Editors (Anker); leer = seitenweiter Kommentar.","type":["string","null"]},"body":{"maxLength":10000,"type":["string","null"]},"mentionedUserIds":{"description":"Erwähnte Nutzer (User-IDs) — lösen Mention-Notifications aus.","type":["array","null"],"items":{"type":"integer"}},"resolved":{"description":"Resolve-Zustand; auf `/resolve` schreibbar (`false` öffnet den Thread wieder).","type":["boolean","null"]}}},"PageComment.jsonld-pages_comment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"parentUlid":{"description":"Thread-Elternkommentar (nur Wurzelkommentare haben Antworten).","type":["string","null"]},"blockId":{"maxLength":64,"description":"Stabile Block-ID des Editors (Anker); leer = seitenweiter Kommentar.","type":["string","null"]},"body":{"maxLength":10000,"type":["string","null"]},"bodyFormat":{"type":["string","null"]},"authorId":{"type":["integer","null"]},"authorName":{"type":["string","null"]},"mentionedUserIds":{"description":"Erwähnte Nutzer (User-IDs) — lösen Mention-Notifications aus.","type":["array","null"],"items":{"type":"integer"}},"resolved":{"description":"Resolve-Zustand; auf `/resolve` schreibbar (`false` öffnet den Thread wieder).","type":["boolean","null"]},"resolvedAt":{"type":["string","null"]},"resolvedById":{"type":["integer","null"]},"canDelete":{"description":"Effektives Löschrecht des Aufrufers (eigener Kommentar oder Moderation).","type":["boolean","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Kommentare an Seiten (04-31 §3/§4): Threads (`parentUlid`), Block-Anker (`blockId`), Resolve,\nMentions (Notification-Pipeline). Lesen/Verfassen: PageVoter (Verfassen ab Level `comment`);\nAuflösen: `pages.comment.resolve`; Löschen: eigene immer, fremde nur mit `pages.comment.delete`."},"PageExport-pages_export.read":{"type":"object","description":"Seiten-Export (04-31 §8, Stufe 5): Markdown (MCP-Wire-Format) oder escaptes HTML, read-only,\nPageVoter-gesichert. Inhalt als JSON (`content`); Download entsteht clientseitig. DB-Zeilen\nexportiert die Query-API (CSV).","properties":{"ulid":{"type":["string","null"]},"title":{"type":["string","null"]},"format":{"type":["string","null"]},"content":{"type":["string","null"]},"filename":{"description":"Dateinamens-Vorschlag für den Client-Download.","type":["string","null"]}}},"PageExport.jsonld-pages_export.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"title":{"type":["string","null"]},"format":{"type":["string","null"]},"content":{"type":["string","null"]},"filename":{"description":"Dateinamens-Vorschlag für den Client-Download.","type":["string","null"]}}}],"description":"Seiten-Export (04-31 §8, Stufe 5): Markdown (MCP-Wire-Format) oder escaptes HTML, read-only,\nPageVoter-gesichert. Inhalt als JSON (`content`); Download entsteht clientseitig. DB-Zeilen\nexportiert die Query-API (CSV)."},"PageFavorite-pages_favorite.read":{"type":"object","description":"Sidebar-Favoriten (04-31 §4/§5): Liste/Anlegen (idempotent je Nutzer+Seite)/Umsortieren/\nEntfernen, nur eigener Nutzer (Muster KnowledgeFavorite). Erfordert Lesezugriff (PageVoter);\nunsichtbare/gelöschte/Papierkorb-Seiten erscheinen nicht.","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"description":"Ziel-Seite (beim Anlegen erforderlich).","type":["string","null"]},"pageTitle":{"type":["string","null"]},"pageIcon":{"type":["string","null"]},"workspaceUlid":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"PageFavorite-pages_favorite.write":{"type":"object","description":"Sidebar-Favoriten (04-31 §4/§5): Liste/Anlegen (idempotent je Nutzer+Seite)/Umsortieren/\nEntfernen, nur eigener Nutzer (Muster KnowledgeFavorite). Erfordert Lesezugriff (PageVoter);\nunsichtbare/gelöschte/Papierkorb-Seiten erscheinen nicht.","properties":{"pageUlid":{"description":"Ziel-Seite (beim Anlegen erforderlich).","type":["string","null"]},"sortOrder":{"type":["integer","null"]}}},"PageFavorite-pages_favorite.write.jsonMergePatch":{"type":"object","description":"Sidebar-Favoriten (04-31 §4/§5): Liste/Anlegen (idempotent je Nutzer+Seite)/Umsortieren/\nEntfernen, nur eigener Nutzer (Muster KnowledgeFavorite). Erfordert Lesezugriff (PageVoter);\nunsichtbare/gelöschte/Papierkorb-Seiten erscheinen nicht.","properties":{"pageUlid":{"description":"Ziel-Seite (beim Anlegen erforderlich).","type":["string","null"]},"sortOrder":{"type":["integer","null"]}}},"PageFavorite.jsonld-pages_favorite.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"description":"Ziel-Seite (beim Anlegen erforderlich).","type":["string","null"]},"pageTitle":{"type":["string","null"]},"pageIcon":{"type":["string","null"]},"workspaceUlid":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Sidebar-Favoriten (04-31 §4/§5): Liste/Anlegen (idempotent je Nutzer+Seite)/Umsortieren/\nEntfernen, nur eigener Nutzer (Muster KnowledgeFavorite). Erfordert Lesezugriff (PageVoter);\nunsichtbare/gelöschte/Papierkorb-Seiten erscheinen nicht."},"PagePublic-pages_public.read":{"type":"object","description":"Read-only-Public-Link (04-31 §4/§6/§11.8, Stufe 5): unauth. (PUBLIC_ACCESS), Token-Auflösung —\nunbekannt/widerrufen/abgelaufen/Papierkorb/gelöscht alle 404 (Anti-Enumeration, Widerruf sofort).\nHTML ohne Embeds/entity_ref/Mentions; IP-Rate-Limit gegen Token-Raten.","properties":{"token":{"description":"Der Public-Token (Identifier der Antwort).","type":["string","null"]},"title":{"type":["string","null"]},"html":{"description":"Server-gerendertes, escaptes HTML ohne Live-Referenzen.","type":["string","null"]}}},"PagePublic.jsonld-pages_public.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"token":{"description":"Der Public-Token (Identifier der Antwort).","type":["string","null"]},"title":{"type":["string","null"]},"html":{"description":"Server-gerendertes, escaptes HTML ohne Live-Referenzen.","type":["string","null"]}}}],"description":"Read-only-Public-Link (04-31 §4/§6/§11.8, Stufe 5): unauth. (PUBLIC_ACCESS), Token-Auflösung —\nunbekannt/widerrufen/abgelaufen/Papierkorb/gelöscht alle 404 (Anti-Enumeration, Widerruf sofort).\nHTML ohne Embeds/entity_ref/Mentions; IP-Rate-Limit gegen Token-Raten."},"PageVersion-pages_version.read":{"type":"object","description":"Versions-Historie (04-31 §4, Kernel-Snapshots): Timeline, benannte Version anlegen,\nVersionsinhalt lesen (Diff-Grundlage `bodyText`/`bodyHtml`/`blocks`), Restore = NEUE Version\n(nie destruktiv, 17 §8 #6). Automatische Versionen schneidet der Schreibpfad zeitgesteuert.","properties":{"ulid":{"description":"Snapshot-ULID (Kernel `doc_snapshot`).","type":["string","null"]},"pageUlid":{"type":["string","null"]},"versionNo":{"type":["integer","null"]},"editSummary":{"maxLength":200,"type":["string","null"]},"isNamed":{"description":"true = bewusst benannte Version, false = automatischer Schnitt.","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"createdByName":{"type":["string","null"]}}},"PageVersion-pages_version.read_pages_version.detail":{"type":"object","description":"Versions-Historie (04-31 §4, Kernel-Snapshots): Timeline, benannte Version anlegen,\nVersionsinhalt lesen (Diff-Grundlage `bodyText`/`bodyHtml`/`blocks`), Restore = NEUE Version\n(nie destruktiv, 17 §8 #6). Automatische Versionen schneidet der Schreibpfad zeitgesteuert.","properties":{"ulid":{"description":"Snapshot-ULID (Kernel `doc_snapshot`).","type":["string","null"]},"pageUlid":{"type":["string","null"]},"versionNo":{"type":["integer","null"]},"editSummary":{"maxLength":200,"type":["string","null"]},"isNamed":{"description":"true = bewusst benannte Version, false = automatischer Schnitt.","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"createdByName":{"type":["string","null"]},"bodyText":{"description":"Plaintext des Versionsstands (Diff-Grundlage).","type":["string","null"]},"bodyHtml":{"description":"Server-gerendertes, escaptes HTML des Versionsstands (Vorschau).","type":["string","null"]},"blocks":{"description":"Block-Knoten des Versionsstands.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PageVersion-pages_version.write":{"type":"object","description":"Versions-Historie (04-31 §4, Kernel-Snapshots): Timeline, benannte Version anlegen,\nVersionsinhalt lesen (Diff-Grundlage `bodyText`/`bodyHtml`/`blocks`), Restore = NEUE Version\n(nie destruktiv, 17 §8 #6). Automatische Versionen schneidet der Schreibpfad zeitgesteuert.","properties":{"editSummary":{"maxLength":200,"type":["string","null"]}}},"PageVersion.jsonld-pages_version.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Snapshot-ULID (Kernel `doc_snapshot`).","type":["string","null"]},"pageUlid":{"type":["string","null"]},"versionNo":{"type":["integer","null"]},"editSummary":{"maxLength":200,"type":["string","null"]},"isNamed":{"description":"true = bewusst benannte Version, false = automatischer Schnitt.","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"createdByName":{"type":["string","null"]}}}],"description":"Versions-Historie (04-31 §4, Kernel-Snapshots): Timeline, benannte Version anlegen,\nVersionsinhalt lesen (Diff-Grundlage `bodyText`/`bodyHtml`/`blocks`), Restore = NEUE Version\n(nie destruktiv, 17 §8 #6). Automatische Versionen schneidet der Schreibpfad zeitgesteuert."},"PageVersion.jsonld-pages_version.read_pages_version.detail":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Snapshot-ULID (Kernel `doc_snapshot`).","type":["string","null"]},"pageUlid":{"type":["string","null"]},"versionNo":{"type":["integer","null"]},"editSummary":{"maxLength":200,"type":["string","null"]},"isNamed":{"description":"true = bewusst benannte Version, false = automatischer Schnitt.","type":["boolean","null"]},"createdAt":{"type":["string","null"]},"createdByName":{"type":["string","null"]},"bodyText":{"description":"Plaintext des Versionsstands (Diff-Grundlage).","type":["string","null"]},"bodyHtml":{"description":"Server-gerendertes, escaptes HTML des Versionsstands (Vorschau).","type":["string","null"]},"blocks":{"description":"Block-Knoten des Versionsstands.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Versions-Historie (04-31 §4, Kernel-Snapshots): Timeline, benannte Version anlegen,\nVersionsinhalt lesen (Diff-Grundlage `bodyText`/`bodyHtml`/`blocks`), Restore = NEUE Version\n(nie destruktiv, 17 §8 #6). Automatische Versionen schneidet der Schreibpfad zeitgesteuert."},"PagesAsk-pages_ask.read":{"type":"object","description":"„Ask your workspace\" (Doc 17 §7 Stufe 6c, 04-31 §4; Muster KnowledgeAsk): RAG-Antwort nur aus\nsichtbaren Seiten (Suchindex + ACL-Nachfilter), nennt Quellen. Ohne KI: Trefferliste-Fallback.","properties":{"id":{"type":["string","null"]},"question":{"maxLength":2000,"type":["string","null"]},"workspaceUlid":{"maxLength":26,"description":"Optional: Retrieval auf einen Workspace einschränken (ULID).","type":["string","null"]},"answer":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]},"sources":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"PagesAsk-pages_ask.write":{"type":"object","description":"„Ask your workspace\" (Doc 17 §7 Stufe 6c, 04-31 §4; Muster KnowledgeAsk): RAG-Antwort nur aus\nsichtbaren Seiten (Suchindex + ACL-Nachfilter), nennt Quellen. Ohne KI: Trefferliste-Fallback.","properties":{"question":{"maxLength":2000,"type":["string","null"]},"workspaceUlid":{"maxLength":26,"description":"Optional: Retrieval auf einen Workspace einschränken (ULID).","type":["string","null"]}}},"PagesAsk.jsonld-pages_ask.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"question":{"maxLength":2000,"type":["string","null"]},"workspaceUlid":{"maxLength":26,"description":"Optional: Retrieval auf einen Workspace einschränken (ULID).","type":["string","null"]},"answer":{"type":["string","null"]},"aiUsed":{"type":["boolean","null"]},"sources":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}}],"description":"„Ask your workspace\" (Doc 17 §7 Stufe 6c, 04-31 §4; Muster KnowledgeAsk): RAG-Antwort nur aus\nsichtbaren Seiten (Suchindex + ACL-Nachfilter), nennt Quellen. Ohne KI: Trefferliste-Fallback."},"PagesDatabase-pages_db.list":{"type":"object","description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`).","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"pageTitle":{"type":["string","null"]},"pageIcon":{"description":"Icon der Datenbank-Seite (Verwaltungs-Übersicht).","type":["string","null"]},"workspaceUlid":{"description":"Workspace der Datenbank-Seite (Inline-Embed: Navigation + Ziel-DB-Auswahl).","type":["string","null"]},"workspaceName":{"description":"Workspace-Name (Verwaltungs-Übersicht — erspart den Zweitabruf je Zeile).","type":["string","null"]},"propertyCount":{"description":"Aktive Properties (Verwaltungs-Übersicht).","type":["integer","null"]},"viewCount":{"description":"Geteilte + eigene Views (fremde persönliche Views zählen nicht mit).","type":["integer","null"]},"rowCount":{"description":"Aktive Zeilen (ohne Papierkorb/Vorlagen); null bei Linked Databases (virtuelle Zeilen).","type":["integer","null"]},"updatedAt":{"description":"Letzte Änderung der Datenbank-Seite.","type":["string","null"],"format":"date-time"},"canDelete":{"description":"Löschrecht des Aufrufers auf der Datenbank-Seite (UI-Gate der Papierkorb-Aktion).","type":["boolean","null"]},"sourceEntity":{"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (work_item/deal/customer) oder null.","type":["string","null"]},"canManage":{"type":["boolean","null"]}}},"PagesDatabase-pages_db.read":{"type":"object","description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`).","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"pageTitle":{"type":["string","null"]},"workspaceUlid":{"description":"Workspace der Datenbank-Seite (Inline-Embed: Navigation + Ziel-DB-Auswahl).","type":["string","null"]},"rowTitlePropertyKey":{"description":"Property-`key` der Titel-Spalte.","type":["string","null"]},"defaultViewUlid":{"type":["string","null"]},"properties":{"description":"{ulid, name, key, type, config, position}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"views":{"description":"{ulid, name, type, filters, sorts, groupByProperty, visibleProperties, configJson, shared, isDefault, position}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"sourceEntity":{"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (work_item/deal/customer) oder null.","type":["string","null"]},"canEditRows":{"description":"Effektive Rechte des Aufrufers (UI-Gates).","type":["boolean","null"]},"canManage":{"type":["boolean","null"]},"entityRefTypes":{"description":"Registrierte entity_ref-Zieltypen (Discoverability für den Picker).","type":["array","null"],"items":{"type":"string"}},"entityRefRollupOptions":{"description":"Kuratierte entity_ref-Rollup-Metriken je Zieltyp (Stufe 4): type → [{metric, label}].","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}}},"rollupAggregates":{"description":"Rollup-Aggregate (Relations-Rollups).","type":["array","null"],"items":{"type":"string"}},"formulaFunctions":{"description":"Formel-Funktions-Whitelist (Editor-Hilfe): name → {minArgs, maxArgs, returns}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}},"PagesDatabase-pages_db.read_pages_db.import":{"type":"object","description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`).","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"pageTitle":{"type":["string","null"]},"workspaceUlid":{"description":"Workspace der Datenbank-Seite (Inline-Embed: Navigation + Ziel-DB-Auswahl).","type":["string","null"]},"rowTitlePropertyKey":{"description":"Property-`key` der Titel-Spalte.","type":["string","null"]},"defaultViewUlid":{"type":["string","null"]},"properties":{"description":"{ulid, name, key, type, config, position}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"views":{"description":"{ulid, name, type, filters, sorts, groupByProperty, visibleProperties, configJson, shared, isDefault, position}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"sourceEntity":{"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (work_item/deal/customer) oder null.","type":["string","null"]},"canEditRows":{"description":"Effektive Rechte des Aufrufers (UI-Gates).","type":["boolean","null"]},"canManage":{"type":["boolean","null"]},"entityRefTypes":{"description":"Registrierte entity_ref-Zieltypen (Discoverability für den Picker).","type":["array","null"],"items":{"type":"string"}},"entityRefRollupOptions":{"description":"Kuratierte entity_ref-Rollup-Metriken je Zieltyp (Stufe 4): type → [{metric, label}].","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}}},"rollupAggregates":{"description":"Rollup-Aggregate (Relations-Rollups).","type":["array","null"],"items":{"type":"string"}},"formulaFunctions":{"description":"Formel-Funktions-Whitelist (Editor-Hilfe): name → {minArgs, maxArgs, returns}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"imported":{"type":["integer","null"]},"skippedCells":{"type":["integer","null"]},"createdProperties":{"type":["array","null"],"items":{"type":"string"}}}},"PagesDatabase-pages_db.write":{"type":"object","description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`).","properties":{"rowTitlePropertyKey":{"description":"Property-`key` der Titel-Spalte.","type":["string","null"]},"defaultViewUlid":{"type":["string","null"]},"csv":{"description":"CSV-Inhalt (Kopfzeile + Datenzeilen).","type":["string","null"]},"delimiter":{"type":["string","null"]}}},"PagesDatabase-pages_db.write.jsonMergePatch":{"type":"object","description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`).","properties":{"rowTitlePropertyKey":{"description":"Property-`key` der Titel-Spalte.","type":["string","null"]},"defaultViewUlid":{"type":["string","null"]},"csv":{"description":"CSV-Inhalt (Kopfzeile + Datenzeilen).","type":["string","null"]},"delimiter":{"type":["string","null"]}}},"PagesDatabase.jsonld-pages_db.list":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"pageTitle":{"type":["string","null"]},"pageIcon":{"description":"Icon der Datenbank-Seite (Verwaltungs-Übersicht).","type":["string","null"]},"workspaceUlid":{"description":"Workspace der Datenbank-Seite (Inline-Embed: Navigation + Ziel-DB-Auswahl).","type":["string","null"]},"workspaceName":{"description":"Workspace-Name (Verwaltungs-Übersicht — erspart den Zweitabruf je Zeile).","type":["string","null"]},"propertyCount":{"description":"Aktive Properties (Verwaltungs-Übersicht).","type":["integer","null"]},"viewCount":{"description":"Geteilte + eigene Views (fremde persönliche Views zählen nicht mit).","type":["integer","null"]},"rowCount":{"description":"Aktive Zeilen (ohne Papierkorb/Vorlagen); null bei Linked Databases (virtuelle Zeilen).","type":["integer","null"]},"updatedAt":{"description":"Letzte Änderung der Datenbank-Seite.","type":["string","null"],"format":"date-time"},"canDelete":{"description":"Löschrecht des Aufrufers auf der Datenbank-Seite (UI-Gate der Papierkorb-Aktion).","type":["boolean","null"]},"sourceEntity":{"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (work_item/deal/customer) oder null.","type":["string","null"]},"canManage":{"type":["boolean","null"]}}}],"description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`)."},"PagesDatabase.jsonld-pages_db.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"pageTitle":{"type":["string","null"]},"workspaceUlid":{"description":"Workspace der Datenbank-Seite (Inline-Embed: Navigation + Ziel-DB-Auswahl).","type":["string","null"]},"rowTitlePropertyKey":{"description":"Property-`key` der Titel-Spalte.","type":["string","null"]},"defaultViewUlid":{"type":["string","null"]},"properties":{"description":"{ulid, name, key, type, config, position}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"views":{"description":"{ulid, name, type, filters, sorts, groupByProperty, visibleProperties, configJson, shared, isDefault, position}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"sourceEntity":{"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (work_item/deal/customer) oder null.","type":["string","null"]},"canEditRows":{"description":"Effektive Rechte des Aufrufers (UI-Gates).","type":["boolean","null"]},"canManage":{"type":["boolean","null"]},"entityRefTypes":{"description":"Registrierte entity_ref-Zieltypen (Discoverability für den Picker).","type":["array","null"],"items":{"type":"string"}},"entityRefRollupOptions":{"description":"Kuratierte entity_ref-Rollup-Metriken je Zieltyp (Stufe 4): type → [{metric, label}].","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}}},"rollupAggregates":{"description":"Rollup-Aggregate (Relations-Rollups).","type":["array","null"],"items":{"type":"string"}},"formulaFunctions":{"description":"Formel-Funktions-Whitelist (Editor-Hilfe): name → {minArgs, maxArgs, returns}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}}],"description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`)."},"PagesDatabase.jsonld-pages_db.read_pages_db.import":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"pageTitle":{"type":["string","null"]},"workspaceUlid":{"description":"Workspace der Datenbank-Seite (Inline-Embed: Navigation + Ziel-DB-Auswahl).","type":["string","null"]},"rowTitlePropertyKey":{"description":"Property-`key` der Titel-Spalte.","type":["string","null"]},"defaultViewUlid":{"type":["string","null"]},"properties":{"description":"{ulid, name, key, type, config, position}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"views":{"description":"{ulid, name, type, filters, sorts, groupByProperty, visibleProperties, configJson, shared, isDefault, position}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"sourceEntity":{"description":"Linked Database (Doc 17 §7 Stufe 6b): Quell-Token (work_item/deal/customer) oder null.","type":["string","null"]},"canEditRows":{"description":"Effektive Rechte des Aufrufers (UI-Gates).","type":["boolean","null"]},"canManage":{"type":["boolean","null"]},"entityRefTypes":{"description":"Registrierte entity_ref-Zieltypen (Discoverability für den Picker).","type":["array","null"],"items":{"type":"string"}},"entityRefRollupOptions":{"description":"Kuratierte entity_ref-Rollup-Metriken je Zieltyp (Stufe 4): type → [{metric, label}].","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}}},"rollupAggregates":{"description":"Rollup-Aggregate (Relations-Rollups).","type":["array","null"],"items":{"type":"string"}},"formulaFunctions":{"description":"Formel-Funktions-Whitelist (Editor-Hilfe): name → {minArgs, maxArgs, returns}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"imported":{"type":["integer","null"]},"skippedCells":{"type":["integer","null"]},"createdProperties":{"type":["array","null"],"items":{"type":"string"}}}}],"description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`)."},"PagesEntityRefOption-pages_refopt.read":{"type":"object","description":"Entity-ref-Auswahl (04-31 §4, Stufe 3) — nur mit Katalog-Leserecht des Zieltyps;\nmarkenbezogene Ziele nur im eigenen Marken-Scope (kein Leak über den Picker).","properties":{"ulid":{"description":"Synthetischer Identifier \"type:id\".","type":["string","null"]},"type":{"type":["string","null"]},"id":{"description":"Die Zahl des referenzierten Objekts — NICHT der Bezeichner dieser Zeile.","type":["integer","null"]},"label":{"type":["string","null"]}}},"PagesEntityRefOption.jsonld-pages_refopt.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetischer Identifier \"type:id\".","type":["string","null"]},"type":{"type":["string","null"]},"id":{"description":"Die Zahl des referenzierten Objekts — NICHT der Bezeichner dieser Zeile.","type":["integer","null"]},"label":{"type":["string","null"]}}}],"description":"Entity-ref-Auswahl (04-31 §4, Stufe 3) — nur mit Katalog-Leserecht des Zieltyps;\nmarkenbezogene Ziele nur im eigenen Marken-Scope (kein Leak über den Picker)."},"PagesEntityRefTarget-pages_reftarget.read":{"type":"object","description":"Entity-ref-/Embed-Zieltypen des aktuellen Nutzers: nur Tokens, deren Katalog er lesen darf\n({@see \\Octi\\Plugin\\Pages\\Service\\EntityRefResolver::readableTypes()}) — kein Leak über die Typ-Liste.","properties":{"token":{"description":"Registry-Token des Zieltyps (z. B. `customer`, `deal`, `work_item`).","type":["string","null"]},"label":{"description":"Anzeige-Label (v1: Token — die UI darf i18n-verfeinern).","type":["string","null"]}}},"PagesEntityRefTarget.jsonld-pages_reftarget.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"token":{"description":"Registry-Token des Zieltyps (z. B. `customer`, `deal`, `work_item`).","type":["string","null"]},"label":{"description":"Anzeige-Label (v1: Token — die UI darf i18n-verfeinern).","type":["string","null"]}}}],"description":"Entity-ref-/Embed-Zieltypen des aktuellen Nutzers: nur Tokens, deren Katalog er lesen darf\n({@see \\Octi\\Plugin\\Pages\\Service\\EntityRefResolver::readableTypes()}) — kein Leak über die Typ-Liste."},"PagesImport-pages_import.read":{"type":"object","description":"Markdown-Bundle-Import (04-31 §10, bewusst Datei-Array statt Zip): Pfade wie `Ordner/Seite.md`\nbauen den Seitenbaum, `.md` → Seiten, `.csv` → Datenbank-Zeilen; Notion-Suffixe als\n`externalRefs.notionId` (idempotenter Re-Import). Rechte: `pages.page.create` + Workspace-Edit\n(Objekt-Check im Processor, wie PageProcessor::create).","properties":{"ulid":{"description":"Workspace-ULID als synthetischer Identifier der Antwort.","type":["string","null"]},"pages":{"type":["integer","null"]},"databases":{"type":["integer","null"]},"rows":{"type":["integer","null"]},"skipped":{"type":["integer","null"]}}},"PagesImport-pages_import.write":{"type":"object","description":"Markdown-Bundle-Import (04-31 §10, bewusst Datei-Array statt Zip): Pfade wie `Ordner/Seite.md`\nbauen den Seitenbaum, `.md` → Seiten, `.csv` → Datenbank-Zeilen; Notion-Suffixe als\n`externalRefs.notionId` (idempotenter Re-Import). Rechte: `pages.page.create` + Workspace-Edit\n(Objekt-Check im Processor, wie PageProcessor::create).","properties":{"workspaceUlid":{"type":["string","null"]},"parentUlid":{"description":"Optionale Ziel-Elternseite (Sentinel `root` = oberste Ebene).","type":["string","null"]},"files":{"description":"Erwartete Einträge: {path, content} — Form-Validierung im Processor (422), nicht im Denormalizer.","type":["array","null"],"items":{"type":["string","null"]}}}},"PagesImport.jsonld-pages_import.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Workspace-ULID als synthetischer Identifier der Antwort.","type":["string","null"]},"pages":{"type":["integer","null"]},"databases":{"type":["integer","null"]},"rows":{"type":["integer","null"]},"skipped":{"type":["integer","null"]}}}],"description":"Markdown-Bundle-Import (04-31 §10, bewusst Datei-Array statt Zip): Pfade wie `Ordner/Seite.md`\nbauen den Seitenbaum, `.md` → Seiten, `.csv` → Datenbank-Zeilen; Notion-Suffixe als\n`externalRefs.notionId` (idempotenter Re-Import). Rechte: `pages.page.create` + Workspace-Edit\n(Objekt-Check im Processor, wie PageProcessor::create)."},"PagesProperty-pages_property.read":{"type":"object","description":"Spaltendefinitionen (04-31 §3/§8, Stufe 3): Anlegen (Key = Slug aus Name, danach unveränderlich),\nUmbenennen/Konfigurieren/Umsortieren, Typ-Konvertierung per PATCH `type` (nur unterstützte\nPaare, sonst 422 — {@see \\Octi\\Plugin\\Pages\\Service\\PropertyTypeConverter}), Soft-Delete.\nSchema-Verwaltung (`pages.database.manage`); UI liest Schema über `GET …/databases/{ulid}`.","properties":{"ulid":{"type":["string","null"]},"databaseUlid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"key":{"description":"Unveränderlicher JSON-Schlüssel (wird beim Anlegen aus dem Namen erzeugt).","type":["string","null"]},"type":{"enum":["text","number","select","multi_select","status","date","person","checkbox","url","email","phone","files","relation","rollup","formula","created_at","created_by","updated_at","updated_by","entity_ref"],"type":["string","null"]},"config":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"position":{"type":["integer","null"]},"convertedRows":{"description":"Nur nach einer Typ-Konvertierung gesetzt: Anzahl der Zeilen mit konvertiertem Wert.","type":["integer","null"]},"clearedRows":{"description":"Nur nach einer Typ-Konvertierung gesetzt: Anzahl der Zeilen, deren Wert geleert wurde.","type":["integer","null"]}}},"PagesProperty-pages_property.write":{"type":"object","description":"Spaltendefinitionen (04-31 §3/§8, Stufe 3): Anlegen (Key = Slug aus Name, danach unveränderlich),\nUmbenennen/Konfigurieren/Umsortieren, Typ-Konvertierung per PATCH `type` (nur unterstützte\nPaare, sonst 422 — {@see \\Octi\\Plugin\\Pages\\Service\\PropertyTypeConverter}), Soft-Delete.\nSchema-Verwaltung (`pages.database.manage`); UI liest Schema über `GET …/databases/{ulid}`.","properties":{"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["text","number","select","multi_select","status","date","person","checkbox","url","email","phone","files","relation","rollup","formula","created_at","created_by","updated_at","updated_by","entity_ref"],"type":["string","null"]},"config":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"position":{"type":["integer","null"]}}},"PagesProperty-pages_property.write.jsonMergePatch":{"type":"object","description":"Spaltendefinitionen (04-31 §3/§8, Stufe 3): Anlegen (Key = Slug aus Name, danach unveränderlich),\nUmbenennen/Konfigurieren/Umsortieren, Typ-Konvertierung per PATCH `type` (nur unterstützte\nPaare, sonst 422 — {@see \\Octi\\Plugin\\Pages\\Service\\PropertyTypeConverter}), Soft-Delete.\nSchema-Verwaltung (`pages.database.manage`); UI liest Schema über `GET …/databases/{ulid}`.","properties":{"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["text","number","select","multi_select","status","date","person","checkbox","url","email","phone","files","relation","rollup","formula","created_at","created_by","updated_at","updated_by","entity_ref"],"type":["string","null"]},"config":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"position":{"type":["integer","null"]}}},"PagesProperty.jsonld-pages_property.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"databaseUlid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"key":{"description":"Unveränderlicher JSON-Schlüssel (wird beim Anlegen aus dem Namen erzeugt).","type":["string","null"]},"type":{"enum":["text","number","select","multi_select","status","date","person","checkbox","url","email","phone","files","relation","rollup","formula","created_at","created_by","updated_at","updated_by","entity_ref"],"type":["string","null"]},"config":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"position":{"type":["integer","null"]},"convertedRows":{"description":"Nur nach einer Typ-Konvertierung gesetzt: Anzahl der Zeilen mit konvertiertem Wert.","type":["integer","null"]},"clearedRows":{"description":"Nur nach einer Typ-Konvertierung gesetzt: Anzahl der Zeilen, deren Wert geleert wurde.","type":["integer","null"]}}}],"description":"Spaltendefinitionen (04-31 §3/§8, Stufe 3): Anlegen (Key = Slug aus Name, danach unveränderlich),\nUmbenennen/Konfigurieren/Umsortieren, Typ-Konvertierung per PATCH `type` (nur unterstützte\nPaare, sonst 422 — {@see \\Octi\\Plugin\\Pages\\Service\\PropertyTypeConverter}), Soft-Delete.\nSchema-Verwaltung (`pages.database.manage`); UI liest Schema über `GET …/databases/{ulid}`."},"PagesRow-pages_row.read":{"type":"object","description":"Datenbank-Zeilen (04-31 §3/§8, Stufe 3). Werte laufen über RowValueNormalizer (PATCH merged,\n`null` löscht Key); `blocks`/`markdown` öffnen die Zeile als Seite (Host `page_row`).\nDelete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`fromTemplateRowUlid` befüllt aus Zeilen-Template. Rechte: PageVoter der Datenbank-Seite (§7)\n— Lesen = Seiten-Lesezugriff, Schreiben = Seiten-Edit-Level. Listen: `POST …/databases/{ulid}/query`.","properties":{"ulid":{"type":["string","null"]},"databaseUlid":{"type":["string","null"]},"title":{"description":"Anzeige-Titel (Wert der Titel-Property).","type":["string","null"]},"values":{"description":"Property-`key` → Wert; PATCH merged (null löscht den Key).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"computed":{"description":"Materialisierte Formel-/Rollup-Ergebnisse (Stufe 4, read-only — Neuberechnung\nereignisgesteuert bzw. per Job).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasDocument":{"type":["boolean","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]},"createdBy":{"description":"Anzeigename des Erstellers (created_by-Property; aus Blameable aufgelöst, null = unbekannt).","type":["string","null"]},"updatedBy":{"description":"Anzeigename des letzten Bearbeiters (updated_by-Property; aus Blameable aufgelöst).","type":["string","null"]}}},"PagesRow-pages_row.read_pages_row.detail":{"type":"object","description":"Datenbank-Zeilen (04-31 §3/§8, Stufe 3). Werte laufen über RowValueNormalizer (PATCH merged,\n`null` löscht Key); `blocks`/`markdown` öffnen die Zeile als Seite (Host `page_row`).\nDelete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`fromTemplateRowUlid` befüllt aus Zeilen-Template. Rechte: PageVoter der Datenbank-Seite (§7)\n— Lesen = Seiten-Lesezugriff, Schreiben = Seiten-Edit-Level. Listen: `POST …/databases/{ulid}/query`.","properties":{"ulid":{"type":["string","null"]},"databaseUlid":{"type":["string","null"]},"title":{"description":"Anzeige-Titel (Wert der Titel-Property).","type":["string","null"]},"values":{"description":"Property-`key` → Wert; PATCH merged (null löscht den Key).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"computed":{"description":"Materialisierte Formel-/Rollup-Ergebnisse (Stufe 4, read-only — Neuberechnung\nereignisgesteuert bzw. per Job).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasDocument":{"type":["boolean","null"]},"fileLabels":{"description":"Datei-Labels der files-Werte: Datei-ID → {name, ulid}, nur im Zeilen-Detail (GET).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"blocks":{"description":"Zeile-als-Seite: Block-Inhalt des Kernel-Dokuments (Schreiben legt es lazy an).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"markdown":{"description":"Markdown-Repräsentation (MCP-Wire-Format); Schreiben hat Vorrang vor `blocks`.","type":["string","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]},"createdBy":{"description":"Anzeigename des Erstellers (created_by-Property; aus Blameable aufgelöst, null = unbekannt).","type":["string","null"]},"updatedBy":{"description":"Anzeigename des letzten Bearbeiters (updated_by-Property; aus Blameable aufgelöst).","type":["string","null"]}}},"PagesRow-pages_row.write":{"type":"object","description":"Datenbank-Zeilen (04-31 §3/§8, Stufe 3). Werte laufen über RowValueNormalizer (PATCH merged,\n`null` löscht Key); `blocks`/`markdown` öffnen die Zeile als Seite (Host `page_row`).\nDelete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`fromTemplateRowUlid` befüllt aus Zeilen-Template. Rechte: PageVoter der Datenbank-Seite (§7)\n— Lesen = Seiten-Lesezugriff, Schreiben = Seiten-Edit-Level. Listen: `POST …/databases/{ulid}/query`.","properties":{"values":{"description":"Property-`key` → Wert; PATCH merged (null löscht den Key).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"fromTemplateRowUlid":{"description":"Zeilen-Template als Vorbefüllung (nur beim Anlegen).","type":["string","null"]},"afterRowUlid":{"description":"Reorder (`/reorder`): Zeile hinter dieser Zeile einordnen (null = ganz nach oben bzw. via before).","type":["string","null"]},"beforeRowUlid":{"description":"Reorder (`/reorder`): Zeile vor dieser Zeile einordnen (Fallback, wenn kein `afterRowUlid`).","type":["string","null"]},"blocks":{"description":"Zeile-als-Seite: Block-Inhalt des Kernel-Dokuments (Schreiben legt es lazy an).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"markdown":{"description":"Markdown-Repräsentation (MCP-Wire-Format); Schreiben hat Vorrang vor `blocks`.","type":["string","null"]}}},"PagesRow-pages_row.write.jsonMergePatch":{"type":"object","description":"Datenbank-Zeilen (04-31 §3/§8, Stufe 3). Werte laufen über RowValueNormalizer (PATCH merged,\n`null` löscht Key); `blocks`/`markdown` öffnen die Zeile als Seite (Host `page_row`).\nDelete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`fromTemplateRowUlid` befüllt aus Zeilen-Template. Rechte: PageVoter der Datenbank-Seite (§7)\n— Lesen = Seiten-Lesezugriff, Schreiben = Seiten-Edit-Level. Listen: `POST …/databases/{ulid}/query`.","properties":{"values":{"description":"Property-`key` → Wert; PATCH merged (null löscht den Key).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"fromTemplateRowUlid":{"description":"Zeilen-Template als Vorbefüllung (nur beim Anlegen).","type":["string","null"]},"afterRowUlid":{"description":"Reorder (`/reorder`): Zeile hinter dieser Zeile einordnen (null = ganz nach oben bzw. via before).","type":["string","null"]},"beforeRowUlid":{"description":"Reorder (`/reorder`): Zeile vor dieser Zeile einordnen (Fallback, wenn kein `afterRowUlid`).","type":["string","null"]},"blocks":{"description":"Zeile-als-Seite: Block-Inhalt des Kernel-Dokuments (Schreiben legt es lazy an).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"markdown":{"description":"Markdown-Repräsentation (MCP-Wire-Format); Schreiben hat Vorrang vor `blocks`.","type":["string","null"]}}},"PagesRow.jsonld-pages_row.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"databaseUlid":{"type":["string","null"]},"title":{"description":"Anzeige-Titel (Wert der Titel-Property).","type":["string","null"]},"values":{"description":"Property-`key` → Wert; PATCH merged (null löscht den Key).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"computed":{"description":"Materialisierte Formel-/Rollup-Ergebnisse (Stufe 4, read-only — Neuberechnung\nereignisgesteuert bzw. per Job).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasDocument":{"type":["boolean","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]},"createdBy":{"description":"Anzeigename des Erstellers (created_by-Property; aus Blameable aufgelöst, null = unbekannt).","type":["string","null"]},"updatedBy":{"description":"Anzeigename des letzten Bearbeiters (updated_by-Property; aus Blameable aufgelöst).","type":["string","null"]}}}],"description":"Datenbank-Zeilen (04-31 §3/§8, Stufe 3). Werte laufen über RowValueNormalizer (PATCH merged,\n`null` löscht Key); `blocks`/`markdown` öffnen die Zeile als Seite (Host `page_row`).\nDelete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`fromTemplateRowUlid` befüllt aus Zeilen-Template. Rechte: PageVoter der Datenbank-Seite (§7)\n— Lesen = Seiten-Lesezugriff, Schreiben = Seiten-Edit-Level. Listen: `POST …/databases/{ulid}/query`."},"PagesRow.jsonld-pages_row.read_pages_row.detail":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"databaseUlid":{"type":["string","null"]},"title":{"description":"Anzeige-Titel (Wert der Titel-Property).","type":["string","null"]},"values":{"description":"Property-`key` → Wert; PATCH merged (null löscht den Key).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"computed":{"description":"Materialisierte Formel-/Rollup-Ergebnisse (Stufe 4, read-only — Neuberechnung\nereignisgesteuert bzw. per Job).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortOrder":{"type":["integer","null"]},"isTemplate":{"type":["boolean","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"},"hasDocument":{"type":["boolean","null"]},"fileLabels":{"description":"Datei-Labels der files-Werte: Datei-ID → {name, ulid}, nur im Zeilen-Detail (GET).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"blocks":{"description":"Zeile-als-Seite: Block-Inhalt des Kernel-Dokuments (Schreiben legt es lazy an).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"markdown":{"description":"Markdown-Repräsentation (MCP-Wire-Format); Schreiben hat Vorrang vor `blocks`.","type":["string","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]},"createdBy":{"description":"Anzeigename des Erstellers (created_by-Property; aus Blameable aufgelöst, null = unbekannt).","type":["string","null"]},"updatedBy":{"description":"Anzeigename des letzten Bearbeiters (updated_by-Property; aus Blameable aufgelöst).","type":["string","null"]}}}],"description":"Datenbank-Zeilen (04-31 §3/§8, Stufe 3). Werte laufen über RowValueNormalizer (PATCH merged,\n`null` löscht Key); `blocks`/`markdown` öffnen die Zeile als Seite (Host `page_row`).\nDelete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`fromTemplateRowUlid` befüllt aus Zeilen-Template. Rechte: PageVoter der Datenbank-Seite (§7)\n— Lesen = Seiten-Lesezugriff, Schreiben = Seiten-Edit-Level. Listen: `POST …/databases/{ulid}/query`."},"PagesRowQuery-pages_query.read":{"type":"object","description":"Zeilen-Query mit Filter-DSL der Views (04-31 §8, Stufe 3): `viewUlid` übernimmt Filter/\nSortierung (Body-`filters`/`sorts` übersteuern), paginiert über die Index-Tabelle (<200ms,\n§11.2). Anreicherungen ohne N+1: `personLabels`, `entityRefLabels` (fehlt = kein Zugriff,\n§11.3), `relationTitles`/`incomingRelations`.","properties":{"ulid":{"description":"Datenbank-ULID (synthetischer Identifier der Antwort).","type":["string","null"]},"aggregations":{"description":"Spalten-Aggregationen (\"Calculate\"-Fußzeile). Request: `[{property, fn}]` (max. 12, fn ∈\n{@see \\Octi\\Plugin\\Pages\\Service\\RowQueryService::AGG_FNS}). Antwort: `\"<propertyKey>:<fn>\"` →\nWert, über die KOMPLETTE gefilterte Menge (unabhängig von Pagination; Linked DBs: ggf.","type":["array","null"],"items":{"type":["string","null"]}},"rows":{"description":"{ulid, title, values, sortOrder, isTemplate, archivedAt, hasDocument, createdAt, updatedAt}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"total":{"type":["integer","null"]},"sourceEntity":{"description":"Linked Database (Stufe 6b): Quell-Token der virtuellen Zeilen (null = normale DB).","type":["string","null"]},"sourceCapped":{"description":"Linked Database: true = Quelle größer als v1-Deckel\n({@see \\Octi\\Plugin\\Pages\\Service\\LinkedSourceCatalog::ROW_CAP}) — Filter/Sortierung liefen\nnur über den geladenen Abschnitt (Hinweis fürs UI).","type":["boolean","null"]},"currentPage":{"type":["integer","null"]},"perPage":{"type":["integer","null"]},"personLabels":{"description":"User-ID → Anzeigename (person-Properties; PHP macht numerische Keys zu int)","type":["array","null"],"items":{"type":"string"}},"entityRefLabels":{"description":"\"type:id\" → Chip (entity_ref)","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}},"fileLabels":{"description":"Datei-Labels der files-Properties: Datei-ID → {name, ulid}. FileVoter(VIEW)-gefiltert —\nohne Leserecht fehlt der Eintrag (UI: #id-Fallback).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"relationTitles":{"description":"Zeilen-ULID → Titel (relation-Properties)","type":["object","null"],"additionalProperties":{"type":"string"}},"incomingRelations":{"description":"Eingehende Verknüpfungen (beidseitige Sichtbarkeit, 04-31 §4): Zeilen-ULID →\nListe {rowUlid, databaseUlid, title}.","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}},"PagesRowQuery-pages_query.write":{"type":"object","description":"Zeilen-Query mit Filter-DSL der Views (04-31 §8, Stufe 3): `viewUlid` übernimmt Filter/\nSortierung (Body-`filters`/`sorts` übersteuern), paginiert über die Index-Tabelle (<200ms,\n§11.2). Anreicherungen ohne N+1: `personLabels`, `entityRefLabels` (fehlt = kein Zugriff,\n§11.3), `relationTitles`/`incomingRelations`.","properties":{"viewUlid":{"type":["string","null"]},"filters":{"description":"Filter-DSL: Blatt {property, op, value} ODER verschachtelte Gruppe {match, conditions: [...]}\n(rekursiv, max. Tiefe 3, max. 20 Blätter — {@see \\Octi\\Plugin\\Pages\\Service\\RowQueryService::assertValidFilters()}).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sorts":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"page":{"type":["integer","null"]},"itemsPerPage":{"type":["integer","null"]},"trashed":{"description":"Zeilen-Papierkorb statt aktiver Zeilen.","type":["boolean","null"]},"templates":{"description":"Zeilen-Templates statt normaler Zeilen.","type":["boolean","null"]},"aggregations":{"description":"Spalten-Aggregationen (\"Calculate\"-Fußzeile). Request: `[{property, fn}]` (max. 12, fn ∈\n{@see \\Octi\\Plugin\\Pages\\Service\\RowQueryService::AGG_FNS}). Antwort: `\"<propertyKey>:<fn>\"` →\nWert, über die KOMPLETTE gefilterte Menge (unabhängig von Pagination; Linked DBs: ggf.","type":["array","null"],"items":{"type":["string","null"]}}}},"PagesRowQuery.jsonld-pages_query.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Datenbank-ULID (synthetischer Identifier der Antwort).","type":["string","null"]},"aggregations":{"description":"Spalten-Aggregationen (\"Calculate\"-Fußzeile). Request: `[{property, fn}]` (max. 12, fn ∈\n{@see \\Octi\\Plugin\\Pages\\Service\\RowQueryService::AGG_FNS}). Antwort: `\"<propertyKey>:<fn>\"` →\nWert, über die KOMPLETTE gefilterte Menge (unabhängig von Pagination; Linked DBs: ggf.","type":["array","null"],"items":{"type":["string","null"]}},"rows":{"description":"{ulid, title, values, sortOrder, isTemplate, archivedAt, hasDocument, createdAt, updatedAt}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"total":{"type":["integer","null"]},"sourceEntity":{"description":"Linked Database (Stufe 6b): Quell-Token der virtuellen Zeilen (null = normale DB).","type":["string","null"]},"sourceCapped":{"description":"Linked Database: true = Quelle größer als v1-Deckel\n({@see \\Octi\\Plugin\\Pages\\Service\\LinkedSourceCatalog::ROW_CAP}) — Filter/Sortierung liefen\nnur über den geladenen Abschnitt (Hinweis fürs UI).","type":["boolean","null"]},"currentPage":{"type":["integer","null"]},"perPage":{"type":["integer","null"]},"personLabels":{"description":"User-ID → Anzeigename (person-Properties; PHP macht numerische Keys zu int)","type":["array","null"],"items":{"type":"string"}},"entityRefLabels":{"description":"\"type:id\" → Chip (entity_ref)","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}},"fileLabels":{"description":"Datei-Labels der files-Properties: Datei-ID → {name, ulid}. FileVoter(VIEW)-gefiltert —\nohne Leserecht fehlt der Eintrag (UI: #id-Fallback).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"relationTitles":{"description":"Zeilen-ULID → Titel (relation-Properties)","type":["object","null"],"additionalProperties":{"type":"string"}},"incomingRelations":{"description":"Eingehende Verknüpfungen (beidseitige Sichtbarkeit, 04-31 §4): Zeilen-ULID →\nListe {rowUlid, databaseUlid, title}.","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}}],"description":"Zeilen-Query mit Filter-DSL der Views (04-31 §8, Stufe 3): `viewUlid` übernimmt Filter/\nSortierung (Body-`filters`/`sorts` übersteuern), paginiert über die Index-Tabelle (<200ms,\n§11.2). Anreicherungen ohne N+1: `personLabels`, `entityRefLabels` (fehlt = kein Zugriff,\n§11.3), `relationTitles`/`incomingRelations`."},"PagesView-pages_view.read":{"type":"object","description":"Views einer Datenbank (04-31 §3/§8, Stufe 3): Tabelle/Board/Liste/Kalender/Galerie/Zeitleiste\nmit Filter-/Sort-DSL, Gruppierung, Spalten-Whitelist. Persönliche Views (`shared=false`):\nLesezugriff genügt; geteilte Views: `pages.database.manage`. Schema: `GET …/databases/{ulid}`.","properties":{"ulid":{"type":["string","null"]},"databaseUlid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["table","board","list","calendar","gallery","timeline"],"type":["string","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sorts":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"groupByProperty":{"maxLength":60,"type":["string","null"]},"visibleProperties":{"type":["array","null"],"items":{"type":"string"}},"configJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shared":{"description":"true = geteilte View (Anlegen/Ändern erfordert Schema-Verwaltung).","type":["boolean","null"]},"isDefault":{"type":["boolean","null"]},"position":{"type":["integer","null"]}}},"PagesView-pages_view.write":{"type":"object","description":"Views einer Datenbank (04-31 §3/§8, Stufe 3): Tabelle/Board/Liste/Kalender/Galerie/Zeitleiste\nmit Filter-/Sort-DSL, Gruppierung, Spalten-Whitelist. Persönliche Views (`shared=false`):\nLesezugriff genügt; geteilte Views: `pages.database.manage`. Schema: `GET …/databases/{ulid}`.","properties":{"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["table","board","list","calendar","gallery","timeline"],"type":["string","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sorts":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"groupByProperty":{"maxLength":60,"type":["string","null"]},"visibleProperties":{"type":["array","null"],"items":{"type":"string"}},"configJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shared":{"description":"true = geteilte View (Anlegen/Ändern erfordert Schema-Verwaltung).","type":["boolean","null"]},"position":{"type":["integer","null"]}}},"PagesView-pages_view.write.jsonMergePatch":{"type":"object","description":"Views einer Datenbank (04-31 §3/§8, Stufe 3): Tabelle/Board/Liste/Kalender/Galerie/Zeitleiste\nmit Filter-/Sort-DSL, Gruppierung, Spalten-Whitelist. Persönliche Views (`shared=false`):\nLesezugriff genügt; geteilte Views: `pages.database.manage`. Schema: `GET …/databases/{ulid}`.","properties":{"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["table","board","list","calendar","gallery","timeline"],"type":["string","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sorts":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"groupByProperty":{"maxLength":60,"type":["string","null"]},"visibleProperties":{"type":["array","null"],"items":{"type":"string"}},"configJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shared":{"description":"true = geteilte View (Anlegen/Ändern erfordert Schema-Verwaltung).","type":["boolean","null"]},"position":{"type":["integer","null"]}}},"PagesView.jsonld-pages_view.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"databaseUlid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["table","board","list","calendar","gallery","timeline"],"type":["string","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sorts":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"groupByProperty":{"maxLength":60,"type":["string","null"]},"visibleProperties":{"type":["array","null"],"items":{"type":"string"}},"configJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shared":{"description":"true = geteilte View (Anlegen/Ändern erfordert Schema-Verwaltung).","type":["boolean","null"]},"isDefault":{"type":["boolean","null"]},"position":{"type":["integer","null"]}}}],"description":"Views einer Datenbank (04-31 §3/§8, Stufe 3): Tabelle/Board/Liste/Kalender/Galerie/Zeitleiste\nmit Filter-/Sort-DSL, Gruppierung, Spalten-Whitelist. Persönliche Views (`shared=false`):\nLesezugriff genügt; geteilte Views: `pages.database.manage`. Schema: `GET …/databases/{ulid}`."},"PagesWorkspace-pages_workspace.read":{"type":"object","description":"Workspace-API (04-31 §8): Container des Seitenbaums + ACL-Grant-Verwaltung (eingebettete\nListe — PATCH `accessGrants` ersetzt den kompletten Satz).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"type":["string","null"]},"slug":{"maxLength":100,"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","description":"Wird beim Anlegen aus dem Namen abgeleitet, wenn nicht gesetzt.","type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"color":{"maxLength":20,"type":["string","null"]},"type":{"enum":["org","team","private"],"type":["string","null"]},"visibility":{"enum":["org","restricted"],"type":["string","null"]},"brandScope":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"accessGrants":{"description":"ACL-Grants (04-31 §6): `[{principalType: role|user, principalId: int, level: read|comment|edit|full}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"canManage":{"description":"Effektives Manage-Recht des Aufrufers (UI-Gate Einstellungen/Löschen; dieselbe Logik wie der WorkspaceVoter).","type":["boolean","null"]}}},"PagesWorkspace-pages_workspace.write":{"type":"object","description":"Workspace-API (04-31 §8): Container des Seitenbaums + ACL-Grant-Verwaltung (eingebettete\nListe — PATCH `accessGrants` ersetzt den kompletten Satz).","properties":{"name":{"maxLength":120,"type":["string","null"]},"slug":{"maxLength":100,"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","description":"Wird beim Anlegen aus dem Namen abgeleitet, wenn nicht gesetzt.","type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"color":{"maxLength":20,"type":["string","null"]},"type":{"enum":["org","team","private"],"type":["string","null"]},"visibility":{"enum":["org","restricted"],"type":["string","null"]},"brandScope":{"type":["integer","null"]},"accessGrants":{"description":"ACL-Grants (04-31 §6): `[{principalType: role|user, principalId: int, level: read|comment|edit|full}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PagesWorkspace-pages_workspace.write.jsonMergePatch":{"type":"object","description":"Workspace-API (04-31 §8): Container des Seitenbaums + ACL-Grant-Verwaltung (eingebettete\nListe — PATCH `accessGrants` ersetzt den kompletten Satz).","properties":{"name":{"maxLength":120,"type":["string","null"]},"slug":{"maxLength":100,"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","description":"Wird beim Anlegen aus dem Namen abgeleitet, wenn nicht gesetzt.","type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"color":{"maxLength":20,"type":["string","null"]},"type":{"enum":["org","team","private"],"type":["string","null"]},"visibility":{"enum":["org","restricted"],"type":["string","null"]},"brandScope":{"type":["integer","null"]},"accessGrants":{"description":"ACL-Grants (04-31 §6): `[{principalType: role|user, principalId: int, level: read|comment|edit|full}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PagesWorkspace.jsonld-pages_workspace.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"type":["string","null"]},"slug":{"maxLength":100,"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","description":"Wird beim Anlegen aus dem Namen abgeleitet, wenn nicht gesetzt.","type":["string","null"]},"icon":{"maxLength":40,"type":["string","null"]},"color":{"maxLength":20,"type":["string","null"]},"type":{"enum":["org","team","private"],"type":["string","null"]},"visibility":{"enum":["org","restricted"],"type":["string","null"]},"brandScope":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"accessGrants":{"description":"ACL-Grants (04-31 §6): `[{principalType: role|user, principalId: int, level: read|comment|edit|full}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"canManage":{"description":"Effektives Manage-Recht des Aufrufers (UI-Gate Einstellungen/Löschen; dieselbe Logik wie der WorkspaceVoter).","type":["boolean","null"]}}}],"description":"Workspace-API (04-31 §8): Container des Seitenbaums + ACL-Grant-Verwaltung (eingebettete\nListe — PATCH `accessGrants` ersetzt den kompletten Satz)."},"PartnerRole-partner_role.read":{"type":"object","description":"Geschäftspartner-Rollen eines Kunden-Stammsatzes (15 §8b, ENT-ERP-PARTNER-01,\nread-only): Core-Kundenrolle + additive Plugin-Rollen (Lieferant/Affiliate), je\neigene Nummer. Filter: `customerId` (Pflicht). Rollen deaktivierter Plugins: nicht (R1).","properties":{"id":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"roleKey":{"type":["string","null"]},"label":{"type":["string","null"]},"number":{"description":"Rollen-eigene Nummer (Kunden-/Lieferanten-/Partnernummer, Nummern-Engine 15 §3).","type":["string","null"]},"active":{"type":["boolean","null"]},"detail":{"description":"rollen-spezifische Zusatzfelder des liefernden Plugins","type":"object","additionalProperties":{"type":["string","null"]}}}},"PartnerRole.jsonld-partner_role.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"roleKey":{"type":["string","null"]},"label":{"type":["string","null"]},"number":{"description":"Rollen-eigene Nummer (Kunden-/Lieferanten-/Partnernummer, Nummern-Engine 15 §3).","type":["string","null"]},"active":{"type":["boolean","null"]},"detail":{"description":"rollen-spezifische Zusatzfelder des liefernden Plugins","type":"object","additionalProperties":{"type":["string","null"]}}}}],"description":"Geschäftspartner-Rollen eines Kunden-Stammsatzes (15 §8b, ENT-ERP-PARTNER-01,\nread-only): Core-Kundenrolle + additive Plugin-Rollen (Lieferant/Affiliate), je\neigene Nummer. Filter: `customerId` (Pflicht). Rollen deaktivierter Plugins: nicht (R1)."},"PaymentTerm-payment_term.read":{"type":"object","description":"Zahlungsbedingungen als Kernel-Stammdatum (Doc 25 AP 0.1, ENT-ERP-PAR-PAYTERM-01):\nNettofrist + mehrstufiges Skonto, konsumiert von Angebot/Auftrag/Rechnung/Bestellung.\n\n- **Lesen mit ROLE_USER** (Auswahlliste am Beleg — Muster {@see TaxRateResource}), Schreiben\n  nur mit `platform.settings.manage`.\n- Kein Marken-Scope: Stammdatum (CLAUDE.md-Konvention); die Marke hängt am Beleg.","properties":{"ulid":{"type":["string","null"]},"termKey":{"maxLength":50,"pattern":"^([a-z0-9_]+)$","description":"Stabiler Schlüssel (z. B. `net_14`) — nach Anlage unveränderlich.","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"netDays":{"minimum":0,"maximum":3650,"description":"Nettofrist in Tagen ab Belegdatum.","type":["integer","null"]},"discounts":{"description":"Skontostufen `[{days, percentBp}, …]` — Satz in Basispunkten (250 = 2,50 %).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"scope":{"enum":["sales","purchase","both"],"description":"sales | purchase | both.","type":["string","null"]},"documentText":{"description":"Freitext für den Belegdruck; null = die Vorlage formuliert aus den Zahlen.","type":["string","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"summary":{"description":"Kurzform für Listen/Belege, z. B. „2 % 10 Tage, netto 30\".","type":["string","null"]}}},"PaymentTerm-payment_term.write":{"type":"object","description":"Zahlungsbedingungen als Kernel-Stammdatum (Doc 25 AP 0.1, ENT-ERP-PAR-PAYTERM-01):\nNettofrist + mehrstufiges Skonto, konsumiert von Angebot/Auftrag/Rechnung/Bestellung.\n\n- **Lesen mit ROLE_USER** (Auswahlliste am Beleg — Muster {@see TaxRateResource}), Schreiben\n  nur mit `platform.settings.manage`.\n- Kein Marken-Scope: Stammdatum (CLAUDE.md-Konvention); die Marke hängt am Beleg.","required":["termKey","name"],"properties":{"termKey":{"maxLength":50,"pattern":"^([a-z0-9_]+)$","description":"Stabiler Schlüssel (z. B. `net_14`) — nach Anlage unveränderlich.","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"netDays":{"minimum":0,"maximum":3650,"description":"Nettofrist in Tagen ab Belegdatum.","type":["integer","null"]},"discounts":{"description":"Skontostufen `[{days, percentBp}, …]` — Satz in Basispunkten (250 = 2,50 %).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"scope":{"enum":["sales","purchase","both"],"description":"sales | purchase | both.","type":["string","null"]},"documentText":{"description":"Freitext für den Belegdruck; null = die Vorlage formuliert aus den Zahlen.","type":["string","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"PaymentTerm-payment_term.write.jsonMergePatch":{"type":"object","description":"Zahlungsbedingungen als Kernel-Stammdatum (Doc 25 AP 0.1, ENT-ERP-PAR-PAYTERM-01):\nNettofrist + mehrstufiges Skonto, konsumiert von Angebot/Auftrag/Rechnung/Bestellung.\n\n- **Lesen mit ROLE_USER** (Auswahlliste am Beleg — Muster {@see TaxRateResource}), Schreiben\n  nur mit `platform.settings.manage`.\n- Kein Marken-Scope: Stammdatum (CLAUDE.md-Konvention); die Marke hängt am Beleg.","properties":{"termKey":{"maxLength":50,"pattern":"^([a-z0-9_]+)$","description":"Stabiler Schlüssel (z. B. `net_14`) — nach Anlage unveränderlich.","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"netDays":{"minimum":0,"maximum":3650,"description":"Nettofrist in Tagen ab Belegdatum.","type":["integer","null"]},"discounts":{"description":"Skontostufen `[{days, percentBp}, …]` — Satz in Basispunkten (250 = 2,50 %).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"scope":{"enum":["sales","purchase","both"],"description":"sales | purchase | both.","type":["string","null"]},"documentText":{"description":"Freitext für den Belegdruck; null = die Vorlage formuliert aus den Zahlen.","type":["string","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"PaymentTerm.jsonld-payment_term.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"termKey":{"maxLength":50,"pattern":"^([a-z0-9_]+)$","description":"Stabiler Schlüssel (z. B. `net_14`) — nach Anlage unveränderlich.","type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"netDays":{"minimum":0,"maximum":3650,"description":"Nettofrist in Tagen ab Belegdatum.","type":["integer","null"]},"discounts":{"description":"Skontostufen `[{days, percentBp}, …]` — Satz in Basispunkten (250 = 2,50 %).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"scope":{"enum":["sales","purchase","both"],"description":"sales | purchase | both.","type":["string","null"]},"documentText":{"description":"Freitext für den Belegdruck; null = die Vorlage formuliert aus den Zahlen.","type":["string","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"summary":{"description":"Kurzform für Listen/Belege, z. B. „2 % 10 Tage, netto 30\".","type":["string","null"]}}}],"description":"Zahlungsbedingungen als Kernel-Stammdatum (Doc 25 AP 0.1, ENT-ERP-PAR-PAYTERM-01):\nNettofrist + mehrstufiges Skonto, konsumiert von Angebot/Auftrag/Rechnung/Bestellung.\n\n- **Lesen mit ROLE_USER** (Auswahlliste am Beleg — Muster {@see TaxRateResource}), Schreiben\n  nur mit `platform.settings.manage`.\n- Kein Marken-Scope: Stammdatum (CLAUDE.md-Konvention); die Marke hängt am Beleg."},"PermissionCatalog-permission_catalog.read":{"type":"object","properties":{"name":{"default":"","type":"string"},"module":{"type":["string","null"]},"description":{"type":["string","null"]},"reserved":{"description":"Recht ist deklariert, wird aber von keiner Operation erzwungen (reserviert).","default":false,"type":"boolean"},"reservedReason":{"description":"Grund der Reservierung im Klartext; null bei einem wirksamen Recht.","type":["string","null"]}}},"PermissionCatalog.jsonld-permission_catalog.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"name":{"default":"","type":"string"},"module":{"type":["string","null"]},"description":{"type":["string","null"]},"reserved":{"description":"Recht ist deklariert, wird aber von keiner Operation erzwungen (reserviert).","default":false,"type":"boolean"},"reservedReason":{"description":"Grund der Reservierung im Klartext; null bei einem wirksamen Recht.","type":["string","null"]}}}]},"PickAlternativeBin-pick_alt_bin.read":{"type":"object","description":"Ersatzplätze zu einem Greifvorgang (Doc 25 AP 4.2).\n\n- eigene Operation statt Feld am Picklisten-Detail: sonst je Position eine Platz-Abfrage bei\n  jedem Listen-Aufruf, für eine Auskunft, die nur bei „Platz leer\" gebraucht wird","properties":{"ulid":{"description":"ULID des Greifvorgangs.","type":["string","null"]},"bins":{"description":"Plätze mit Bestand: {binId, code, type, qty, priority}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PickAlternativeBin.jsonld-pick_alt_bin.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID des Greifvorgangs.","type":["string","null"]},"bins":{"description":"Plätze mit Bestand: {binId, code, type, qty, priority}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Ersatzplätze zu einem Greifvorgang (Doc 25 AP 4.2).\n\n- eigene Operation statt Feld am Picklisten-Detail: sonst je Position eine Platz-Abfrage bei\n  jedem Listen-Aufruf, für eine Auskunft, die nur bei „Platz leer\" gebraucht wird"},"PickList-pick_list.read":{"type":"object","description":"Picklisten (Doc 25 AP 4.1/4.2 / B3).\n\nAnlage auf zwei Wegen: aus einer Vorlage (`templateUlid`) oder über eine ausdrückliche\nAuftragsliste (`orderUlids`). Der Rest sind Aktionen — greifen, Fehlmenge melden, Auftrag\nentfernen, abbrechen. Es gibt bewusst kein PATCH auf der Liste: eine Pickliste ist ein\nArbeitsvorrat, kein Formular.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"type":["string","null"]},"status":{"description":"created|picking|picked|packing|completed|cancelled (read-only — Übergänge über die Aktionen).","type":["string","null"]},"type":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"assignedUserId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"orderCount":{"description":"Anzahl Aufträge auf der Liste.","type":["integer","null"]},"openTaskCount":{"description":"Offene Greifvorgänge — die Zahl, die am Arbeitsplatz zählt.","type":["integer","null"]},"templateUlid":{"description":"Vorlage, aus der die Liste entstand (Eingabe bei POST).","type":["string","null"]},"orders":{"description":"Aufträge der Liste (nur im Detail): {orderUlid, orderNumber, position, boxCode}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Greifvorgänge in Wegfolge (nur im Detail): {ulid, sequence, description, orderId,\nproductId, binCode, qtyRequired, qtyPicked, status, boxCode, batchRef, serialRef}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PickList-pick_list.write":{"type":"object","description":"Picklisten (Doc 25 AP 4.1/4.2 / B3).\n\nAnlage auf zwei Wegen: aus einer Vorlage (`templateUlid`) oder über eine ausdrückliche\nAuftragsliste (`orderUlids`). Der Rest sind Aktionen — greifen, Fehlmenge melden, Auftrag\nentfernen, abbrechen. Es gibt bewusst kein PATCH auf der Liste: eine Pickliste ist ein\nArbeitsvorrat, kein Formular.","properties":{"warehouseId":{"type":["integer","null"]},"templateUlid":{"description":"Vorlage, aus der die Liste entstand (Eingabe bei POST).","type":["string","null"]},"orderUlids":{"description":"Ausdrückliche Auftragsauswahl (nur Eingabe bei POST, Alternative zu `templateUlid`).","type":["array","null"],"items":{"type":"string"}}}},"PickList.jsonld-pick_list.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"type":["string","null"]},"status":{"description":"created|picking|picked|packing|completed|cancelled (read-only — Übergänge über die Aktionen).","type":["string","null"]},"type":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"assignedUserId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"orderCount":{"description":"Anzahl Aufträge auf der Liste.","type":["integer","null"]},"openTaskCount":{"description":"Offene Greifvorgänge — die Zahl, die am Arbeitsplatz zählt.","type":["integer","null"]},"templateUlid":{"description":"Vorlage, aus der die Liste entstand (Eingabe bei POST).","type":["string","null"]},"orders":{"description":"Aufträge der Liste (nur im Detail): {orderUlid, orderNumber, position, boxCode}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Greifvorgänge in Wegfolge (nur im Detail): {ulid, sequence, description, orderId,\nproductId, binCode, qtyRequired, qtyPicked, status, boxCode, batchRef, serialRef}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Picklisten (Doc 25 AP 4.1/4.2 / B3).\n\nAnlage auf zwei Wegen: aus einer Vorlage (`templateUlid`) oder über eine ausdrückliche\nAuftragsliste (`orderUlids`). Der Rest sind Aktionen — greifen, Fehlmenge melden, Auftrag\nentfernen, abbrechen. Es gibt bewusst kein PATCH auf der Liste: eine Pickliste ist ein\nArbeitsvorrat, kein Formular."},"PickListTemplate-pick_list_template.read":{"type":"object","description":"Pickvorlagen (Doc 25 AP 4.1 / B3 (c)) — das Regelwerk, aus dem Picklisten entstehen.\n\n`preview` beantwortet die Frage, die man vor dem Speichern hat: „welche Aufträge greift diese\nVorlage GERADE?\" Ohne sie müsste man eine Liste anlegen, um es zu erfahren — und die reserviert\ndann Aufträge, die man nur sehen wollte.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"type":["string","null"]},"type":{"description":"single|single_item_run|multi_order|two_stage_boxes|rolling_pick_to_box|identical_orders.","type":["string","null"]},"color":{"type":["string","null"]},"filters":{"description":"Filter-Regelwerk. Unbekannte Schlüssel werden abgewiesen — ein Tippfehler soll nicht\nstillschweigend zu einer Vorlage führen, die die falschen Aufträge greift.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"maxOrders":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minOrders":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"autoCreate":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]},"matchingOrders":{"description":"Nur in der `preview`-Operation: die aktuell passenden Aufträge\n({ulid, number, orderedAt, itemCount, alreadyOnList}).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"matchingOrdersTruncated":{"description":"Nur in der `preview`-Operation: true, wenn die Auswahl am Vorschau-Deckel abgeschnitten ist\n(Audit R34-15). Ohne diese Angabe sähe eine gekürzte Vorschau aus wie die ganze Wahrheit.","type":["boolean","null"]}}},"PickListTemplate-pick_list_template.write":{"type":"object","description":"Pickvorlagen (Doc 25 AP 4.1 / B3 (c)) — das Regelwerk, aus dem Picklisten entstehen.\n\n`preview` beantwortet die Frage, die man vor dem Speichern hat: „welche Aufträge greift diese\nVorlage GERADE?\" Ohne sie müsste man eine Liste anlegen, um es zu erfahren — und die reserviert\ndann Aufträge, die man nur sehen wollte.","properties":{"name":{"maxLength":120,"type":["string","null"]},"type":{"description":"single|single_item_run|multi_order|two_stage_boxes|rolling_pick_to_box|identical_orders.","type":["string","null"]},"color":{"type":["string","null"]},"filters":{"description":"Filter-Regelwerk. Unbekannte Schlüssel werden abgewiesen — ein Tippfehler soll nicht\nstillschweigend zu einer Vorlage führen, die die falschen Aufträge greift.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"maxOrders":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minOrders":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"autoCreate":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"PickListTemplate-pick_list_template.write.jsonMergePatch":{"type":"object","description":"Pickvorlagen (Doc 25 AP 4.1 / B3 (c)) — das Regelwerk, aus dem Picklisten entstehen.\n\n`preview` beantwortet die Frage, die man vor dem Speichern hat: „welche Aufträge greift diese\nVorlage GERADE?\" Ohne sie müsste man eine Liste anlegen, um es zu erfahren — und die reserviert\ndann Aufträge, die man nur sehen wollte.","properties":{"name":{"maxLength":120,"type":["string","null"]},"type":{"description":"single|single_item_run|multi_order|two_stage_boxes|rolling_pick_to_box|identical_orders.","type":["string","null"]},"color":{"type":["string","null"]},"filters":{"description":"Filter-Regelwerk. Unbekannte Schlüssel werden abgewiesen — ein Tippfehler soll nicht\nstillschweigend zu einer Vorlage führen, die die falschen Aufträge greift.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"maxOrders":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minOrders":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"autoCreate":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"PickListTemplate.jsonld-pick_list_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"type":["string","null"]},"type":{"description":"single|single_item_run|multi_order|two_stage_boxes|rolling_pick_to_box|identical_orders.","type":["string","null"]},"color":{"type":["string","null"]},"filters":{"description":"Filter-Regelwerk. Unbekannte Schlüssel werden abgewiesen — ein Tippfehler soll nicht\nstillschweigend zu einer Vorlage führen, die die falschen Aufträge greift.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"maxOrders":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minOrders":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"autoCreate":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]},"matchingOrders":{"description":"Nur in der `preview`-Operation: die aktuell passenden Aufträge\n({ulid, number, orderedAt, itemCount, alreadyOnList}).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"matchingOrdersTruncated":{"description":"Nur in der `preview`-Operation: true, wenn die Auswahl am Vorschau-Deckel abgeschnitten ist\n(Audit R34-15). Ohne diese Angabe sähe eine gekürzte Vorschau aus wie die ganze Wahrheit.","type":["boolean","null"]}}}],"description":"Pickvorlagen (Doc 25 AP 4.1 / B3 (c)) — das Regelwerk, aus dem Picklisten entstehen.\n\n`preview` beantwortet die Frage, die man vor dem Speichern hat: „welche Aufträge greift diese\nVorlage GERADE?\" Ohne sie müsste man eine Liste anlegen, um es zu erfahren — und die reserviert\ndann Aufträge, die man nur sehen wollte."},"Pipeline-pipeline.read":{"type":"object","properties":{"id":{"description":"Bewusst int-PK (kein ULID) — Schreibrechte via crm.pipeline.configure, daher kein IDOR\ndurch Enumeration; ULID-Umstellung wäre Breaking für die SPA. Siehe ADR\n_intern/adr/2026-06-11-katalog-identifier-konventionen.md.","type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"type":{"enum":["lead","deal"],"description":"Pipeline-Typ: 'lead' (Lead-Qualifizierung) oder 'deal' (Vertrieb). Default 'deal'.","default":"deal","type":"string"},"isDefault":{"default":false,"type":"boolean"},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"stages":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["name"]},"Pipeline-pipeline.write":{"type":"object","required":["name"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"type":{"enum":["lead","deal"],"description":"Pipeline-Typ: 'lead' (Lead-Qualifizierung) oder 'deal' (Vertrieb). Default 'deal'.","default":"deal","type":"string"},"isDefault":{"default":false,"type":"boolean"},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"stages":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Pipeline-pipeline.write.jsonMergePatch":{"type":"object","properties":{"name":{"maxLength":255,"default":"","type":"string"},"type":{"enum":["lead","deal"],"description":"Pipeline-Typ: 'lead' (Lead-Qualifizierung) oder 'deal' (Vertrieb). Default 'deal'.","default":"deal","type":"string"},"isDefault":{"default":false,"type":"boolean"},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"stages":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Pipeline.jsonld-pipeline.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Bewusst int-PK (kein ULID) — Schreibrechte via crm.pipeline.configure, daher kein IDOR\ndurch Enumeration; ULID-Umstellung wäre Breaking für die SPA. Siehe ADR\n_intern/adr/2026-06-11-katalog-identifier-konventionen.md.","type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"type":{"enum":["lead","deal"],"description":"Pipeline-Typ: 'lead' (Lead-Qualifizierung) oder 'deal' (Vertrieb). Default 'deal'.","default":"deal","type":"string"},"isDefault":{"default":false,"type":"boolean"},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"stages":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["name"]}]},"PipelineRoutingRule-routing_rule.read":{"type":"object","description":"Deklarative Regel für automatische Pipeline-Zuweisung neu angelegter Leads/Deals. Schreibrechte\nvia `crm.pipeline.configure`; Brand-Scope-IDOR im Provider/Processor (analog {@see PipelineResource}).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":100,"default":"","type":"string"},"entityType":{"enum":["lead","deal"],"description":"Objektgattung, auf die die Regel wirkt (lead|deal) — muss zum Pipeline-Typ passen.","default":"lead","type":"string"},"priority":{"description":"Auswertungsreihenfolge (kleiner zuerst); erste passende Regel gewinnt.","default":0,"type":"integer"},"active":{"default":true,"type":"boolean"},"brandId":{"type":["integer","null"]},"conditions":{"description":"UND/ODER-Bedingungsbaum (Format wie Automation.conditions), null/leer = trifft immer.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"targetPipelineId":{"type":["integer","null"]},"targetPipelineName":{"type":["string","null"]},"targetStageId":{"type":["integer","null"]},"targetStageName":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"ownerStrategy":{"enum":["none","fixed","round_robin"],"description":"Owner-Zuweisungs-Strategie (Doc 26 3.5): none | fixed | round_robin.","default":"none","type":"string"},"ownerUserId":{"description":"Fester Owner (User-ID) bei `fixed`.","type":["integer","null"]},"ownerPool":{"description":"User-IDs des Round-Robin-Pools bei `round_robin`.","type":["array","null"],"items":{"type":"integer"}}},"required":["name","targetPipelineId"]},"PipelineRoutingRule-routing_rule.write":{"type":"object","description":"Deklarative Regel für automatische Pipeline-Zuweisung neu angelegter Leads/Deals. Schreibrechte\nvia `crm.pipeline.configure`; Brand-Scope-IDOR im Provider/Processor (analog {@see PipelineResource}).","required":["name","targetPipelineId"],"properties":{"name":{"maxLength":100,"default":"","type":"string"},"entityType":{"enum":["lead","deal"],"description":"Objektgattung, auf die die Regel wirkt (lead|deal) — muss zum Pipeline-Typ passen.","default":"lead","type":"string"},"priority":{"description":"Auswertungsreihenfolge (kleiner zuerst); erste passende Regel gewinnt.","default":0,"type":"integer"},"active":{"default":true,"type":"boolean"},"brandId":{"type":["integer","null"]},"conditions":{"description":"UND/ODER-Bedingungsbaum (Format wie Automation.conditions), null/leer = trifft immer.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"targetPipelineId":{"type":["integer","null"]},"targetStageId":{"type":["integer","null"]},"ownerStrategy":{"enum":["none","fixed","round_robin"],"description":"Owner-Zuweisungs-Strategie (Doc 26 3.5): none | fixed | round_robin.","default":"none","type":"string"},"ownerUserId":{"description":"Fester Owner (User-ID) bei `fixed`.","type":["integer","null"]},"ownerPool":{"description":"User-IDs des Round-Robin-Pools bei `round_robin`.","type":["array","null"],"items":{"type":"integer"}}}},"PipelineRoutingRule-routing_rule.write.jsonMergePatch":{"type":"object","description":"Deklarative Regel für automatische Pipeline-Zuweisung neu angelegter Leads/Deals. Schreibrechte\nvia `crm.pipeline.configure`; Brand-Scope-IDOR im Provider/Processor (analog {@see PipelineResource}).","properties":{"name":{"maxLength":100,"default":"","type":"string"},"entityType":{"enum":["lead","deal"],"description":"Objektgattung, auf die die Regel wirkt (lead|deal) — muss zum Pipeline-Typ passen.","default":"lead","type":"string"},"priority":{"description":"Auswertungsreihenfolge (kleiner zuerst); erste passende Regel gewinnt.","default":0,"type":"integer"},"active":{"default":true,"type":"boolean"},"brandId":{"type":["integer","null"]},"conditions":{"description":"UND/ODER-Bedingungsbaum (Format wie Automation.conditions), null/leer = trifft immer.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"targetPipelineId":{"type":["integer","null"]},"targetStageId":{"type":["integer","null"]},"ownerStrategy":{"enum":["none","fixed","round_robin"],"description":"Owner-Zuweisungs-Strategie (Doc 26 3.5): none | fixed | round_robin.","default":"none","type":"string"},"ownerUserId":{"description":"Fester Owner (User-ID) bei `fixed`.","type":["integer","null"]},"ownerPool":{"description":"User-IDs des Round-Robin-Pools bei `round_robin`.","type":["array","null"],"items":{"type":"integer"}}}},"PipelineRoutingRule.jsonld-routing_rule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":100,"default":"","type":"string"},"entityType":{"enum":["lead","deal"],"description":"Objektgattung, auf die die Regel wirkt (lead|deal) — muss zum Pipeline-Typ passen.","default":"lead","type":"string"},"priority":{"description":"Auswertungsreihenfolge (kleiner zuerst); erste passende Regel gewinnt.","default":0,"type":"integer"},"active":{"default":true,"type":"boolean"},"brandId":{"type":["integer","null"]},"conditions":{"description":"UND/ODER-Bedingungsbaum (Format wie Automation.conditions), null/leer = trifft immer.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"targetPipelineId":{"type":["integer","null"]},"targetPipelineName":{"type":["string","null"]},"targetStageId":{"type":["integer","null"]},"targetStageName":{"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"ownerStrategy":{"enum":["none","fixed","round_robin"],"description":"Owner-Zuweisungs-Strategie (Doc 26 3.5): none | fixed | round_robin.","default":"none","type":"string"},"ownerUserId":{"description":"Fester Owner (User-ID) bei `fixed`.","type":["integer","null"]},"ownerPool":{"description":"User-IDs des Round-Robin-Pools bei `round_robin`.","type":["array","null"],"items":{"type":"integer"}}},"required":["name","targetPipelineId"]}],"description":"Deklarative Regel für automatische Pipeline-Zuweisung neu angelegter Leads/Deals. Schreibrechte\nvia `crm.pipeline.configure`; Brand-Scope-IDOR im Provider/Processor (analog {@see PipelineResource})."},"PlannerTimeline-plannertimeline.read":{"type":"object","description":"Balken-Zeitachse des Planners (Doc 27 Stufe 4.2/G22) — Personen-Zeilen statt Vorgangs-Hierarchie.\n\n**Abgrenzung zur Auslastungs-Matrix:** `/v1/planning/utilization` liefert AGGREGIERTE Stunden je\nPerson und Periode („wie voll ist jemand\"). Diese Sicht liefert die EINZELNEN Balken („woran\n * arbeitet jemand wann\") — beides nebeneinander, weil eine Zahl nicht verrät, welche Aufgabe sie\nverursacht, und ein Balken nicht verrät, ob die Person insgesamt überlastet ist.\n\n**Nur lesend.** Umterminieren schreibt der Client über `PATCH /v1/work-items/{ulid}` (E1/E4:\ndie Termine liegen am Work-Item, nicht an einer Planungs-Kopie).","properties":{"key":{"description":"Fachlich eine Einzel-Antwort; als Collection modelliert, weil es keinen natürlichen Schlüssel gibt.","default":"planner-timeline","type":"string"},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"rows":{"description":"Zeilen. Eintrag: {employeeId, ulid, name}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"availability":{"description":"Verfuegbarkeit je Person ueber den gezeigten Zeitraum (Doc 27 4.2 — der offene Rest der Stufe).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}]}}},"bars":{"description":"Balken je Zeile. Eine Aufgabe mit mehreren Zuständigen erscheint **je Person einmal** —\ndeshalb trägt jeder Eintrag seine `employeeId`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"absences":{"description":"Abwesenheiten im Zeitraum — sie erklären Lücken in der Achse.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"milestones":{"description":"Meilensteine im Zeitraum (projektübergreifend) als Orientierungspunkte.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PlannerTimeline.jsonld-plannertimeline.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"description":"Fachlich eine Einzel-Antwort; als Collection modelliert, weil es keinen natürlichen Schlüssel gibt.","default":"planner-timeline","type":"string"},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"rows":{"description":"Zeilen. Eintrag: {employeeId, ulid, name}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"availability":{"description":"Verfuegbarkeit je Person ueber den gezeigten Zeitraum (Doc 27 4.2 — der offene Rest der Stufe).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}]}}},"bars":{"description":"Balken je Zeile. Eine Aufgabe mit mehreren Zuständigen erscheint **je Person einmal** —\ndeshalb trägt jeder Eintrag seine `employeeId`.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"absences":{"description":"Abwesenheiten im Zeitraum — sie erklären Lücken in der Achse.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"milestones":{"description":"Meilensteine im Zeitraum (projektübergreifend) als Orientierungspunkte.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Balken-Zeitachse des Planners (Doc 27 Stufe 4.2/G22) — Personen-Zeilen statt Vorgangs-Hierarchie.\n\n**Abgrenzung zur Auslastungs-Matrix:** `/v1/planning/utilization` liefert AGGREGIERTE Stunden je\nPerson und Periode („wie voll ist jemand\"). Diese Sicht liefert die EINZELNEN Balken („woran\n * arbeitet jemand wann\") — beides nebeneinander, weil eine Zahl nicht verrät, welche Aufgabe sie\nverursacht, und ein Balken nicht verrät, ob die Person insgesamt überlastet ist.\n\n**Nur lesend.** Umterminieren schreibt der Client über `PATCH /v1/work-items/{ulid}` (E1/E4:\ndie Termine liegen am Work-Item, nicht an einer Planungs-Kopie)."},"PlanningChecklist-planningChecklist.read":{"type":"object","description":"Planning-Checkliste (Doc 27 4.3/G23) — read-only Auto-Scan des Planungsfensters: nahende/überfällige\nDeadlines, anstehende Meilensteine, genehmigte Abwesenheiten und überbuchte Personen.\nFilter: from/to/brandId/employeeId(mehrfach)/includeFreelancers/kind(mehrfach).","properties":{"key":{"description":"Stabiler Zeilen-Schlüssel (kind + Referenz + Datum).","type":["string","null"]},"kind":{"description":"deadline | milestone | absence | overbooked.","type":["string","null"]},"severity":{"description":"critical | warning | info.","type":["string","null"]},"label":{"type":["string","null"]},"date":{"description":"Bezugsdatum (Fälligkeit / Meilenstein / Abwesenheits-Beginn / Perioden-Beginn).","type":["string","null"]},"refType":{"description":"workitem | milestone | absence | employee.","type":["string","null"]},"refUlid":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"detail":{"description":"Zusatzinfo je Art (Beleg-Ref, Projektname, Zeitraum, Auslastungs-Detail).","type":["string","null"]}}},"PlanningChecklist.jsonld-planningChecklist.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"description":"Stabiler Zeilen-Schlüssel (kind + Referenz + Datum).","type":["string","null"]},"kind":{"description":"deadline | milestone | absence | overbooked.","type":["string","null"]},"severity":{"description":"critical | warning | info.","type":["string","null"]},"label":{"type":["string","null"]},"date":{"description":"Bezugsdatum (Fälligkeit / Meilenstein / Abwesenheits-Beginn / Perioden-Beginn).","type":["string","null"]},"refType":{"description":"workitem | milestone | absence | employee.","type":["string","null"]},"refUlid":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"detail":{"description":"Zusatzinfo je Art (Beleg-Ref, Projektname, Zeitraum, Auslastungs-Detail).","type":["string","null"]}}}],"description":"Planning-Checkliste (Doc 27 4.3/G23) — read-only Auto-Scan des Planungsfensters: nahende/überfällige\nDeadlines, anstehende Meilensteine, genehmigte Abwesenheiten und überbuchte Personen.\nFilter: from/to/brandId/employeeId(mehrfach)/includeFreelancers/kind(mehrfach)."},"Plugin":{"type":"object","description":"Inventar + Lifecycle-Steuerung installierter Plugins (`/api/v1`).\n- install/activate/deactivate/uninstall: first-party-Lifecycle ({@see \\App\\Platform\\Plugin\\Service\\PluginLifecycleManager}),\n  Lock `plugin-lifecycle-<key>`, je Audit-Eintrag\n- Nur für in `config/plugins.php` registrierten Bestand; reine Daten-/Flag-Ops, kein Container-Rebuild\n- Neues Bundle (ZIP) separat: {@see \\App\\Platform\\Plugin\\Controller\\PluginUploadController}.","properties":{"name":{"description":"Stabiler Plugin-Schlüssel (z. B. `acme.demo`).","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"trustTier":{"description":"Vertrauensstufe: first-party | verified-partner | community.","default":"","type":"string"},"installed":{"description":"Installiert = aufgezeichneter Lifecycle-Zustand (`plugin_provisioning_state`), NICHT die Existenz der `module.<plugin>`-Flag-Zeile. Unterscheidet „deinstalliert\" von „deaktiviert\".","default":false,"type":"boolean"},"enabled":{"description":"Aktiv = `module.<plugin>`-Flag existiert und ist aktiviert (fail-closed).","default":false,"type":"boolean"},"moduleFlag":{"default":"","type":"string"},"routeSegments":{"type":"array","items":{"type":"string"}},"ownedCatalogRows":{"description":"Zahl der vom Plugin gehaltenen Katalogzeilen (Provenance, {@see \\App\\Platform\\Plugin\\Entity\\CatalogOwnership}).","default":0,"type":"integer"},"removable":{"description":"Deinstallierbar? `false` bei frozen-baseline-Plugins mit Core-Katalog-Flag (Asset/Licensing) —\nUninstall würde Core-Modul re-exponieren, daher gesperrt (409). UI blendet Button aus, Abschalten via Deaktivieren.","default":true,"type":"boolean"},"technicalName":{"description":"Technischer Plugin-Name inkl. Entwickler-Prefix (z. B. `OctiAsset`).","default":"","type":"string"},"packageName":{"description":"Composer-Paketname (z. B. `octibiz/octi-asset`).","default":"","type":"string"},"vendor":{"description":"Hersteller/Entwickler-Anzeigename (`authors[0].name`, z. B. `Octibiz`).","default":"","type":"string"},"authorEmail":{"type":["string","null"]},"authorHomepage":{"type":["string","null"]},"description":{"default":"","type":"string"},"homepage":{"type":["string","null"]},"license":{"default":"","type":"string"},"iconUrl":{"description":"Produkt-Icon als `data:`-URI (base64), direkt in ein `<img>` renderbar; null wenn keins hinterlegt.","type":["string","null"]}}},"Plugin-plugin.read":{"type":"object","description":"Inventar + Lifecycle-Steuerung installierter Plugins (`/api/v1`).\n- install/activate/deactivate/uninstall: first-party-Lifecycle ({@see \\App\\Platform\\Plugin\\Service\\PluginLifecycleManager}),\n  Lock `plugin-lifecycle-<key>`, je Audit-Eintrag\n- Nur für in `config/plugins.php` registrierten Bestand; reine Daten-/Flag-Ops, kein Container-Rebuild\n- Neues Bundle (ZIP) separat: {@see \\App\\Platform\\Plugin\\Controller\\PluginUploadController}.","properties":{"name":{"description":"Stabiler Plugin-Schlüssel (z. B. `acme.demo`).","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"trustTier":{"description":"Vertrauensstufe: first-party | verified-partner | community.","default":"","type":"string"},"installed":{"description":"Installiert = aufgezeichneter Lifecycle-Zustand (`plugin_provisioning_state`), NICHT die Existenz der `module.<plugin>`-Flag-Zeile. Unterscheidet „deinstalliert\" von „deaktiviert\".","default":false,"type":"boolean"},"enabled":{"description":"Aktiv = `module.<plugin>`-Flag existiert und ist aktiviert (fail-closed).","default":false,"type":"boolean"},"moduleFlag":{"default":"","type":"string"},"routeSegments":{"type":"array","items":{"type":"string"}},"ownedCatalogRows":{"description":"Zahl der vom Plugin gehaltenen Katalogzeilen (Provenance, {@see \\App\\Platform\\Plugin\\Entity\\CatalogOwnership}).","default":0,"type":"integer"},"removable":{"description":"Deinstallierbar? `false` bei frozen-baseline-Plugins mit Core-Katalog-Flag (Asset/Licensing) —\nUninstall würde Core-Modul re-exponieren, daher gesperrt (409). UI blendet Button aus, Abschalten via Deaktivieren.","default":true,"type":"boolean"},"technicalName":{"description":"Technischer Plugin-Name inkl. Entwickler-Prefix (z. B. `OctiAsset`).","default":"","type":"string"},"packageName":{"description":"Composer-Paketname (z. B. `octibiz/octi-asset`).","default":"","type":"string"},"vendor":{"description":"Hersteller/Entwickler-Anzeigename (`authors[0].name`, z. B. `Octibiz`).","default":"","type":"string"},"authorEmail":{"type":["string","null"]},"authorHomepage":{"type":["string","null"]},"description":{"default":"","type":"string"},"homepage":{"type":["string","null"]},"license":{"default":"","type":"string"},"iconUrl":{"description":"Produkt-Icon als `data:`-URI (base64), direkt in ein `<img>` renderbar; null wenn keins hinterlegt.","type":["string","null"]}}},"Plugin.jsonld-plugin.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"name":{"description":"Stabiler Plugin-Schlüssel (z. B. `acme.demo`).","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"trustTier":{"description":"Vertrauensstufe: first-party | verified-partner | community.","default":"","type":"string"},"installed":{"description":"Installiert = aufgezeichneter Lifecycle-Zustand (`plugin_provisioning_state`), NICHT die Existenz der `module.<plugin>`-Flag-Zeile. Unterscheidet „deinstalliert\" von „deaktiviert\".","default":false,"type":"boolean"},"enabled":{"description":"Aktiv = `module.<plugin>`-Flag existiert und ist aktiviert (fail-closed).","default":false,"type":"boolean"},"moduleFlag":{"default":"","type":"string"},"routeSegments":{"type":"array","items":{"type":"string"}},"ownedCatalogRows":{"description":"Zahl der vom Plugin gehaltenen Katalogzeilen (Provenance, {@see \\App\\Platform\\Plugin\\Entity\\CatalogOwnership}).","default":0,"type":"integer"},"removable":{"description":"Deinstallierbar? `false` bei frozen-baseline-Plugins mit Core-Katalog-Flag (Asset/Licensing) —\nUninstall würde Core-Modul re-exponieren, daher gesperrt (409). UI blendet Button aus, Abschalten via Deaktivieren.","default":true,"type":"boolean"},"technicalName":{"description":"Technischer Plugin-Name inkl. Entwickler-Prefix (z. B. `OctiAsset`).","default":"","type":"string"},"packageName":{"description":"Composer-Paketname (z. B. `octibiz/octi-asset`).","default":"","type":"string"},"vendor":{"description":"Hersteller/Entwickler-Anzeigename (`authors[0].name`, z. B. `Octibiz`).","default":"","type":"string"},"authorEmail":{"type":["string","null"]},"authorHomepage":{"type":["string","null"]},"description":{"default":"","type":"string"},"homepage":{"type":["string","null"]},"license":{"default":"","type":"string"},"iconUrl":{"description":"Produkt-Icon als `data:`-URI (base64), direkt in ein `<img>` renderbar; null wenn keins hinterlegt.","type":["string","null"]}}}],"description":"Inventar + Lifecycle-Steuerung installierter Plugins (`/api/v1`).\n- install/activate/deactivate/uninstall: first-party-Lifecycle ({@see \\App\\Platform\\Plugin\\Service\\PluginLifecycleManager}),\n  Lock `plugin-lifecycle-<key>`, je Audit-Eintrag\n- Nur für in `config/plugins.php` registrierten Bestand; reine Daten-/Flag-Ops, kein Container-Rebuild\n- Neues Bundle (ZIP) separat: {@see \\App\\Platform\\Plugin\\Controller\\PluginUploadController}."},"PluginInstallJob-plugin_install_job.read":{"type":"object","description":"Fortschritt/Ergebnis einer asynchronen Plugin-Installation (Systemaudit R28, APIUI-03).\n\nDER BEFUND: Der Start ist MCP-/Automation-sichtbar (`POST /v1/plugin-candidates/{dir}/install`,\n`POST /api/v1/plugins/upload`), das ERGEBNIS war es nicht — es stand ausschliesslich im\nSPA-only-Plain-Controller {@see \\App\\Platform\\Plugin\\Controller\\PluginUploadController::status()}\nund damit weder in OpenAPI noch in `mcp/var/operations.json`. Ein Agent konnte `failed` nicht von\n`succeeded` unterscheiden und hatte fuer einen im Worker gescheiterten Lauf keinen Fehlergrund.\n\nGleiche Loesung wie {@see \\App\\Platform\\Update\\ApiResource\\SystemUpdateJobResource} (System-Update)\nund wie in Audit R20 fuer die Portal-Nutzer: eigener, read-only ApiResource-Pfad NEBEN dem\nPlain-Controller (dessen Pfad `/api/v1/plugins/install-jobs/{jobId}` bleibt der UI erhalten —\nderselbe Pfad zweimal zu registrieren wuerde eine der beiden Routen still verschatten).","properties":{"jobId":{"description":"Job-ID (ULID) aus der Antwort des Install-/Upload-Aufrufs.","default":"","type":"string"},"status":{"description":"queued | running | succeeded | failed.","default":"","type":"string"},"message":{"description":"Menschentaugliche Meldung in Request-Sprache (der Job-Store haelt Uebersetzungs-Keys).","default":"","type":"string"},"pluginName":{"description":"Technischer Plugin-Name, sobald er feststeht; null solange das Paket nicht gelesen ist.","type":["string","null"]}}},"PluginInstallJob.jsonld-plugin_install_job.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"jobId":{"description":"Job-ID (ULID) aus der Antwort des Install-/Upload-Aufrufs.","default":"","type":"string"},"status":{"description":"queued | running | succeeded | failed.","default":"","type":"string"},"message":{"description":"Menschentaugliche Meldung in Request-Sprache (der Job-Store haelt Uebersetzungs-Keys).","default":"","type":"string"},"pluginName":{"description":"Technischer Plugin-Name, sobald er feststeht; null solange das Paket nicht gelesen ist.","type":["string","null"]}}}],"description":"Fortschritt/Ergebnis einer asynchronen Plugin-Installation (Systemaudit R28, APIUI-03).\n\nDER BEFUND: Der Start ist MCP-/Automation-sichtbar (`POST /v1/plugin-candidates/{dir}/install`,\n`POST /api/v1/plugins/upload`), das ERGEBNIS war es nicht — es stand ausschliesslich im\nSPA-only-Plain-Controller {@see \\App\\Platform\\Plugin\\Controller\\PluginUploadController::status()}\nund damit weder in OpenAPI noch in `mcp/var/operations.json`. Ein Agent konnte `failed` nicht von\n`succeeded` unterscheiden und hatte fuer einen im Worker gescheiterten Lauf keinen Fehlergrund.\n\nGleiche Loesung wie {@see \\App\\Platform\\Update\\ApiResource\\SystemUpdateJobResource} (System-Update)\nund wie in Audit R20 fuer die Portal-Nutzer: eigener, read-only ApiResource-Pfad NEBEN dem\nPlain-Controller (dessen Pfad `/api/v1/plugins/install-jobs/{jobId}` bleibt der UI erhalten —\nderselbe Pfad zweimal zu registrieren wuerde eine der beiden Routen still verschatten)."},"PluginStore":{"type":"object","description":"In-App-Sicht auf den Plugin-Marktplatz (P6-Bridge, `/api/v1`).\n- GetCollection: Katalog (leer, wenn Store nicht konfiguriert)\n- POST …/{id}/install: erworbenes Paket laden + installieren\n- Gated: `platform.plugin.manage`.","properties":{"id":{"description":"Store-Produkt-ID.","default":"","type":"string"},"name":{"description":"Plugin-Schlüssel (== lokaler `name` nach Installation).","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"description":{"default":"","type":"string"},"priceLabel":{"default":"","type":"string"},"trustTier":{"default":"","type":"string"},"purchaseUrl":{"description":"Checkout-Deep-Link für noch nicht erworbene, kostenpflichtige Plugins (sonst null).","type":["string","null"]},"entitled":{"description":"Erworben → direkt installierbar.","default":false,"type":"boolean"},"installed":{"description":"Bereits lokal installiert.","default":false,"type":"boolean"},"vendor":{"description":"Hersteller/Entwickler-Anzeigename (aus Store-Payload bzw. lokalem composer.json-Manifest).","default":"","type":"string"},"iconUrl":{"description":"Produkt-Icon als `data:`-URI/URL, direkt in ein `<img>` renderbar; null wenn keins verfügbar.","type":["string","null"]}}},"PluginStore-plugin_store.read":{"type":"object","description":"In-App-Sicht auf den Plugin-Marktplatz (P6-Bridge, `/api/v1`).\n- GetCollection: Katalog (leer, wenn Store nicht konfiguriert)\n- POST …/{id}/install: erworbenes Paket laden + installieren\n- Gated: `platform.plugin.manage`.","properties":{"id":{"description":"Store-Produkt-ID.","default":"","type":"string"},"name":{"description":"Plugin-Schlüssel (== lokaler `name` nach Installation).","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"description":{"default":"","type":"string"},"priceLabel":{"default":"","type":"string"},"trustTier":{"default":"","type":"string"},"purchaseUrl":{"description":"Checkout-Deep-Link für noch nicht erworbene, kostenpflichtige Plugins (sonst null).","type":["string","null"]},"entitled":{"description":"Erworben → direkt installierbar.","default":false,"type":"boolean"},"installed":{"description":"Bereits lokal installiert.","default":false,"type":"boolean"},"vendor":{"description":"Hersteller/Entwickler-Anzeigename (aus Store-Payload bzw. lokalem composer.json-Manifest).","default":"","type":"string"},"iconUrl":{"description":"Produkt-Icon als `data:`-URI/URL, direkt in ein `<img>` renderbar; null wenn keins verfügbar.","type":["string","null"]}}},"PluginStore.jsonld-plugin_store.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Store-Produkt-ID.","default":"","type":"string"},"name":{"description":"Plugin-Schlüssel (== lokaler `name` nach Installation).","default":"","type":"string"},"displayName":{"default":"","type":"string"},"version":{"default":"","type":"string"},"description":{"default":"","type":"string"},"priceLabel":{"default":"","type":"string"},"trustTier":{"default":"","type":"string"},"purchaseUrl":{"description":"Checkout-Deep-Link für noch nicht erworbene, kostenpflichtige Plugins (sonst null).","type":["string","null"]},"entitled":{"description":"Erworben → direkt installierbar.","default":false,"type":"boolean"},"installed":{"description":"Bereits lokal installiert.","default":false,"type":"boolean"},"vendor":{"description":"Hersteller/Entwickler-Anzeigename (aus Store-Payload bzw. lokalem composer.json-Manifest).","default":"","type":"string"},"iconUrl":{"description":"Produkt-Icon als `data:`-URI/URL, direkt in ein `<img>` renderbar; null wenn keins verfügbar.","type":["string","null"]}}}],"description":"In-App-Sicht auf den Plugin-Marktplatz (P6-Bridge, `/api/v1`).\n- GetCollection: Katalog (leer, wenn Store nicht konfiguriert)\n- POST …/{id}/install: erworbenes Paket laden + installieren\n- Gated: `platform.plugin.manage`."},"PortalAccessGrant-portal_access_grant.read":{"type":"object","description":"Portal-Zugriffs-Zeile vergeben (Staff, 04-12 §7), MCP-/Automation-erreichbar.\n- Ziel-User: Pfad-ULID\n- Recht: portal.access.grant\n- Marken-Scope in {@see PortalAccessGrantProcessor} (fremd-marken-User → 404).","properties":{"ulid":{"type":["string","null"]},"scopeType":{"type":["string","null"]},"scopeId":{"type":["integer","null"]},"capabilities":{"type":["array","null"],"items":{"type":"string"}}},"required":["scopeType"]},"PortalAccessGrant-portal_access_grant.write":{"type":"object","description":"Portal-Zugriffs-Zeile vergeben (Staff, 04-12 §7), MCP-/Automation-erreichbar.\n- Ziel-User: Pfad-ULID\n- Recht: portal.access.grant\n- Marken-Scope in {@see PortalAccessGrantProcessor} (fremd-marken-User → 404).","required":["scopeType"],"properties":{"scopeType":{"type":["string","null"]},"scopeId":{"type":["integer","null"]},"capabilities":{"type":["array","null"],"items":{"type":"string"}},"expiresAt":{"type":["string","null"]}}},"PortalAccessGrant.jsonld-portal_access_grant.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"scopeType":{"type":["string","null"]},"scopeId":{"type":["integer","null"]},"capabilities":{"type":["array","null"],"items":{"type":"string"}}},"required":["scopeType"]}],"description":"Portal-Zugriffs-Zeile vergeben (Staff, 04-12 §7), MCP-/Automation-erreichbar.\n- Ziel-User: Pfad-ULID\n- Recht: portal.access.grant\n- Marken-Scope in {@see PortalAccessGrantProcessor} (fremd-marken-User → 404)."},"PortalInvitation-portal_invitation.read":{"type":"object","description":"Portal-Einladung (Staff, 04-12 §7), MCP-/Automation-erreichbar (P-1/P-2/P-3).\n- Recht: portal.user.invite\n- Marken-Scope in {@see PortalInvitationProcessor} via PortalAccessResolver (Brand-IDOR).","properties":{"invitationUlid":{"type":["string","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"expiresAt":{"type":["string","null"]}},"required":["email"]},"PortalInvitation-portal_invitation.write":{"type":"object","description":"Portal-Einladung (Staff, 04-12 §7), MCP-/Automation-erreichbar (P-1/P-2/P-3).\n- Recht: portal.user.invite\n- Marken-Scope in {@see PortalInvitationProcessor} via PortalAccessResolver (Brand-IDOR).","required":["customerId","email"],"properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"contactId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"intendedAccess":{"description":"Optionale Vorab-Zugriffs-Zeilen: list<array{scopeType?: string, scopeId?: int, capabilities?: list<string>}>.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PortalInvitation.jsonld-portal_invitation.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"invitationUlid":{"type":["string","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"expiresAt":{"type":["string","null"]}},"required":["email"]}],"description":"Portal-Einladung (Staff, 04-12 §7), MCP-/Automation-erreichbar (P-1/P-2/P-3).\n- Recht: portal.user.invite\n- Marken-Scope in {@see PortalInvitationProcessor} via PortalAccessResolver (Brand-IDOR)."},"PortalUser-portal_user.read":{"type":"object","description":"MCP-/Automation-sichtbare Read-Liste der Portal-User (04-12 §7, Audit R20 PAR-1).\n- Schließt P-2-Lücke: schreibende Staff-Aktionen brauchen die `{ulid}`, die sonst nur über\n  den SPA-only {@see \\App\\Portal\\Controller\\PortalManagementController} ermittelbar war\n- Gleicher Marken-Scope-IDOR-Schutz wie der Controller (via {@see PortalUserCollectionProvider})\n- Filter `customerId` (int): grenzt auf Portal-User eines Kunden ein.","properties":{"ulid":{"type":["string","null"]},"email":{"type":["string","null"]},"displayName":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"status":{"type":["string","null"]},"lastLoginAt":{"type":["string","null"]},"scopes":{"description":"Zugriffs-Scopes des Portal-Users (scopeType/scopeId/capabilities).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PortalUser.jsonld-portal_user.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"email":{"type":["string","null"]},"displayName":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"status":{"type":["string","null"]},"lastLoginAt":{"type":["string","null"]},"scopes":{"description":"Zugriffs-Scopes des Portal-Users (scopeType/scopeId/capabilities).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"MCP-/Automation-sichtbare Read-Liste der Portal-User (04-12 §7, Audit R20 PAR-1).\n- Schließt P-2-Lücke: schreibende Staff-Aktionen brauchen die `{ulid}`, die sonst nur über\n  den SPA-only {@see \\App\\Portal\\Controller\\PortalManagementController} ermittelbar war\n- Gleicher Marken-Scope-IDOR-Schutz wie der Controller (via {@see PortalUserCollectionProvider})\n- Filter `customerId` (int): grenzt auf Portal-User eines Kunden ein."},"PortalUserStatus-portal_user_status.read":{"type":"object","description":"Portal-User sperren/reaktivieren (Staff, 04-12 §7), MCP-/Automation-erreichbar.\n- Ersetzt getrennte suspend/reactivate-Routen durch EINE Status-Aktion (suspended|active)\n- Recht: portal.user.suspend\n- Marken-Scope in {@see PortalUserStatusProcessor} (fremd-marken-User → 404).","properties":{"ulid":{"type":["string","null"]},"status":{"enum":["suspended","active"],"type":["string","null"]}},"required":["status"]},"PortalUserStatus-portal_user_status.write":{"type":"object","description":"Portal-User sperren/reaktivieren (Staff, 04-12 §7), MCP-/Automation-erreichbar.\n- Ersetzt getrennte suspend/reactivate-Routen durch EINE Status-Aktion (suspended|active)\n- Recht: portal.user.suspend\n- Marken-Scope in {@see PortalUserStatusProcessor} (fremd-marken-User → 404).","required":["status"],"properties":{"status":{"enum":["suspended","active"],"type":["string","null"]}}},"PortalUserStatus.jsonld-portal_user_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"status":{"enum":["suspended","active"],"type":["string","null"]}},"required":["status"]}],"description":"Portal-User sperren/reaktivieren (Staff, 04-12 §7), MCP-/Automation-erreichbar.\n- Ersetzt getrennte suspend/reactivate-Routen durch EINE Status-Aktion (suspended|active)\n- Recht: portal.user.suspend\n- Marken-Scope in {@see PortalUserStatusProcessor} (fremd-marken-User → 404)."},"PosExport-pos_export.read":{"type":"object","description":"DSFinV-K-Datensätze (Doc 25 Stufe 11, Spec 04-52 §6).\n\nEin Lauf ist ein **Beleg**, kein Knopf: seine Bytes werden eingefroren und über die\nabgelegte Datei wieder ausgegeben. Ein Export, der bei jedem Herunterladen neu entsteht, ist\nkein Nachweis, sondern eine Momentaufnahme.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"registerUlid":{"type":["string","null"]},"registerName":{"type":["string","null"]},"periodFrom":{"type":["string","null"]},"periodTo":{"type":["string","null"]},"closingCount":{"type":["integer","null"]},"saleCount":{"type":["integer","null"]},"fileUlid":{"description":"ULID der abgelegten ZIP-Datei — Download über `/v1/platform/files/{ulid}/download`.","type":["string","null"]},"checksum":{"description":"SHA-256 des Archivs — der Beweis, dass zwei Downloads dieselben Bytes liefern.","type":["string","null"]},"fileSize":{"type":["integer","null"]},"fileCounts":{"description":"Zeilenzahl je CSV-Datei.","type":["object","null"],"additionalProperties":{"type":"integer"}},"skippedSessions":{"description":"Übersprungene, weil noch offene Schichten — benannt statt stillschweigend weggelassen.","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"]}}},"PosExport-pos_export.write":{"type":"object","description":"DSFinV-K-Datensätze (Doc 25 Stufe 11, Spec 04-52 §6).\n\nEin Lauf ist ein **Beleg**, kein Knopf: seine Bytes werden eingefroren und über die\nabgelegte Datei wieder ausgegeben. Ein Export, der bei jedem Herunterladen neu entsteht, ist\nkein Nachweis, sondern eine Momentaufnahme.","properties":{"registerUlid":{"type":["string","null"]},"periodFrom":{"type":["string","null"]},"periodTo":{"type":["string","null"]}}},"PosExport.jsonld-pos_export.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"registerUlid":{"type":["string","null"]},"registerName":{"type":["string","null"]},"periodFrom":{"type":["string","null"]},"periodTo":{"type":["string","null"]},"closingCount":{"type":["integer","null"]},"saleCount":{"type":["integer","null"]},"fileUlid":{"description":"ULID der abgelegten ZIP-Datei — Download über `/v1/platform/files/{ulid}/download`.","type":["string","null"]},"checksum":{"description":"SHA-256 des Archivs — der Beweis, dass zwei Downloads dieselben Bytes liefern.","type":["string","null"]},"fileSize":{"type":["integer","null"]},"fileCounts":{"description":"Zeilenzahl je CSV-Datei.","type":["object","null"],"additionalProperties":{"type":"integer"}},"skippedSessions":{"description":"Übersprungene, weil noch offene Schichten — benannt statt stillschweigend weggelassen.","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"]}}}],"description":"DSFinV-K-Datensätze (Doc 25 Stufe 11, Spec 04-52 §6).\n\nEin Lauf ist ein **Beleg**, kein Knopf: seine Bytes werden eingefroren und über die\nabgelegte Datei wieder ausgegeben. Ein Export, der bei jedem Herunterladen neu entsteht, ist\nkein Nachweis, sondern eine Momentaufnahme."},"PosPriceQuote-pos_price.read":{"type":"object","description":"„Was kostet das jetzt?\" — der Preis einer Bonposition, bevor es einen Bon gibt\n(Doc 25 Stufe 11, Spec 04-52 §3.1/§10).\n\n**Warum es diese Ressource gibt:** der Warenkorb liegt am Gerät, damit die Kasse auch ohne\nVerbindung bedienbar bleibt. Der Offline-Schnappschuss kennt aber nur den **Regalpreis** —\nKundengruppen-, Staffel- und Aktionspreise entstehen in der Preis-Pipeline und hängen an Daten,\ndie kein Gerät mitführt. Ohne diesen Abruf verkaufte eine lokal rechnende Kasse an jeder\nRabattaktion vorbei; genau der Fall, für den OctiPromotions gebaut wurde.\n\n**Ein Scan, ein Abruf, eine Antwort** — dieselbe Auflösung wie serverseitig beim Anlegen einer\nPosition ({@see \\Octi\\Plugin\\Pos\\Service\\PosProductResolver}). Fällt er aus, bleibt der\nRegalpreis stehen und der Verkauf läuft weiter: ein Preis von gestern ist besser als ein Kunde,\nder wartet.","properties":{"ulid":{"description":"Die Kasse, für die gefragt wurde — zugleich der Identifier der Ressource.","type":["string","null"]},"productId":{"type":["integer","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"gtin":{"type":["string","null"]},"unitPriceAmount":{"description":"BRUTTO-Stückpreis in Cent — die Wahrheit ab der Bonposition (§3.1).","type":["integer","null"]},"taxRate":{"type":["string","null"]},"taxCategory":{"type":["string","null"]},"priceRule":{"description":"Welche Preisregel gegriffen hat (z. B. eine Aktion); null = Listenpreis.","type":["string","null"]}}},"PosPriceQuote.jsonld-pos_price.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Die Kasse, für die gefragt wurde — zugleich der Identifier der Ressource.","type":["string","null"]},"productId":{"type":["integer","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"gtin":{"type":["string","null"]},"unitPriceAmount":{"description":"BRUTTO-Stückpreis in Cent — die Wahrheit ab der Bonposition (§3.1).","type":["integer","null"]},"taxRate":{"type":["string","null"]},"taxCategory":{"type":["string","null"]},"priceRule":{"description":"Welche Preisregel gegriffen hat (z. B. eine Aktion); null = Listenpreis.","type":["string","null"]}}}],"description":"„Was kostet das jetzt?\" — der Preis einer Bonposition, bevor es einen Bon gibt\n(Doc 25 Stufe 11, Spec 04-52 §3.1/§10).\n\n**Warum es diese Ressource gibt:** der Warenkorb liegt am Gerät, damit die Kasse auch ohne\nVerbindung bedienbar bleibt. Der Offline-Schnappschuss kennt aber nur den **Regalpreis** —\nKundengruppen-, Staffel- und Aktionspreise entstehen in der Preis-Pipeline und hängen an Daten,\ndie kein Gerät mitführt. Ohne diesen Abruf verkaufte eine lokal rechnende Kasse an jeder\nRabattaktion vorbei; genau der Fall, für den OctiPromotions gebaut wurde.\n\n**Ein Scan, ein Abruf, eine Antwort** — dieselbe Auflösung wie serverseitig beim Anlegen einer\nPosition ({@see \\Octi\\Plugin\\Pos\\Service\\PosProductResolver}). Fällt er aus, bleibt der\nRegalpreis stehen und der Verkauf läuft weiter: ein Preis von gestern ist besser als ein Kunde,\nder wartet."},"PosRegister-pos_register.read":{"type":"object","description":"Kassen-Stammdaten (Doc 25 Stufe 11, Spec 04-52 §2).\n\n`registerKey` (= DSFinV-K `Z_KASSE_ID`) ist nur beim Anlegen schreibbar: eine geänderte\nKassen-ID zerrisse die Verbindung zwischen bereits exportierten Abschlüssen und der Kasse, aus\nder sie stammen.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"registerKey":{"description":"DSFinV-K `Z_KASSE_ID`; nur beim Anlegen schreibbar.","type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"description":"Filiale = Lager (OctiMultiWarehouse); null = Ein-Lager-Betrieb.","type":["integer","null"]},"workplaceKey":{"description":"Arbeitsplatz für den Direktdruck (OctiPrint); null = Browser-Druck.","type":["string","null"]},"tseMode":{"description":"fiskaly|none.","type":["string","null"]},"tseTssId":{"type":["string","null"]},"tseClientId":{"type":["string","null"]},"tseSerial":{"type":["string","null"]},"locationName":{"type":["string","null"]},"locationStreet":{"type":["string","null"]},"locationPostalCode":{"type":["string","null"]},"locationCity":{"type":["string","null"]},"locationCountry":{"type":["string","null"]},"taxNumber":{"type":["string","null"]},"vatId":{"type":["string","null"]},"active":{"type":["boolean","null"]},"openSessionUlid":{"description":"ULID der offenen Schicht; null = geschlossen (dann muss erst geöffnet werden).","type":["string","null"]},"openSessionZNumber":{"description":"Z-Nummer der offenen Schicht.","type":["integer","null"]},"directPrintAvailable":{"description":"Ist ein Arbeitsplatz-Agent für den Belegdruck erreichbar?","type":["boolean","null"]},"tseReady":{"description":"Ist ein Signaturdienst eingerichtet? `false` bei `tseMode: none` ODER fehlender\nKonfiguration — beides führt zu unsignierten Bons und gehört deshalb sichtbar an die Kasse.","type":["boolean","null"]},"createdAt":{"type":["string","null"]}}},"PosRegister-pos_register.write":{"type":"object","description":"Kassen-Stammdaten (Doc 25 Stufe 11, Spec 04-52 §2).\n\n`registerKey` (= DSFinV-K `Z_KASSE_ID`) ist nur beim Anlegen schreibbar: eine geänderte\nKassen-ID zerrisse die Verbindung zwischen bereits exportierten Abschlüssen und der Kasse, aus\nder sie stammen.","properties":{"registerKey":{"description":"DSFinV-K `Z_KASSE_ID`; nur beim Anlegen schreibbar.","type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"description":"Filiale = Lager (OctiMultiWarehouse); null = Ein-Lager-Betrieb.","type":["integer","null"]},"workplaceKey":{"description":"Arbeitsplatz für den Direktdruck (OctiPrint); null = Browser-Druck.","type":["string","null"]},"tseMode":{"description":"fiskaly|none.","type":["string","null"]},"tseTssId":{"type":["string","null"]},"tseClientId":{"type":["string","null"]},"tseSerial":{"type":["string","null"]},"locationName":{"type":["string","null"]},"locationStreet":{"type":["string","null"]},"locationPostalCode":{"type":["string","null"]},"locationCity":{"type":["string","null"]},"locationCountry":{"type":["string","null"]},"taxNumber":{"type":["string","null"]},"vatId":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"PosRegister-pos_register.write.jsonMergePatch":{"type":"object","description":"Kassen-Stammdaten (Doc 25 Stufe 11, Spec 04-52 §2).\n\n`registerKey` (= DSFinV-K `Z_KASSE_ID`) ist nur beim Anlegen schreibbar: eine geänderte\nKassen-ID zerrisse die Verbindung zwischen bereits exportierten Abschlüssen und der Kasse, aus\nder sie stammen.","properties":{"registerKey":{"description":"DSFinV-K `Z_KASSE_ID`; nur beim Anlegen schreibbar.","type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"description":"Filiale = Lager (OctiMultiWarehouse); null = Ein-Lager-Betrieb.","type":["integer","null"]},"workplaceKey":{"description":"Arbeitsplatz für den Direktdruck (OctiPrint); null = Browser-Druck.","type":["string","null"]},"tseMode":{"description":"fiskaly|none.","type":["string","null"]},"tseTssId":{"type":["string","null"]},"tseClientId":{"type":["string","null"]},"tseSerial":{"type":["string","null"]},"locationName":{"type":["string","null"]},"locationStreet":{"type":["string","null"]},"locationPostalCode":{"type":["string","null"]},"locationCity":{"type":["string","null"]},"locationCountry":{"type":["string","null"]},"taxNumber":{"type":["string","null"]},"vatId":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"PosRegister.jsonld-pos_register.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"registerKey":{"description":"DSFinV-K `Z_KASSE_ID`; nur beim Anlegen schreibbar.","type":["string","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"description":"Filiale = Lager (OctiMultiWarehouse); null = Ein-Lager-Betrieb.","type":["integer","null"]},"workplaceKey":{"description":"Arbeitsplatz für den Direktdruck (OctiPrint); null = Browser-Druck.","type":["string","null"]},"tseMode":{"description":"fiskaly|none.","type":["string","null"]},"tseTssId":{"type":["string","null"]},"tseClientId":{"type":["string","null"]},"tseSerial":{"type":["string","null"]},"locationName":{"type":["string","null"]},"locationStreet":{"type":["string","null"]},"locationPostalCode":{"type":["string","null"]},"locationCity":{"type":["string","null"]},"locationCountry":{"type":["string","null"]},"taxNumber":{"type":["string","null"]},"vatId":{"type":["string","null"]},"active":{"type":["boolean","null"]},"openSessionUlid":{"description":"ULID der offenen Schicht; null = geschlossen (dann muss erst geöffnet werden).","type":["string","null"]},"openSessionZNumber":{"description":"Z-Nummer der offenen Schicht.","type":["integer","null"]},"directPrintAvailable":{"description":"Ist ein Arbeitsplatz-Agent für den Belegdruck erreichbar?","type":["boolean","null"]},"tseReady":{"description":"Ist ein Signaturdienst eingerichtet? `false` bei `tseMode: none` ODER fehlender\nKonfiguration — beides führt zu unsignierten Bons und gehört deshalb sichtbar an die Kasse.","type":["boolean","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Kassen-Stammdaten (Doc 25 Stufe 11, Spec 04-52 §2).\n\n`registerKey` (= DSFinV-K `Z_KASSE_ID`) ist nur beim Anlegen schreibbar: eine geänderte\nKassen-ID zerrisse die Verbindung zwischen bereits exportierten Abschlüssen und der Kasse, aus\nder sie stammen."},"PosSale-pos_sale.read":{"type":"object","description":"Der Kassenbon (Doc 25 Stufe 11, Spec 04-52).\n\n**Zwei Bedienarten in einer Ressource** — und das mit Absicht:\n - **interaktiv**: `POST /sales` (leerer Warenkorb) → `add-item` → `finish`. So arbeitet die\n   Kasse am Tresen, weil der Kunde noch etwas dazulegt.\n - **in einem Zug**: `POST /sales` mit `items` UND `payments` schließt sofort ab. So räumt der\n   **Offline-Puffer** seine Warteschlange: ein Gerät ohne Verbindung kann kein Gespräch führen,\n   es kann nur einen fertigen Vorgang nachreichen.\n\nEs gibt bewusst kein PATCH und kein DELETE: ein abgeschlossener Bon ist unveränderlich, die\nRücknahme ist ein Gegenbon (§3.5).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"type":["string","null"]},"registerUlid":{"type":["string","null"]},"registerId":{"type":["integer","null"]},"sessionUlid":{"type":["string","null"]},"kind":{"description":"sale|return (read-only).","type":["string","null"]},"status":{"description":"open|finished|cancelled (read-only).","type":["string","null"]},"customerId":{"type":["integer","null"]},"customerName":{"type":["string","null"]},"salesOrderUlid":{"type":["string","null"]},"clientRef":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"grossAmount":{"type":["integer","null"]},"netAmount":{"type":["integer","null"]},"taxAmount":{"type":["integer","null"]},"paidAmount":{"description":"Bereits angerechnete Zahlungen in Cent.","type":["integer","null"]},"changeAmount":{"description":"Rückgeld in Cent (Summe über die Barzahlungen).","type":["integer","null"]},"taxBreakdown":{"description":"Steueraufschlüsselung `[{rate, category, gross, net, tax}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"finishedAt":{"type":["string","null"]},"operatorName":{"type":["string","null"]},"tseSigned":{"description":"Gültig signiert? `false` heißt: dokumentierter Ausfall, der Beleg trägt den Hinweis.","type":["boolean","null"]},"tseErrorMessage":{"description":"Grund des Ausfalls (`TSE_TA_FEHLER`); null = signiert.","type":["string","null"]},"tseTransactionNumber":{"type":["string","null"]},"tseSignatureCounter":{"type":["string","null"]},"tseSerial":{"type":["string","null"]},"voidsSaleNumber":{"description":"Bonnummer des zurückgenommenen Originals (auf einem Gegenbon).","type":["string","null"]},"voidedBySaleNumber":{"description":"Bonnummer des Gegenbons (auf einem zurückgenommenen Original).","type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"items":{"description":"Positionen (nur im Detail): `{ulid, position, itemType, productId, name, sku, gtin, qty,\nunitPriceAmount, discountAmount, taxRate, taxCategory, grossAmount, netAmount, taxAmount}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"payments":{"description":"Zahlungen (nur im Detail): `{ulid, type, amount, givenAmount, changeAmount, reference}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"receiptHtml":{"description":"Beleg-HTML für die Druckvorschau (nur bei `print` und im Detail eines abgeschlossenen Bons).","type":["string","null"]},"printed":{"description":"Hat der Arbeitsplatz-Agent den Druckauftrag angenommen? (nur bei `print`)","type":["boolean","null"]}}},"PosSale-pos_sale.write":{"type":"object","description":"Der Kassenbon (Doc 25 Stufe 11, Spec 04-52).\n\n**Zwei Bedienarten in einer Ressource** — und das mit Absicht:\n - **interaktiv**: `POST /sales` (leerer Warenkorb) → `add-item` → `finish`. So arbeitet die\n   Kasse am Tresen, weil der Kunde noch etwas dazulegt.\n - **in einem Zug**: `POST /sales` mit `items` UND `payments` schließt sofort ab. So räumt der\n   **Offline-Puffer** seine Warteschlange: ein Gerät ohne Verbindung kann kein Gespräch führen,\n   es kann nur einen fertigen Vorgang nachreichen.\n\nEs gibt bewusst kein PATCH und kein DELETE: ein abgeschlossener Bon ist unveränderlich, die\nRücknahme ist ein Gegenbon (§3.5).","properties":{"registerUlid":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"salesOrderUlid":{"type":["string","null"]},"clientRef":{"type":["string","null"]}}},"PosSale.jsonld-pos_sale.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"type":["string","null"]},"registerUlid":{"type":["string","null"]},"registerId":{"type":["integer","null"]},"sessionUlid":{"type":["string","null"]},"kind":{"description":"sale|return (read-only).","type":["string","null"]},"status":{"description":"open|finished|cancelled (read-only).","type":["string","null"]},"customerId":{"type":["integer","null"]},"customerName":{"type":["string","null"]},"salesOrderUlid":{"type":["string","null"]},"clientRef":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"grossAmount":{"type":["integer","null"]},"netAmount":{"type":["integer","null"]},"taxAmount":{"type":["integer","null"]},"paidAmount":{"description":"Bereits angerechnete Zahlungen in Cent.","type":["integer","null"]},"changeAmount":{"description":"Rückgeld in Cent (Summe über die Barzahlungen).","type":["integer","null"]},"taxBreakdown":{"description":"Steueraufschlüsselung `[{rate, category, gross, net, tax}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"finishedAt":{"type":["string","null"]},"operatorName":{"type":["string","null"]},"tseSigned":{"description":"Gültig signiert? `false` heißt: dokumentierter Ausfall, der Beleg trägt den Hinweis.","type":["boolean","null"]},"tseErrorMessage":{"description":"Grund des Ausfalls (`TSE_TA_FEHLER`); null = signiert.","type":["string","null"]},"tseTransactionNumber":{"type":["string","null"]},"tseSignatureCounter":{"type":["string","null"]},"tseSerial":{"type":["string","null"]},"voidsSaleNumber":{"description":"Bonnummer des zurückgenommenen Originals (auf einem Gegenbon).","type":["string","null"]},"voidedBySaleNumber":{"description":"Bonnummer des Gegenbons (auf einem zurückgenommenen Original).","type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"items":{"description":"Positionen (nur im Detail): `{ulid, position, itemType, productId, name, sku, gtin, qty,\nunitPriceAmount, discountAmount, taxRate, taxCategory, grossAmount, netAmount, taxAmount}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"payments":{"description":"Zahlungen (nur im Detail): `{ulid, type, amount, givenAmount, changeAmount, reference}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"receiptHtml":{"description":"Beleg-HTML für die Druckvorschau (nur bei `print` und im Detail eines abgeschlossenen Bons).","type":["string","null"]},"printed":{"description":"Hat der Arbeitsplatz-Agent den Druckauftrag angenommen? (nur bei `print`)","type":["boolean","null"]}}}],"description":"Der Kassenbon (Doc 25 Stufe 11, Spec 04-52).\n\n**Zwei Bedienarten in einer Ressource** — und das mit Absicht:\n - **interaktiv**: `POST /sales` (leerer Warenkorb) → `add-item` → `finish`. So arbeitet die\n   Kasse am Tresen, weil der Kunde noch etwas dazulegt.\n - **in einem Zug**: `POST /sales` mit `items` UND `payments` schließt sofort ab. So räumt der\n   **Offline-Puffer** seine Warteschlange: ein Gerät ohne Verbindung kann kein Gespräch führen,\n   es kann nur einen fertigen Vorgang nachreichen.\n\nEs gibt bewusst kein PATCH und kein DELETE: ein abgeschlossener Bon ist unveränderlich, die\nRücknahme ist ein Gegenbon (§3.5)."},"PosSession-pos_session.read":{"type":"object","description":"Schicht und Kassenabschluss (Doc 25 Stufe 11, Spec 04-52 §3.4).\n\nEs gibt bewusst kein PATCH: eine Schicht wird geöffnet, bewegt und geschlossen — jeder Schritt\nist eine Buchung mit eigener Invariante. Ein Formular-Update könnte den Anfangsbestand\nnachträglich ändern und damit die Kassendifferenz verschwinden lassen.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"registerUlid":{"type":["string","null"]},"registerId":{"type":["integer","null"]},"registerName":{"type":["string","null"]},"zNumber":{"description":"DSFinV-K `Z_NR` — fortlaufend je Kasse.","type":["integer","null"]},"status":{"description":"open|closed (read-only).","type":["string","null"]},"brandId":{"type":["integer","null"]},"openedAt":{"type":["string","null"]},"closedAt":{"type":["string","null"]},"openingCashAmount":{"type":["integer","null"]},"countedCashAmount":{"type":["integer","null"]},"expectedCashAmount":{"type":["integer","null"]},"cashDifferenceAmount":{"description":"Gezählt − Soll in Cent; negativ = es fehlt Geld.","type":["integer","null"]},"note":{"type":["string","null"]},"totals":{"description":"Summen der Schicht: geschlossen = eingefrorener Schnappschuss, offen = Zwischenstand.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"cashMovements":{"description":"Bargeldbewegungen der Schicht (nur im Detail):\n`{ulid, type, amount, reason, createdAt}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PosSession-pos_session.write":{"type":"object","description":"Schicht und Kassenabschluss (Doc 25 Stufe 11, Spec 04-52 §3.4).\n\nEs gibt bewusst kein PATCH: eine Schicht wird geöffnet, bewegt und geschlossen — jeder Schritt\nist eine Buchung mit eigener Invariante. Ein Formular-Update könnte den Anfangsbestand\nnachträglich ändern und damit die Kassendifferenz verschwinden lassen.","properties":{"registerUlid":{"type":["string","null"]},"openingCashAmount":{"type":["integer","null"]}}},"PosSession.jsonld-pos_session.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"registerUlid":{"type":["string","null"]},"registerId":{"type":["integer","null"]},"registerName":{"type":["string","null"]},"zNumber":{"description":"DSFinV-K `Z_NR` — fortlaufend je Kasse.","type":["integer","null"]},"status":{"description":"open|closed (read-only).","type":["string","null"]},"brandId":{"type":["integer","null"]},"openedAt":{"type":["string","null"]},"closedAt":{"type":["string","null"]},"openingCashAmount":{"type":["integer","null"]},"countedCashAmount":{"type":["integer","null"]},"expectedCashAmount":{"type":["integer","null"]},"cashDifferenceAmount":{"description":"Gezählt − Soll in Cent; negativ = es fehlt Geld.","type":["integer","null"]},"note":{"type":["string","null"]},"totals":{"description":"Summen der Schicht: geschlossen = eingefrorener Schnappschuss, offen = Zwischenstand.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"cashMovements":{"description":"Bargeldbewegungen der Schicht (nur im Detail):\n`{ulid, type, amount, reason, createdAt}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Schicht und Kassenabschluss (Doc 25 Stufe 11, Spec 04-52 §3.4).\n\nEs gibt bewusst kein PATCH: eine Schicht wird geöffnet, bewegt und geschlossen — jeder Schritt\nist eine Buchung mit eigener Invariante. Ein Formular-Update könnte den Anfangsbestand\nnachträglich ändern und damit die Kassendifferenz verschwinden lassen."},"PosSnapshot-pos_snapshot.read":{"type":"object","description":"Der Offline-Schnappschuss einer Kasse (Doc 25 Stufe 11, Spec 04-52 §10).\n\n**Eine eigene Ressource und kein Feld am Kassen-Stammsatz:** der Schnappschuss ist eine\nMomentaufnahme aus Kasse + Schicht + Artikelkatalog, die nur ein Kassengerät braucht. Am\nStammsatz wären das Felder, die jede Kassenliste mitschleppt, ohne sie je zu benutzen.","properties":{"ulid":{"description":"Die Kasse, für die der Schnappschuss gilt — zugleich der Identifier der Ressource.","type":["string","null"]},"register":{"description":"`{ulid, registerKey, name, brandId, locationName, workplaceKey}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"session":{"description":"Offene Schicht `{ulid, zNumber, openedAt}`; null = geschlossen, dann ist offline nichts zu\nkassieren.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"priceBasis":{"description":"Preisgrundlage der Artikelpreise: `shelf` = Regalpreis ohne Kundenbezug.","type":["string","null"]},"products":{"description":"`[{id, name, sku, gtin, unit, unitPriceAmount (BRUTTO), taxRate, taxCategory, updatedAt}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"productCount":{"type":["integer","null"]},"truncated":{"description":"Wurde der Lauf gedeckelt? Dann fehlen Artikel — und das steht hier, statt still zu passieren.","type":["boolean","null"]},"nextAfterId":{"description":"Fortsetzungs-Marke für den nächsten Lauf; null = es gibt nichts mehr.","type":["integer","null"]},"snapshotAt":{"type":["string","null"]},"capabilities":{"description":"Was das Gerät OHNE Verbindung anbieten darf — `offlineSale`, `offlineVoucher`,\n`offlinePickup`, `offlineCustomer`.","type":["object","null"],"additionalProperties":{"type":"boolean"}}}},"PosSnapshot.jsonld-pos_snapshot.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Die Kasse, für die der Schnappschuss gilt — zugleich der Identifier der Ressource.","type":["string","null"]},"register":{"description":"`{ulid, registerKey, name, brandId, locationName, workplaceKey}`.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"session":{"description":"Offene Schicht `{ulid, zNumber, openedAt}`; null = geschlossen, dann ist offline nichts zu\nkassieren.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"priceBasis":{"description":"Preisgrundlage der Artikelpreise: `shelf` = Regalpreis ohne Kundenbezug.","type":["string","null"]},"products":{"description":"`[{id, name, sku, gtin, unit, unitPriceAmount (BRUTTO), taxRate, taxCategory, updatedAt}]`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"productCount":{"type":["integer","null"]},"truncated":{"description":"Wurde der Lauf gedeckelt? Dann fehlen Artikel — und das steht hier, statt still zu passieren.","type":["boolean","null"]},"nextAfterId":{"description":"Fortsetzungs-Marke für den nächsten Lauf; null = es gibt nichts mehr.","type":["integer","null"]},"snapshotAt":{"type":["string","null"]},"capabilities":{"description":"Was das Gerät OHNE Verbindung anbieten darf — `offlineSale`, `offlineVoucher`,\n`offlinePickup`, `offlineCustomer`.","type":["object","null"],"additionalProperties":{"type":"boolean"}}}}],"description":"Der Offline-Schnappschuss einer Kasse (Doc 25 Stufe 11, Spec 04-52 §10).\n\n**Eine eigene Ressource und kein Feld am Kassen-Stammsatz:** der Schnappschuss ist eine\nMomentaufnahme aus Kasse + Schicht + Artikelkatalog, die nur ein Kassengerät braucht. Am\nStammsatz wären das Felder, die jede Kassenliste mitschleppt, ohne sie je zu benutzen."},"PriceResolution-price_resolution.read":{"type":"object","description":"Zustandslose Preis-Auflösung (15 §5) über {@see \\App\\Platform\\Commerce\\Pricing\\PriceResolutionPipeline}:\nStaffelpreise (OctiPricingTiers), Kunden-/Preislistenpreise (OctiPricingCustomer),\nKundengruppen-Regeln (OctiCustomerGroups), je nach aktivem Modul. Aufruf durch die\nBeleg-Editoren bei Produktwahl/Mengenänderung; `unitPriceAmount` null → Client nutzt\nProdukt-Standardpreis.\n\nBewusst keine Kopplung Beleg-Plugins ↔ Pricing-Plugins — nur dieser Kernel-Endpunkt;\ndeaktivierte Pricing-Module fallen einfach aus der Auflösung.","properties":{"id":{"type":["string","null"]},"unitPriceAmount":{"description":"Aufgelöster Stückpreis in Cent; null = keine Regel/kein Produkt-Plugin → Client nutzt Produkt-Standardpreis.","type":["integer","null"]},"appliedRule":{"description":"Angewandte Preisregel (z. B. „Kundenpreis\", „Staffelpreis 10+\"), null wenn keine griff.","type":["string","null"]}}},"PriceResolution-price_resolution.write":{"type":"object","description":"Zustandslose Preis-Auflösung (15 §5) über {@see \\App\\Platform\\Commerce\\Pricing\\PriceResolutionPipeline}:\nStaffelpreise (OctiPricingTiers), Kunden-/Preislistenpreise (OctiPricingCustomer),\nKundengruppen-Regeln (OctiCustomerGroups), je nach aktivem Modul. Aufruf durch die\nBeleg-Editoren bei Produktwahl/Mengenänderung; `unitPriceAmount` null → Client nutzt\nProdukt-Standardpreis.\n\nBewusst keine Kopplung Beleg-Plugins ↔ Pricing-Plugins — nur dieser Kernel-Endpunkt;\ndeaktivierte Pricing-Module fallen einfach aus der Auflösung.","required":["productId"],"properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"qty":{"minimum":0,"exclusiveMinimum":0,"default":1,"type":["number","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"PriceResolution.jsonld-price_resolution.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"unitPriceAmount":{"description":"Aufgelöster Stückpreis in Cent; null = keine Regel/kein Produkt-Plugin → Client nutzt Produkt-Standardpreis.","type":["integer","null"]},"appliedRule":{"description":"Angewandte Preisregel (z. B. „Kundenpreis\", „Staffelpreis 10+\"), null wenn keine griff.","type":["string","null"]}}}],"description":"Zustandslose Preis-Auflösung (15 §5) über {@see \\App\\Platform\\Commerce\\Pricing\\PriceResolutionPipeline}:\nStaffelpreise (OctiPricingTiers), Kunden-/Preislistenpreise (OctiPricingCustomer),\nKundengruppen-Regeln (OctiCustomerGroups), je nach aktivem Modul. Aufruf durch die\nBeleg-Editoren bei Produktwahl/Mengenänderung; `unitPriceAmount` null → Client nutzt\nProdukt-Standardpreis.\n\nBewusst keine Kopplung Beleg-Plugins ↔ Pricing-Plugins — nur dieser Kernel-Endpunkt;\ndeaktivierte Pricing-Module fallen einfach aus der Auflösung."},"PriceTierSet-price_tier_set.read":{"type":"object","description":"Staffel-Set inkl. eingebetteter Stufen (04-27 §5/§8, Muster PropertyGroup-Options).\n- `tiers` schreiben = voller Ersatz, vorab TierValidationService-Check (422 bei Überlappung/falscher offener Stufe)\n- DELETE = Soft-Delete.","properties":{"ulid":{"type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Katalog-Artikel (bigint-Referenz) — Pflicht bei Anlage.","type":["integer","null"]},"scope":{"enum":["global","pricelist","group"],"description":"global | pricelist | group (Default global).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (priceListId | groupId); Pflicht bei scope != global.","type":["integer","null"]},"qtyBasis":{"enum":["position","cart_total"],"description":"position | cart_total (Mengenbasis, ST1).","type":["string","null"]},"priority":{"description":"Auflösungs-Priorität bei mehreren passenden Sets — höher gewinnt.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"tiers":{"description":"Eingebettete Stufen.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PriceTierSet-price_tier_set.write":{"type":"object","description":"Staffel-Set inkl. eingebetteter Stufen (04-27 §5/§8, Muster PropertyGroup-Options).\n- `tiers` schreiben = voller Ersatz, vorab TierValidationService-Check (422 bei Überlappung/falscher offener Stufe)\n- DELETE = Soft-Delete.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Katalog-Artikel (bigint-Referenz) — Pflicht bei Anlage.","type":["integer","null"]},"scope":{"enum":["global","pricelist","group"],"description":"global | pricelist | group (Default global).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (priceListId | groupId); Pflicht bei scope != global.","type":["integer","null"]},"qtyBasis":{"enum":["position","cart_total"],"description":"position | cart_total (Mengenbasis, ST1).","type":["string","null"]},"priority":{"description":"Auflösungs-Priorität bei mehreren passenden Sets — höher gewinnt.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"tiers":{"description":"Eingebettete Stufen.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PriceTierSet-price_tier_set.write.jsonMergePatch":{"type":"object","description":"Staffel-Set inkl. eingebetteter Stufen (04-27 §5/§8, Muster PropertyGroup-Options).\n- `tiers` schreiben = voller Ersatz, vorab TierValidationService-Check (422 bei Überlappung/falscher offener Stufe)\n- DELETE = Soft-Delete.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Katalog-Artikel (bigint-Referenz) — Pflicht bei Anlage.","type":["integer","null"]},"scope":{"enum":["global","pricelist","group"],"description":"global | pricelist | group (Default global).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (priceListId | groupId); Pflicht bei scope != global.","type":["integer","null"]},"qtyBasis":{"enum":["position","cart_total"],"description":"position | cart_total (Mengenbasis, ST1).","type":["string","null"]},"priority":{"description":"Auflösungs-Priorität bei mehreren passenden Sets — höher gewinnt.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"tiers":{"description":"Eingebettete Stufen.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PriceTierSet.jsonld-price_tier_set.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Katalog-Artikel (bigint-Referenz) — Pflicht bei Anlage.","type":["integer","null"]},"scope":{"enum":["global","pricelist","group"],"description":"global | pricelist | group (Default global).","type":["string","null"]},"refId":{"minimum":0,"exclusiveMinimum":0,"description":"Referenz je Scope (priceListId | groupId); Pflicht bei scope != global.","type":["integer","null"]},"qtyBasis":{"enum":["position","cart_total"],"description":"position | cart_total (Mengenbasis, ST1).","type":["string","null"]},"priority":{"description":"Auflösungs-Priorität bei mehreren passenden Sets — höher gewinnt.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (Y-m-d).","type":["string","null"]},"validTo":{"description":"Gültig bis (Y-m-d, einschließlich).","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"description":"Marke (Doc 42, ENT-MARKE-01…04). `null` = für ALLE Marken gültig und damit der Zustand jedes\nBestandsdatensatzes (ENT-MARKE-02). Der Schnitt wirkt an der AUSWAHL — Liste und Preisfindung\nziehen nur die eigene Marke und die markenlosen; ein bestehender Beleg bleibt lesbar.","type":["integer","null"]},"tiers":{"description":"Eingebettete Stufen.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Staffel-Set inkl. eingebetteter Stufen (04-27 §5/§8, Muster PropertyGroup-Options).\n- `tiers` schreiben = voller Ersatz, vorab TierValidationService-Check (422 bei Überlappung/falscher offener Stufe)\n- DELETE = Soft-Delete."},"PrintJob-print_job.read":{"type":"object","description":"Die Warteschlange des Hardware-Hubs (Doc 25 AP 4.4).\n\n**Kein PATCH und kein DELETE:** ein eingestellter Druckauftrag ist ein Vorgang, kein Datensatz.\nEr wird abgebrochen (solange ihn niemand geholt hat) oder nachgedruckt — beides sind eigene\nOperationen mit eigener Vorbedingung, die ein generisches PATCH verstecken würde.\n\n**Die Nutzlast wird nie zurückgelesen.** Ein Etikett enthält Empfängeranschrift und\nSendungsnummer; die Warteschlange ist eine Betriebsansicht und kein Dokumentenarchiv. Wer das\nEtikett braucht, holt es am Beleg.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workplaceKey":{"type":["string","null"]},"workplaceName":{"type":["string","null"]},"documentType":{"type":["string","null"]},"format":{"description":"zpl|pdf.","type":["string","null"]},"copies":{"type":["integer","null"]},"printerName":{"type":["string","null"]},"status":{"description":"queued|claimed|printed|failed|cancelled.","type":["string","null"]},"error":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"claimedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]}}},"PrintJob-print_job.write":{"type":"object","description":"Die Warteschlange des Hardware-Hubs (Doc 25 AP 4.4).\n\n**Kein PATCH und kein DELETE:** ein eingestellter Druckauftrag ist ein Vorgang, kein Datensatz.\nEr wird abgebrochen (solange ihn niemand geholt hat) oder nachgedruckt — beides sind eigene\nOperationen mit eigener Vorbedingung, die ein generisches PATCH verstecken würde.\n\n**Die Nutzlast wird nie zurückgelesen.** Ein Etikett enthält Empfängeranschrift und\nSendungsnummer; die Warteschlange ist eine Betriebsansicht und kein Dokumentenarchiv. Wer das\nEtikett braucht, holt es am Beleg.","properties":{"workplaceKey":{"type":["string","null"]},"documentType":{"type":["string","null"]},"format":{"description":"zpl|pdf.","type":["string","null"]},"payload":{"description":"Nutzlast: ZPL-Text bzw. base64-kodiertes PDF. Nur Eingabe — nie in der Antwort.","type":["string","null"]},"copies":{"type":["integer","null"]},"printerKey":{"description":"Ausdrücklich verlangtes Gerät; ohne Angabe entscheidet die Registry.","type":["string","null"]}}},"PrintJob.jsonld-print_job.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workplaceKey":{"type":["string","null"]},"workplaceName":{"type":["string","null"]},"documentType":{"type":["string","null"]},"format":{"description":"zpl|pdf.","type":["string","null"]},"copies":{"type":["integer","null"]},"printerName":{"type":["string","null"]},"status":{"description":"queued|claimed|printed|failed|cancelled.","type":["string","null"]},"error":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"claimedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]}}}],"description":"Die Warteschlange des Hardware-Hubs (Doc 25 AP 4.4).\n\n**Kein PATCH und kein DELETE:** ein eingestellter Druckauftrag ist ein Vorgang, kein Datensatz.\nEr wird abgebrochen (solange ihn niemand geholt hat) oder nachgedruckt — beides sind eigene\nOperationen mit eigener Vorbedingung, die ein generisches PATCH verstecken würde.\n\n**Die Nutzlast wird nie zurückgelesen.** Ein Etikett enthält Empfängeranschrift und\nSendungsnummer; die Warteschlange ist eine Betriebsansicht und kein Dokumentenarchiv. Wer das\nEtikett braucht, holt es am Beleg."},"PrintWorkplace-print_workplace.read":{"type":"object","description":"Arbeitsplätze des Hardware-Hubs (Doc 25 AP 4.4).\n\nDie Token-Ausgabe ist bewusst eine eigene Operation und kein Feld: sie ist die einzige Stelle,\nan der ein Klartext-Token existiert, und sie ist nicht idempotent — jeder Aufruf entwertet das\nvorige Token. Als PATCH-Feld getarnt wäre beides unsichtbar.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workplaceKey":{"description":"Schlüssel, den der lokale Agent in seiner Konfiguration trägt (z. B. `packtisch-1`).","type":["string","null"]},"name":{"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]},"online":{"description":"Läuft dort gerade ein Agent? Die Auskunft, an der `isAvailable()` hängt.","type":["boolean","null"]},"tokenIssued":{"description":"Ist überhaupt ein Token ausgegeben? Ohne eines kann sich der Arbeitsplatz nie melden.","type":["boolean","null"]},"tokenPreview":{"description":"Nicht-geheimes Wiedererkennungs-Präfix des Tokens.","type":["string","null"]},"token":{"description":"Klartext-Token — NUR in der Antwort der Ausgabe-Operation belegt.","type":["string","null"]},"tokenRevoked":{"description":"Hat DIESE Änderung das Agent-Token entwertet? (Audit R35-51).","type":["boolean","null"]},"lastSeenAt":{"type":["string","null"]},"scaleDeviceKey":{"type":["string","null"]},"scaleWeightGrams":{"description":"Aktuelle Wägung in Gramm; null = keine Waage oder Wert veraltet.","type":["integer","null"]},"scaleStable":{"type":["boolean","null"]},"scaleMeasuredAt":{"type":["string","null"]},"printers":{"description":"Drucker des Arbeitsplatzes: {ulid, printerKey, name, format, documentTypes, isDefault, active}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"]}}},"PrintWorkplace-print_workplace.write":{"type":"object","description":"Arbeitsplätze des Hardware-Hubs (Doc 25 AP 4.4).\n\nDie Token-Ausgabe ist bewusst eine eigene Operation und kein Feld: sie ist die einzige Stelle,\nan der ein Klartext-Token existiert, und sie ist nicht idempotent — jeder Aufruf entwertet das\nvorige Token. Als PATCH-Feld getarnt wäre beides unsichtbar.","properties":{"workplaceKey":{"description":"Schlüssel, den der lokale Agent in seiner Konfiguration trägt (z. B. `packtisch-1`).","type":["string","null"]},"name":{"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"PrintWorkplace-print_workplace.write.jsonMergePatch":{"type":"object","description":"Arbeitsplätze des Hardware-Hubs (Doc 25 AP 4.4).\n\nDie Token-Ausgabe ist bewusst eine eigene Operation und kein Feld: sie ist die einzige Stelle,\nan der ein Klartext-Token existiert, und sie ist nicht idempotent — jeder Aufruf entwertet das\nvorige Token. Als PATCH-Feld getarnt wäre beides unsichtbar.","properties":{"workplaceKey":{"description":"Schlüssel, den der lokale Agent in seiner Konfiguration trägt (z. B. `packtisch-1`).","type":["string","null"]},"name":{"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"PrintWorkplace.jsonld-print_workplace.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workplaceKey":{"description":"Schlüssel, den der lokale Agent in seiner Konfiguration trägt (z. B. `packtisch-1`).","type":["string","null"]},"name":{"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]},"online":{"description":"Läuft dort gerade ein Agent? Die Auskunft, an der `isAvailable()` hängt.","type":["boolean","null"]},"tokenIssued":{"description":"Ist überhaupt ein Token ausgegeben? Ohne eines kann sich der Arbeitsplatz nie melden.","type":["boolean","null"]},"tokenPreview":{"description":"Nicht-geheimes Wiedererkennungs-Präfix des Tokens.","type":["string","null"]},"token":{"description":"Klartext-Token — NUR in der Antwort der Ausgabe-Operation belegt.","type":["string","null"]},"tokenRevoked":{"description":"Hat DIESE Änderung das Agent-Token entwertet? (Audit R35-51).","type":["boolean","null"]},"lastSeenAt":{"type":["string","null"]},"scaleDeviceKey":{"type":["string","null"]},"scaleWeightGrams":{"description":"Aktuelle Wägung in Gramm; null = keine Waage oder Wert veraltet.","type":["integer","null"]},"scaleStable":{"type":["boolean","null"]},"scaleMeasuredAt":{"type":["string","null"]},"printers":{"description":"Drucker des Arbeitsplatzes: {ulid, printerKey, name, format, documentTypes, isDefault, active}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"]}}}],"description":"Arbeitsplätze des Hardware-Hubs (Doc 25 AP 4.4).\n\nDie Token-Ausgabe ist bewusst eine eigene Operation und kein Feld: sie ist die einzige Stelle,\nan der ein Klartext-Token existiert, und sie ist nicht idempotent — jeder Aufruf entwertet das\nvorige Token. Als PATCH-Feld getarnt wäre beides unsichtbar."},"Printer-printer.read":{"type":"object","description":"Drucker-Registry (Doc 25 AP 4.4).\n\n`documentTypes` ist die eigentliche Zuordnung: `shipping_label` an den Zebra, `delivery_note` an\nden A4-Drucker. Leer heißt „nimmt alles\" — der Ein-Drucker-Fall soll ohne Konfiguration laufen.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workplaceUlid":{"type":["string","null"]},"workplaceKey":{"type":["string","null"]},"printerKey":{"description":"Schlüssel, unter dem der lokale Agent das Gerät kennt (Warteschlangenname des Betriebssystems).","type":["string","null"]},"name":{"type":["string","null"]},"format":{"description":"zpl|pdf.","type":["string","null"]},"documentTypes":{"description":"Angenommene Dokumenttypen; leer = alle.","type":["array","null"],"items":{"type":"string"}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"Printer-printer.write":{"type":"object","description":"Drucker-Registry (Doc 25 AP 4.4).\n\n`documentTypes` ist die eigentliche Zuordnung: `shipping_label` an den Zebra, `delivery_note` an\nden A4-Drucker. Leer heißt „nimmt alles\" — der Ein-Drucker-Fall soll ohne Konfiguration laufen.","properties":{"workplaceUlid":{"type":["string","null"]},"printerKey":{"description":"Schlüssel, unter dem der lokale Agent das Gerät kennt (Warteschlangenname des Betriebssystems).","type":["string","null"]},"name":{"type":["string","null"]},"format":{"description":"zpl|pdf.","type":["string","null"]},"documentTypes":{"description":"Angenommene Dokumenttypen; leer = alle.","type":["array","null"],"items":{"type":"string"}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"Printer-printer.write.jsonMergePatch":{"type":"object","description":"Drucker-Registry (Doc 25 AP 4.4).\n\n`documentTypes` ist die eigentliche Zuordnung: `shipping_label` an den Zebra, `delivery_note` an\nden A4-Drucker. Leer heißt „nimmt alles\" — der Ein-Drucker-Fall soll ohne Konfiguration laufen.","properties":{"workplaceUlid":{"type":["string","null"]},"printerKey":{"description":"Schlüssel, unter dem der lokale Agent das Gerät kennt (Warteschlangenname des Betriebssystems).","type":["string","null"]},"name":{"type":["string","null"]},"format":{"description":"zpl|pdf.","type":["string","null"]},"documentTypes":{"description":"Angenommene Dokumenttypen; leer = alle.","type":["array","null"],"items":{"type":"string"}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"Printer.jsonld-printer.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"workplaceUlid":{"type":["string","null"]},"workplaceKey":{"type":["string","null"]},"printerKey":{"description":"Schlüssel, unter dem der lokale Agent das Gerät kennt (Warteschlangenname des Betriebssystems).","type":["string","null"]},"name":{"type":["string","null"]},"format":{"description":"zpl|pdf.","type":["string","null"]},"documentTypes":{"description":"Angenommene Dokumenttypen; leer = alle.","type":["array","null"],"items":{"type":"string"}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Drucker-Registry (Doc 25 AP 4.4).\n\n`documentTypes` ist die eigentliche Zuordnung: `shipping_label` an den Zebra, `delivery_note` an\nden A4-Drucker. Leer heißt „nimmt alles\" — der Ein-Drucker-Fall soll ohne Konfiguration laufen."},"ProcurementFrameworkAgreement-proc_fa.read":{"type":"object","description":"Rahmenvereinbarung mit Lieferant (04-14 §3, KANN) — CRUD, Liste filterbar `?supplierRoleId=`.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Bestellungen referenzieren die Rahmenvereinbarung über\n`PurchaseOrder.frameworkAgreementId` (int). Ohne dieses Feld kann keine Oberfläche und kein\nMCP-Client die Verknüpfung setzen (Audit R23).","type":["integer","null"]},"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"title":{"maxLength":200,"type":["string","null"]},"status":{"enum":["draft","active","expired"],"type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"agreedRates":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"terms":{"type":["string","null"]},"ceilingAmount":{"minimum":0,"type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"ProcurementFrameworkAgreement-proc_fa.write":{"type":"object","description":"Rahmenvereinbarung mit Lieferant (04-14 §3, KANN) — CRUD, Liste filterbar `?supplierRoleId=`.","properties":{"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"title":{"maxLength":200,"type":["string","null"]},"status":{"enum":["draft","active","expired"],"type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"agreedRates":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"terms":{"type":["string","null"]},"ceilingAmount":{"minimum":0,"type":["integer","null"]}}},"ProcurementFrameworkAgreement-proc_fa.write.jsonMergePatch":{"type":"object","description":"Rahmenvereinbarung mit Lieferant (04-14 §3, KANN) — CRUD, Liste filterbar `?supplierRoleId=`.","properties":{"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"title":{"maxLength":200,"type":["string","null"]},"status":{"enum":["draft","active","expired"],"type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"agreedRates":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"terms":{"type":["string","null"]},"ceilingAmount":{"minimum":0,"type":["integer","null"]}}},"ProcurementFrameworkAgreement.jsonld-proc_fa.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Bestellungen referenzieren die Rahmenvereinbarung über\n`PurchaseOrder.frameworkAgreementId` (int). Ohne dieses Feld kann keine Oberfläche und kein\nMCP-Client die Verknüpfung setzen (Audit R23).","type":["integer","null"]},"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"title":{"maxLength":200,"type":["string","null"]},"status":{"enum":["draft","active","expired"],"type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"agreedRates":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"terms":{"type":["string","null"]},"ceilingAmount":{"minimum":0,"type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Rahmenvereinbarung mit Lieferant (04-14 §3, KANN) — CRUD, Liste filterbar `?supplierRoleId=`."},"ProcurementPurchaseOrder-proc_po.read":{"type":"object","description":"Bestellung/Beauftragung an Externen (04-14 §4) — CRUD + `/approve`, `/send`, `/deliver`,\n`/cancel`, `/record-actual`, PDF-Download `/pdf` (§9). Positionen eingebettet.\n\nJEDE Item-Operation traegt das KATALOG-Recht der Operation am Objekt (Audit R43-31):\n`is_granted('procurement.po.approve', object)` — {@see \\Octi\\Plugin\\Procurement\\Security\\ProcurementBrandVoter}\nprueft genau dieses Recht IN DER MARKE der Bestellung. Die frueheren Sammel-Attribute\n`proc.view`/`proc.manage` prueften nur „irgendein Einkaufs-Recht in der Marke\" und liessen\n * zusammen mit dem subjektlosen Teil davor das Kreuzprodukt „Recht in A × anderes Recht in B\" zu.\nEin zusaetzlicher subjektloser Teil entfaellt: das Objekt-Recht traegt ihn schon.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — u. a. entityId für den polymorphen Benutzerfeld-Editor.","type":["integer","null"]},"poNumber":{"type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"frameworkAgreementId":{"type":["integer","null"]},"status":{"type":["string","null"]},"editable":{"description":"Editierbar/löschbar bis Versand (Entwurf/freigegeben) — SSoT fürs Frontend-Edit-Gating (Detail + Liste).","type":["boolean","null"]},"orderDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"deliveryDeadline":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"budgetAmount":{"minimum":0,"type":["integer","null"]},"actualCostAmount":{"type":["integer","null"]},"paymentTermsDays":{"minimum":0,"type":["integer","null"]},"tolerancePercent":{"type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Bestell-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"approvedBy":{"type":["string","null"]},"approvedAt":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"items":{"description":"Eingebettete Positionen — Schreiben ersetzt alle (nur im Entwurf).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"]}}},"ProcurementPurchaseOrder-proc_po.write":{"type":"object","description":"Bestellung/Beauftragung an Externen (04-14 §4) — CRUD + `/approve`, `/send`, `/deliver`,\n`/cancel`, `/record-actual`, PDF-Download `/pdf` (§9). Positionen eingebettet.\n\nJEDE Item-Operation traegt das KATALOG-Recht der Operation am Objekt (Audit R43-31):\n`is_granted('procurement.po.approve', object)` — {@see \\Octi\\Plugin\\Procurement\\Security\\ProcurementBrandVoter}\nprueft genau dieses Recht IN DER MARKE der Bestellung. Die frueheren Sammel-Attribute\n`proc.view`/`proc.manage` prueften nur „irgendein Einkaufs-Recht in der Marke\" und liessen\n * zusammen mit dem subjektlosen Teil davor das Kreuzprodukt „Recht in A × anderes Recht in B\" zu.\nEin zusaetzlicher subjektloser Teil entfaellt: das Objekt-Recht traegt ihn schon.","properties":{"title":{"maxLength":200,"type":["string","null"]},"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"frameworkAgreementId":{"type":["integer","null"]},"orderDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"deliveryDeadline":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"budgetAmount":{"minimum":0,"type":["integer","null"]},"paymentTermsDays":{"minimum":0,"type":["integer","null"]},"tolerancePercent":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Bestell-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"items":{"description":"Eingebettete Positionen — Schreiben ersetzt alle (nur im Entwurf).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"partial":{"description":"Nur für `/deliver`: Teil- (true) oder Volllieferung (false).","type":["boolean","null"]},"recordedActualCost":{"minimum":0,"description":"Nur für `/record-actual`: aus lexoffice zurückgespiegelte Ist-Kosten in Cent.","type":["integer","null"]}}},"ProcurementPurchaseOrder-proc_po.write.jsonMergePatch":{"type":"object","description":"Bestellung/Beauftragung an Externen (04-14 §4) — CRUD + `/approve`, `/send`, `/deliver`,\n`/cancel`, `/record-actual`, PDF-Download `/pdf` (§9). Positionen eingebettet.\n\nJEDE Item-Operation traegt das KATALOG-Recht der Operation am Objekt (Audit R43-31):\n`is_granted('procurement.po.approve', object)` — {@see \\Octi\\Plugin\\Procurement\\Security\\ProcurementBrandVoter}\nprueft genau dieses Recht IN DER MARKE der Bestellung. Die frueheren Sammel-Attribute\n`proc.view`/`proc.manage` prueften nur „irgendein Einkaufs-Recht in der Marke\" und liessen\n * zusammen mit dem subjektlosen Teil davor das Kreuzprodukt „Recht in A × anderes Recht in B\" zu.\nEin zusaetzlicher subjektloser Teil entfaellt: das Objekt-Recht traegt ihn schon.","properties":{"title":{"maxLength":200,"type":["string","null"]},"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"frameworkAgreementId":{"type":["integer","null"]},"orderDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"deliveryDeadline":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"budgetAmount":{"minimum":0,"type":["integer","null"]},"paymentTermsDays":{"minimum":0,"type":["integer","null"]},"tolerancePercent":{"type":["string","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Bestell-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"items":{"description":"Eingebettete Positionen — Schreiben ersetzt alle (nur im Entwurf).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"partial":{"description":"Nur für `/deliver`: Teil- (true) oder Volllieferung (false).","type":["boolean","null"]},"recordedActualCost":{"minimum":0,"description":"Nur für `/record-actual`: aus lexoffice zurückgespiegelte Ist-Kosten in Cent.","type":["integer","null"]}}},"ProcurementPurchaseOrder.jsonld-proc_po.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — u. a. entityId für den polymorphen Benutzerfeld-Editor.","type":["integer","null"]},"poNumber":{"type":["string","null"]},"title":{"maxLength":200,"type":["string","null"]},"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"frameworkAgreementId":{"type":["integer","null"]},"status":{"type":["string","null"]},"editable":{"description":"Editierbar/löschbar bis Versand (Entwurf/freigegeben) — SSoT fürs Frontend-Edit-Gating (Detail + Liste).","type":["boolean","null"]},"orderDate":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"deliveryDeadline":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"budgetAmount":{"minimum":0,"type":["integer","null"]},"actualCostAmount":{"type":["integer","null"]},"paymentTermsDays":{"minimum":0,"type":["integer","null"]},"tolerancePercent":{"type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"notes":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Bestell-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"approvedBy":{"type":["string","null"]},"approvedAt":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"items":{"description":"Eingebettete Positionen — Schreiben ersetzt alle (nur im Entwurf).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"]}}}],"description":"Bestellung/Beauftragung an Externen (04-14 §4) — CRUD + `/approve`, `/send`, `/deliver`,\n`/cancel`, `/record-actual`, PDF-Download `/pdf` (§9). Positionen eingebettet.\n\nJEDE Item-Operation traegt das KATALOG-Recht der Operation am Objekt (Audit R43-31):\n`is_granted('procurement.po.approve', object)` — {@see \\Octi\\Plugin\\Procurement\\Security\\ProcurementBrandVoter}\nprueft genau dieses Recht IN DER MARKE der Bestellung. Die frueheren Sammel-Attribute\n`proc.view`/`proc.manage` prueften nur „irgendein Einkaufs-Recht in der Marke\" und liessen\n * zusammen mit dem subjektlosen Teil davor das Kreuzprodukt „Recht in A × anderes Recht in B\" zu.\nEin zusaetzlicher subjektloser Teil entfaellt: das Objekt-Recht traegt ihn schon."},"ProcurementPurchaseOrderStatus-proc_po_status.read":{"type":"object","description":"Bestell-Status als Daten (04-14 §3) — in Einstellungen pflegbar. `key` = PurchaseOrder::STATUS_*.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProcurementPurchaseOrderStatus-proc_po_status.update.jsonMergePatch":{"type":"object","description":"Bestell-Status als Daten (04-14 §3) — in Einstellungen pflegbar. `key` = PurchaseOrder::STATUS_*.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProcurementPurchaseOrderStatus-proc_po_status.write":{"type":"object","description":"Bestell-Status als Daten (04-14 §3) — in Einstellungen pflegbar. `key` = PurchaseOrder::STATUS_*.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProcurementPurchaseOrderStatus.jsonld-proc_po_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Bestell-Status als Daten (04-14 §3) — in Einstellungen pflegbar. `key` = PurchaseOrder::STATUS_*."},"ProcurementPurchaseOrderSummary-proc_po_summary.read":{"type":"object","description":"Kopf-Kennzahl der Bestell-Liste (Audit R23) — serverseitige Aggregation über den GESAMTEN\ngefilterten Bestand, nicht über die geladene Seite.\n- Nimmt dieselben Filter wie `/v1/procurement/purchase-orders` entgegen und nutzt dafür dieselbe\n  Query-Basis ({@see \\Octi\\Plugin\\Procurement\\Service\\PurchaseOrderListQuery}) — Liste und Kennzahl\n  können nicht auseinanderlaufen.\n- Bewusst NICHT `/v1/procurement/report`: der Report summiert `budgetAmount` (Soll-Kosten je\n  Projekt/Lieferant), die Liste zeigt `totalAmount` (Bestellvolumen) — andere Zahl, anderes Recht.\n- Rechte identisch zur Liste (`procurement.po.edit`), damit die Kennzahl nie 403 gibt, wo die\n  Liste 200 liefert.","properties":{"id":{"type":["string","null"]},"committedAmount":{"description":"Verbindlich gebundenes Volumen in Cent: SUM(totalAmount) über die gefilterte Menge, beschränkt\nauf die committeten Status (freigegeben/versendet/(teil)geliefert/abgeschlossen) — Entwürfe und\nStornos zählen nicht. Das ist die Zahl hinter dem Listenkopf-Label „Committet\".","type":["integer","null"]},"committedCount":{"description":"Anzahl der committeten Bestellungen in der gefilterten Menge.","type":["integer","null"]},"totalAmount":{"description":"SUM(totalAmount) über die gefilterte Menge inkl. Entwürfe/Stornos (= Summe aller Listenzeilen).","type":["integer","null"]},"totalCount":{"description":"Anzahl aller Bestellungen in der gefilterten Menge (= `totalItems` der Liste).","type":["integer","null"]}}},"ProcurementPurchaseOrderSummary.jsonld-proc_po_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"committedAmount":{"description":"Verbindlich gebundenes Volumen in Cent: SUM(totalAmount) über die gefilterte Menge, beschränkt\nauf die committeten Status (freigegeben/versendet/(teil)geliefert/abgeschlossen) — Entwürfe und\nStornos zählen nicht. Das ist die Zahl hinter dem Listenkopf-Label „Committet\".","type":["integer","null"]},"committedCount":{"description":"Anzahl der committeten Bestellungen in der gefilterten Menge.","type":["integer","null"]},"totalAmount":{"description":"SUM(totalAmount) über die gefilterte Menge inkl. Entwürfe/Stornos (= Summe aller Listenzeilen).","type":["integer","null"]},"totalCount":{"description":"Anzahl aller Bestellungen in der gefilterten Menge (= `totalItems` der Liste).","type":["integer","null"]}}}],"description":"Kopf-Kennzahl der Bestell-Liste (Audit R23) — serverseitige Aggregation über den GESAMTEN\ngefilterten Bestand, nicht über die geladene Seite.\n- Nimmt dieselben Filter wie `/v1/procurement/purchase-orders` entgegen und nutzt dafür dieselbe\n  Query-Basis ({@see \\Octi\\Plugin\\Procurement\\Service\\PurchaseOrderListQuery}) — Liste und Kennzahl\n  können nicht auseinanderlaufen.\n- Bewusst NICHT `/v1/procurement/report`: der Report summiert `budgetAmount` (Soll-Kosten je\n  Projekt/Lieferant), die Liste zeigt `totalAmount` (Bestellvolumen) — andere Zahl, anderes Recht.\n- Rechte identisch zur Liste (`procurement.po.edit`), damit die Kennzahl nie 403 gibt, wo die\n  Liste 200 liefert."},"ProcurementReport-proc_report.read":{"type":"object","description":"Controlling-Auswertung Einkauf (04-14 §4/§5) — externe Kosten je Projekt/Lieferant (Soll vs.\nIst) + Kennzahlen. Read-only, markenscope-gefiltert.","properties":{"id":{"type":["string","null"]},"byProject":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"bySupplier":{"description":"`lexofficeActual` = in lexoffice gebuchte Ist-Kosten je Lieferant (04-14 §8); NULL ohne\nIntegration/bei Abruf-Fehler. `supplierRoleId` = geteilte Lieferanten-Rolle (OctiSuppliers).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["integer","null"]}}},"summary":{"type":["object","null"],"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"integer"}]}}}},"ProcurementReport.jsonld-proc_report.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"byProject":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"bySupplier":{"description":"`lexofficeActual` = in lexoffice gebuchte Ist-Kosten je Lieferant (04-14 §8); NULL ohne\nIntegration/bei Abruf-Fehler. `supplierRoleId` = geteilte Lieferanten-Rolle (OctiSuppliers).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["integer","null"]}}},"summary":{"type":["object","null"],"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"integer"}]}}}}],"description":"Controlling-Auswertung Einkauf (04-14 §4/§5) — externe Kosten je Projekt/Lieferant (Soll vs.\nIst) + Kennzahlen. Read-only, markenscope-gefiltert."},"ProcurementSupplierRating-proc_rating.read":{"type":"object","description":"Lieferantenbewertung (04-14 §3/§4, KANN): Qualität/Termin/Preis je 1–5. Liste je `?supplierRoleId=`.","properties":{"ulid":{"type":["string","null"]},"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"qualityScore":{"type":["integer","null"]},"deadlineScore":{"type":["integer","null"]},"priceScore":{"type":["integer","null"]},"score":{"type":["string","null"]},"comment":{"type":["string","null"]},"ratedBy":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"ProcurementSupplierRating-proc_rating.write":{"type":"object","description":"Lieferantenbewertung (04-14 §3/§4, KANN): Qualität/Termin/Preis je 1–5. Liste je `?supplierRoleId=`.","properties":{"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"qualityScore":{"type":["integer","null"]},"deadlineScore":{"type":["integer","null"]},"priceScore":{"type":["integer","null"]},"comment":{"type":["string","null"]}}},"ProcurementSupplierRating.jsonld-proc_rating.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"supplierRoleId":{"description":"Geteilte Lieferanten-Rolle (04-29, supplier_role.id — OctiSuppliers).","type":["integer","null"]},"projectId":{"type":["integer","null"]},"qualityScore":{"type":["integer","null"]},"deadlineScore":{"type":["integer","null"]},"priceScore":{"type":["integer","null"]},"score":{"type":["string","null"]},"comment":{"type":["string","null"]},"ratedBy":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Lieferantenbewertung (04-14 §3/§4, KANN): Qualität/Termin/Preis je 1–5. Liste je `?supplierRoleId=`."},"Product-product.read":{"type":"object","description":"Produkt-/Leistungskatalog-Resource (04-07 §5), markenübergreifend.\n- Lesen: catalog.view; Pflege: catalog.manage.\n- Preise stets in Cent (Money-VO, EUR).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"type":{"enum":["service","product","license","bundle"],"description":"service | product | license | bundle (04-07 §3, 04-16 §3).","type":["string","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"description":{"type":["string","null"]},"defaultPriceAmount":{"minimum":0,"description":"Standard-Stückpreis in Cent.","type":["integer","null"]},"rrpAmount":{"minimum":0,"description":"Unverbindliche Preisempfehlung (UVP) in Cent — Streichpreis-Bezug, nie ein berechneter Preis\n(Doc 25 AP 6.1). `0` löscht die Angabe wie `null`: eine UVP von 0,00 € ist keine Empfehlung.","type":["integer","null"]},"rrpSavingsAmount":{"description":"Ersparnis gegenüber der UVP in Cent (read-only); null, wenn die UVP nicht über dem VK liegt.","type":["integer","null"]},"rrpSavingsPercent":{"description":"Ersparnis gegenüber der UVP in Prozent der UVP (read-only, eine Nachkommastelle); null wie oben.","type":["number","null"]},"unit":{"description":"Stunde | Stück | Monat | Jahr …","type":["string","null"]},"taxRateId":{"type":["integer","null"]},"taxRatePercent":{"description":"USt-Satz in Prozent (read-only, aus dem TaxRate-Katalog) — für die Brutto-Anzeige am Artikel.","type":["number","null"]},"categoryId":{"description":"Leitkategorie-ID (read-only Anzeige/Filter — Schreiben ausschließlich über `categoryUlid`).","type":["integer","null"]},"categoryUlid":{"description":"Leitkategorie als ULID (bevorzugte Schreibform; ULID→id serverseitig, 422 bei unbekannt; '' bzw. null = keine Leitkategorie).","type":["string","null"]},"categoryName":{"description":"Name der Leitkategorie (read-only) — für Listen/Detail-Anzeige ohne Nachladen.","type":["string","null"]},"additionalCategoryUlids":{"description":"Zusatzkategorien als ULIDs (voller Sync, ohne Leitkategorie); nur Item-/Schreib-Sicht hydratisiert (N+1-Vermeidung).","type":["array","null"],"items":{"type":"string"}},"status":{"enum":["draft","active","eol"],"description":"draft | active | eol.","type":["string","null"]},"brandId":{"description":"Marke des Artikels (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — der\nZustand jedes Bestandsartikels. Der Schnitt ist WEICH: ein bestehender Beleg auf einen\nArtikel fremder Marke bleibt lesbar. **Bestand und Lagerorte bleiben markenübergreifend**\n(Doc 42 §6) — ein Artikel gehört einer Marke, sein Bestand liegt trotzdem in einem Lager.","type":["integer","null"]},"billingMode":{"enum":["one_off","recurring"],"description":"one_off | recurring.","type":["string","null"]},"recurringInterval":{"enum":["month","quarter","year",null],"description":"month | quarter | year (nur bei recurring).","type":["string","null"]},"isOwnProduct":{"type":["boolean","null"]},"lexofficeArticleRef":{"type":["string","null"]},"active":{"type":["boolean","null"]},"billable":{"type":["boolean","null"]},"productKind":{"enum":["standalone","container","variant"],"description":"Artikel-Rolle (04-16 §3): standalone | container | variant.","type":["string","null"]},"parentProductUlid":{"description":"ULID des Container-Artikels (nur bei productKind=variant; read-only).","type":["string","null"]},"purchasePriceAmount":{"minimum":0,"description":"Standard-Einkaufspreis in Cent (Money-VO, EUR).","type":["integer","null"]},"basePriceContent":{"description":"Grundpreis (PAngV): Füllmenge als decimal-String, z. B. '0.500' bei 500 g.","type":["string","null"]},"basePriceUnit":{"maxLength":20,"description":"Grundpreis-Bezugseinheit (PAngV), z. B. 'kg', 'l'.","type":["string","null"]},"referencePriceAmount":{"description":"Referenzpreis in Cent je Basiseinheit (PAngV, read-only — {@see \\Octi\\Plugin\\Product\\Service\\BasePriceCalculator}).","type":["integer","null"]},"manufacturerUlid":{"description":"Hersteller (GPSR); Schreiben per ULID des ProductManufacturer.","type":["string","null"]},"ean":{"maxLength":20,"description":"EAN/GTIN des Artikels.","type":["string","null"]},"manufacturerNumber":{"maxLength":64,"description":"Herstellernummer / MPN.","type":["string","null"]},"availableFrom":{"description":"Verfügbar ab (ISO-8601); null = sofort.","type":["string","null"]},"weightGrams":{"minimum":0,"description":"Gewicht in Gramm (Versand/Zoll).","type":["integer","null"]},"lengthMm":{"minimum":0,"description":"Abmessungen in Millimetern (Versand).","type":["integer","null"]},"widthMm":{"minimum":0,"type":["integer","null"]},"heightMm":{"minimum":0,"type":["integer","null"]},"customsTariffNumber":{"maxLength":20,"description":"Zolltarifnummer (HS-Code) für Export/Zoll.","type":["string","null"]},"countryOfOrigin":{"pattern":"^([A-Z]{2})$","description":"Ursprungsland (ISO 3166-1 alpha-2). Regex statt Assert\\Country (symfony/intl nicht installiert).","type":["string","null"]},"deliveryTimeCode":{"description":"Lieferzeit-Lookup; Schreiben per `code` der ProductDeliveryTime.","type":["string","null"]},"stockManaged":{"description":"Lagergeführt (StockLevel/StockMovement) — nur Standalone/Variante, nie Container.","type":["boolean","null"]},"translations":{"description":"Locale => {name, internalName, shortDescription, longDescription, metaTitle, metaDescription, slug}; Processor upsertet zeilenweise.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"media":{"description":"list<{ulid?, fileId, role, docType, sortOrder, alt}>; Processor synct vollständig (fehlende Zeilen werden entfernt).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"properties":{"description":"Eigenschafts-Zuordnungen als Options-ULIDs (PropertyOption); vollständiger Sync.","type":["array","null"],"items":{"type":"string"}},"relations":{"description":"Gerichtete Artikel-Beziehungen: list<{relatedProductUlid, type}> mit\ntype ∈ cross_sell|accessory|similar; vollständiger Sync.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"bundle":{"description":"Bundle-/Set-Definition (nur type=bundle, sonst 422): {mode: sales_set|bom,\nfixedPriceAmount?, items: list<{componentProductUlid, qty}>}. Zyklen werden je\nKomponente abgelehnt (BundleService::assertAcyclic).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"variantAxes":{"description":"Varianten-Achsen des Containers als PropertyGroup-ULIDs (nur productKind=container,\nnur variantForming-Gruppen; VariantSet-Upsert).","type":["array","null"],"items":{"type":"string"}},"stock":{"description":"Bestandsstand (read-only, falls StockLevel existiert): {onHand, reserved, available}.","type":["object","null"],"additionalProperties":{"type":"integer"}}},"required":["name"]},"Product-product.write":{"type":"object","description":"Produkt-/Leistungskatalog-Resource (04-07 §5), markenübergreifend.\n- Lesen: catalog.view; Pflege: catalog.manage.\n- Preise stets in Cent (Money-VO, EUR).","properties":{"type":{"enum":["service","product","license","bundle"],"description":"service | product | license | bundle (04-07 §3, 04-16 §3).","type":["string","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"description":{"type":["string","null"]},"defaultPriceAmount":{"minimum":0,"description":"Standard-Stückpreis in Cent.","type":["integer","null"]},"rrpAmount":{"minimum":0,"description":"Unverbindliche Preisempfehlung (UVP) in Cent — Streichpreis-Bezug, nie ein berechneter Preis\n(Doc 25 AP 6.1). `0` löscht die Angabe wie `null`: eine UVP von 0,00 € ist keine Empfehlung.","type":["integer","null"]},"unit":{"description":"Stunde | Stück | Monat | Jahr …","type":["string","null"]},"taxRateId":{"type":["integer","null"]},"categoryUlid":{"description":"Leitkategorie als ULID (bevorzugte Schreibform; ULID→id serverseitig, 422 bei unbekannt; '' bzw. null = keine Leitkategorie).","type":["string","null"]},"additionalCategoryUlids":{"description":"Zusatzkategorien als ULIDs (voller Sync, ohne Leitkategorie); nur Item-/Schreib-Sicht hydratisiert (N+1-Vermeidung).","type":["array","null"],"items":{"type":"string"}},"status":{"enum":["draft","active","eol"],"description":"draft | active | eol.","type":["string","null"]},"brandId":{"description":"Marke des Artikels (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — der\nZustand jedes Bestandsartikels. Der Schnitt ist WEICH: ein bestehender Beleg auf einen\nArtikel fremder Marke bleibt lesbar. **Bestand und Lagerorte bleiben markenübergreifend**\n(Doc 42 §6) — ein Artikel gehört einer Marke, sein Bestand liegt trotzdem in einem Lager.","type":["integer","null"]},"billingMode":{"enum":["one_off","recurring"],"description":"one_off | recurring.","type":["string","null"]},"recurringInterval":{"enum":["month","quarter","year",null],"description":"month | quarter | year (nur bei recurring).","type":["string","null"]},"isOwnProduct":{"type":["boolean","null"]},"lexofficeArticleRef":{"type":["string","null"]},"active":{"type":["boolean","null"]},"billable":{"type":["boolean","null"]},"productKind":{"enum":["standalone","container","variant"],"description":"Artikel-Rolle (04-16 §3): standalone | container | variant.","type":["string","null"]},"purchasePriceAmount":{"minimum":0,"description":"Standard-Einkaufspreis in Cent (Money-VO, EUR).","type":["integer","null"]},"basePriceContent":{"description":"Grundpreis (PAngV): Füllmenge als decimal-String, z. B. '0.500' bei 500 g.","type":["string","null"]},"basePriceUnit":{"maxLength":20,"description":"Grundpreis-Bezugseinheit (PAngV), z. B. 'kg', 'l'.","type":["string","null"]},"manufacturerUlid":{"description":"Hersteller (GPSR); Schreiben per ULID des ProductManufacturer.","type":["string","null"]},"ean":{"maxLength":20,"description":"EAN/GTIN des Artikels.","type":["string","null"]},"manufacturerNumber":{"maxLength":64,"description":"Herstellernummer / MPN.","type":["string","null"]},"availableFrom":{"description":"Verfügbar ab (ISO-8601); null = sofort.","type":["string","null"]},"weightGrams":{"minimum":0,"description":"Gewicht in Gramm (Versand/Zoll).","type":["integer","null"]},"lengthMm":{"minimum":0,"description":"Abmessungen in Millimetern (Versand).","type":["integer","null"]},"widthMm":{"minimum":0,"type":["integer","null"]},"heightMm":{"minimum":0,"type":["integer","null"]},"customsTariffNumber":{"maxLength":20,"description":"Zolltarifnummer (HS-Code) für Export/Zoll.","type":["string","null"]},"countryOfOrigin":{"pattern":"^([A-Z]{2})$","description":"Ursprungsland (ISO 3166-1 alpha-2). Regex statt Assert\\Country (symfony/intl nicht installiert).","type":["string","null"]},"deliveryTimeCode":{"description":"Lieferzeit-Lookup; Schreiben per `code` der ProductDeliveryTime.","type":["string","null"]},"stockManaged":{"description":"Lagergeführt (StockLevel/StockMovement) — nur Standalone/Variante, nie Container.","type":["boolean","null"]},"translations":{"description":"Locale => {name, internalName, shortDescription, longDescription, metaTitle, metaDescription, slug}; Processor upsertet zeilenweise.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"media":{"description":"list<{ulid?, fileId, role, docType, sortOrder, alt}>; Processor synct vollständig (fehlende Zeilen werden entfernt).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"properties":{"description":"Eigenschafts-Zuordnungen als Options-ULIDs (PropertyOption); vollständiger Sync.","type":["array","null"],"items":{"type":"string"}},"relations":{"description":"Gerichtete Artikel-Beziehungen: list<{relatedProductUlid, type}> mit\ntype ∈ cross_sell|accessory|similar; vollständiger Sync.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"bundle":{"description":"Bundle-/Set-Definition (nur type=bundle, sonst 422): {mode: sales_set|bom,\nfixedPriceAmount?, items: list<{componentProductUlid, qty}>}. Zyklen werden je\nKomponente abgelehnt (BundleService::assertAcyclic).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"variantAxes":{"description":"Varianten-Achsen des Containers als PropertyGroup-ULIDs (nur productKind=container,\nnur variantForming-Gruppen; VariantSet-Upsert).","type":["array","null"],"items":{"type":"string"}}},"required":["name"]},"Product-product.write.jsonMergePatch":{"type":"object","description":"Produkt-/Leistungskatalog-Resource (04-07 §5), markenübergreifend.\n- Lesen: catalog.view; Pflege: catalog.manage.\n- Preise stets in Cent (Money-VO, EUR).","properties":{"type":{"enum":["service","product","license","bundle"],"description":"service | product | license | bundle (04-07 §3, 04-16 §3).","type":["string","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"description":{"type":["string","null"]},"defaultPriceAmount":{"minimum":0,"description":"Standard-Stückpreis in Cent.","type":["integer","null"]},"rrpAmount":{"minimum":0,"description":"Unverbindliche Preisempfehlung (UVP) in Cent — Streichpreis-Bezug, nie ein berechneter Preis\n(Doc 25 AP 6.1). `0` löscht die Angabe wie `null`: eine UVP von 0,00 € ist keine Empfehlung.","type":["integer","null"]},"unit":{"description":"Stunde | Stück | Monat | Jahr …","type":["string","null"]},"taxRateId":{"type":["integer","null"]},"categoryUlid":{"description":"Leitkategorie als ULID (bevorzugte Schreibform; ULID→id serverseitig, 422 bei unbekannt; '' bzw. null = keine Leitkategorie).","type":["string","null"]},"additionalCategoryUlids":{"description":"Zusatzkategorien als ULIDs (voller Sync, ohne Leitkategorie); nur Item-/Schreib-Sicht hydratisiert (N+1-Vermeidung).","type":["array","null"],"items":{"type":"string"}},"status":{"enum":["draft","active","eol"],"description":"draft | active | eol.","type":["string","null"]},"brandId":{"description":"Marke des Artikels (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — der\nZustand jedes Bestandsartikels. Der Schnitt ist WEICH: ein bestehender Beleg auf einen\nArtikel fremder Marke bleibt lesbar. **Bestand und Lagerorte bleiben markenübergreifend**\n(Doc 42 §6) — ein Artikel gehört einer Marke, sein Bestand liegt trotzdem in einem Lager.","type":["integer","null"]},"billingMode":{"enum":["one_off","recurring"],"description":"one_off | recurring.","type":["string","null"]},"recurringInterval":{"enum":["month","quarter","year",null],"description":"month | quarter | year (nur bei recurring).","type":["string","null"]},"isOwnProduct":{"type":["boolean","null"]},"lexofficeArticleRef":{"type":["string","null"]},"active":{"type":["boolean","null"]},"billable":{"type":["boolean","null"]},"productKind":{"enum":["standalone","container","variant"],"description":"Artikel-Rolle (04-16 §3): standalone | container | variant.","type":["string","null"]},"purchasePriceAmount":{"minimum":0,"description":"Standard-Einkaufspreis in Cent (Money-VO, EUR).","type":["integer","null"]},"basePriceContent":{"description":"Grundpreis (PAngV): Füllmenge als decimal-String, z. B. '0.500' bei 500 g.","type":["string","null"]},"basePriceUnit":{"maxLength":20,"description":"Grundpreis-Bezugseinheit (PAngV), z. B. 'kg', 'l'.","type":["string","null"]},"manufacturerUlid":{"description":"Hersteller (GPSR); Schreiben per ULID des ProductManufacturer.","type":["string","null"]},"ean":{"maxLength":20,"description":"EAN/GTIN des Artikels.","type":["string","null"]},"manufacturerNumber":{"maxLength":64,"description":"Herstellernummer / MPN.","type":["string","null"]},"availableFrom":{"description":"Verfügbar ab (ISO-8601); null = sofort.","type":["string","null"]},"weightGrams":{"minimum":0,"description":"Gewicht in Gramm (Versand/Zoll).","type":["integer","null"]},"lengthMm":{"minimum":0,"description":"Abmessungen in Millimetern (Versand).","type":["integer","null"]},"widthMm":{"minimum":0,"type":["integer","null"]},"heightMm":{"minimum":0,"type":["integer","null"]},"customsTariffNumber":{"maxLength":20,"description":"Zolltarifnummer (HS-Code) für Export/Zoll.","type":["string","null"]},"countryOfOrigin":{"pattern":"^([A-Z]{2})$","description":"Ursprungsland (ISO 3166-1 alpha-2). Regex statt Assert\\Country (symfony/intl nicht installiert).","type":["string","null"]},"deliveryTimeCode":{"description":"Lieferzeit-Lookup; Schreiben per `code` der ProductDeliveryTime.","type":["string","null"]},"stockManaged":{"description":"Lagergeführt (StockLevel/StockMovement) — nur Standalone/Variante, nie Container.","type":["boolean","null"]},"translations":{"description":"Locale => {name, internalName, shortDescription, longDescription, metaTitle, metaDescription, slug}; Processor upsertet zeilenweise.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"media":{"description":"list<{ulid?, fileId, role, docType, sortOrder, alt}>; Processor synct vollständig (fehlende Zeilen werden entfernt).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"properties":{"description":"Eigenschafts-Zuordnungen als Options-ULIDs (PropertyOption); vollständiger Sync.","type":["array","null"],"items":{"type":"string"}},"relations":{"description":"Gerichtete Artikel-Beziehungen: list<{relatedProductUlid, type}> mit\ntype ∈ cross_sell|accessory|similar; vollständiger Sync.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"bundle":{"description":"Bundle-/Set-Definition (nur type=bundle, sonst 422): {mode: sales_set|bom,\nfixedPriceAmount?, items: list<{componentProductUlid, qty}>}. Zyklen werden je\nKomponente abgelehnt (BundleService::assertAcyclic).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"variantAxes":{"description":"Varianten-Achsen des Containers als PropertyGroup-ULIDs (nur productKind=container,\nnur variantForming-Gruppen; VariantSet-Upsert).","type":["array","null"],"items":{"type":"string"}}}},"Product.jsonld-product.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"type":{"enum":["service","product","license","bundle"],"description":"service | product | license | bundle (04-07 §3, 04-16 §3).","type":["string","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"description":{"type":["string","null"]},"defaultPriceAmount":{"minimum":0,"description":"Standard-Stückpreis in Cent.","type":["integer","null"]},"rrpAmount":{"minimum":0,"description":"Unverbindliche Preisempfehlung (UVP) in Cent — Streichpreis-Bezug, nie ein berechneter Preis\n(Doc 25 AP 6.1). `0` löscht die Angabe wie `null`: eine UVP von 0,00 € ist keine Empfehlung.","type":["integer","null"]},"rrpSavingsAmount":{"description":"Ersparnis gegenüber der UVP in Cent (read-only); null, wenn die UVP nicht über dem VK liegt.","type":["integer","null"]},"rrpSavingsPercent":{"description":"Ersparnis gegenüber der UVP in Prozent der UVP (read-only, eine Nachkommastelle); null wie oben.","type":["number","null"]},"unit":{"description":"Stunde | Stück | Monat | Jahr …","type":["string","null"]},"taxRateId":{"type":["integer","null"]},"taxRatePercent":{"description":"USt-Satz in Prozent (read-only, aus dem TaxRate-Katalog) — für die Brutto-Anzeige am Artikel.","type":["number","null"]},"categoryId":{"description":"Leitkategorie-ID (read-only Anzeige/Filter — Schreiben ausschließlich über `categoryUlid`).","type":["integer","null"]},"categoryUlid":{"description":"Leitkategorie als ULID (bevorzugte Schreibform; ULID→id serverseitig, 422 bei unbekannt; '' bzw. null = keine Leitkategorie).","type":["string","null"]},"categoryName":{"description":"Name der Leitkategorie (read-only) — für Listen/Detail-Anzeige ohne Nachladen.","type":["string","null"]},"additionalCategoryUlids":{"description":"Zusatzkategorien als ULIDs (voller Sync, ohne Leitkategorie); nur Item-/Schreib-Sicht hydratisiert (N+1-Vermeidung).","type":["array","null"],"items":{"type":"string"}},"status":{"enum":["draft","active","eol"],"description":"draft | active | eol.","type":["string","null"]},"brandId":{"description":"Marke des Artikels (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — der\nZustand jedes Bestandsartikels. Der Schnitt ist WEICH: ein bestehender Beleg auf einen\nArtikel fremder Marke bleibt lesbar. **Bestand und Lagerorte bleiben markenübergreifend**\n(Doc 42 §6) — ein Artikel gehört einer Marke, sein Bestand liegt trotzdem in einem Lager.","type":["integer","null"]},"billingMode":{"enum":["one_off","recurring"],"description":"one_off | recurring.","type":["string","null"]},"recurringInterval":{"enum":["month","quarter","year",null],"description":"month | quarter | year (nur bei recurring).","type":["string","null"]},"isOwnProduct":{"type":["boolean","null"]},"lexofficeArticleRef":{"type":["string","null"]},"active":{"type":["boolean","null"]},"billable":{"type":["boolean","null"]},"productKind":{"enum":["standalone","container","variant"],"description":"Artikel-Rolle (04-16 §3): standalone | container | variant.","type":["string","null"]},"parentProductUlid":{"description":"ULID des Container-Artikels (nur bei productKind=variant; read-only).","type":["string","null"]},"purchasePriceAmount":{"minimum":0,"description":"Standard-Einkaufspreis in Cent (Money-VO, EUR).","type":["integer","null"]},"basePriceContent":{"description":"Grundpreis (PAngV): Füllmenge als decimal-String, z. B. '0.500' bei 500 g.","type":["string","null"]},"basePriceUnit":{"maxLength":20,"description":"Grundpreis-Bezugseinheit (PAngV), z. B. 'kg', 'l'.","type":["string","null"]},"referencePriceAmount":{"description":"Referenzpreis in Cent je Basiseinheit (PAngV, read-only — {@see \\Octi\\Plugin\\Product\\Service\\BasePriceCalculator}).","type":["integer","null"]},"manufacturerUlid":{"description":"Hersteller (GPSR); Schreiben per ULID des ProductManufacturer.","type":["string","null"]},"ean":{"maxLength":20,"description":"EAN/GTIN des Artikels.","type":["string","null"]},"manufacturerNumber":{"maxLength":64,"description":"Herstellernummer / MPN.","type":["string","null"]},"availableFrom":{"description":"Verfügbar ab (ISO-8601); null = sofort.","type":["string","null"]},"weightGrams":{"minimum":0,"description":"Gewicht in Gramm (Versand/Zoll).","type":["integer","null"]},"lengthMm":{"minimum":0,"description":"Abmessungen in Millimetern (Versand).","type":["integer","null"]},"widthMm":{"minimum":0,"type":["integer","null"]},"heightMm":{"minimum":0,"type":["integer","null"]},"customsTariffNumber":{"maxLength":20,"description":"Zolltarifnummer (HS-Code) für Export/Zoll.","type":["string","null"]},"countryOfOrigin":{"pattern":"^([A-Z]{2})$","description":"Ursprungsland (ISO 3166-1 alpha-2). Regex statt Assert\\Country (symfony/intl nicht installiert).","type":["string","null"]},"deliveryTimeCode":{"description":"Lieferzeit-Lookup; Schreiben per `code` der ProductDeliveryTime.","type":["string","null"]},"stockManaged":{"description":"Lagergeführt (StockLevel/StockMovement) — nur Standalone/Variante, nie Container.","type":["boolean","null"]},"translations":{"description":"Locale => {name, internalName, shortDescription, longDescription, metaTitle, metaDescription, slug}; Processor upsertet zeilenweise.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"media":{"description":"list<{ulid?, fileId, role, docType, sortOrder, alt}>; Processor synct vollständig (fehlende Zeilen werden entfernt).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"properties":{"description":"Eigenschafts-Zuordnungen als Options-ULIDs (PropertyOption); vollständiger Sync.","type":["array","null"],"items":{"type":"string"}},"relations":{"description":"Gerichtete Artikel-Beziehungen: list<{relatedProductUlid, type}> mit\ntype ∈ cross_sell|accessory|similar; vollständiger Sync.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"bundle":{"description":"Bundle-/Set-Definition (nur type=bundle, sonst 422): {mode: sales_set|bom,\nfixedPriceAmount?, items: list<{componentProductUlid, qty}>}. Zyklen werden je\nKomponente abgelehnt (BundleService::assertAcyclic).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"variantAxes":{"description":"Varianten-Achsen des Containers als PropertyGroup-ULIDs (nur productKind=container,\nnur variantForming-Gruppen; VariantSet-Upsert).","type":["array","null"],"items":{"type":"string"}},"stock":{"description":"Bestandsstand (read-only, falls StockLevel existiert): {onHand, reserved, available}.","type":["object","null"],"additionalProperties":{"type":"integer"}}},"required":["name"]}],"description":"Produkt-/Leistungskatalog-Resource (04-07 §5), markenübergreifend.\n- Lesen: catalog.view; Pflege: catalog.manage.\n- Preise stets in Cent (Money-VO, EUR)."},"ProductBulkAction-product_bulk.read":{"type":"object","description":"Sammelaktion auf mehrere Artikel (`POST /v1/products/bulk`).\n- Setzt Leitkategorie/Steuersatz/Status/Aktiv-Flag, ergänzt/entfernt Zusatzkategorien.\n- Aggregat-Antwort, synthetische Kennung (Muster {@see ProductImportResource}).\n- Je Artikel per Entität+Setter (kein Bulk-DQL — würde Audit/`ProductUpdated` umgehen).\n- null = Feld unangetastet; `categoryUlid=''` leert Leitkategorie.\n- Fehler je ULID gesammelt statt Abbruch.","properties":{"ulid":{"description":"Synthetische Lauf-Kennung (Aggregat-Antwort ohne Entity).","type":["string","null"]},"total":{"description":"Anzahl übergebener ULIDs.","type":["integer","null"]},"updated":{"description":"Erfolgreich geänderte Artikel.","type":["integer","null"]},"skipped":{"description":"Übersprungene (nicht gefunden / Fehler).","type":["integer","null"]},"errors":{"description":"Fehler je ULID: `{ulid, message}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"ProductBulkAction-product_bulk.write":{"type":"object","description":"Sammelaktion auf mehrere Artikel (`POST /v1/products/bulk`).\n- Setzt Leitkategorie/Steuersatz/Status/Aktiv-Flag, ergänzt/entfernt Zusatzkategorien.\n- Aggregat-Antwort, synthetische Kennung (Muster {@see ProductImportResource}).\n- Je Artikel per Entität+Setter (kein Bulk-DQL — würde Audit/`ProductUpdated` umgehen).\n- null = Feld unangetastet; `categoryUlid=''` leert Leitkategorie.\n- Fehler je ULID gesammelt statt Abbruch.","properties":{"productUlids":{"description":"ULIDs der betroffenen Artikel (Pflicht, max. 500).","type":["array","null"],"items":{"type":"string"}},"categoryUlid":{"description":"Leitkategorie setzen (ULID); '' leert die Leitkategorie; null = nicht anfassen.","type":["string","null"]},"addCategoryUlids":{"description":"Zusatzkategorien ergänzen (ULIDs).","type":["array","null"],"items":{"type":"string"}},"removeCategoryUlids":{"description":"Zusatzkategorien entfernen (ULIDs).","type":["array","null"],"items":{"type":"string"}},"taxRateId":{"description":"Steuersatz setzen (TaxRate-Id); null = nicht anfassen.","type":["integer","null"]},"status":{"description":"Status setzen (draft|active|eol); null = nicht anfassen.","type":["string","null"]},"active":{"description":"Aktiv-Flag setzen; null = nicht anfassen.","type":["boolean","null"]}}},"ProductBulkAction.jsonld-product_bulk.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische Lauf-Kennung (Aggregat-Antwort ohne Entity).","type":["string","null"]},"total":{"description":"Anzahl übergebener ULIDs.","type":["integer","null"]},"updated":{"description":"Erfolgreich geänderte Artikel.","type":["integer","null"]},"skipped":{"description":"Übersprungene (nicht gefunden / Fehler).","type":["integer","null"]},"errors":{"description":"Fehler je ULID: `{ulid, message}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}}],"description":"Sammelaktion auf mehrere Artikel (`POST /v1/products/bulk`).\n- Setzt Leitkategorie/Steuersatz/Status/Aktiv-Flag, ergänzt/entfernt Zusatzkategorien.\n- Aggregat-Antwort, synthetische Kennung (Muster {@see ProductImportResource}).\n- Je Artikel per Entität+Setter (kein Bulk-DQL — würde Audit/`ProductUpdated` umgehen).\n- null = Feld unangetastet; `categoryUlid=''` leert Leitkategorie.\n- Fehler je ULID gesammelt statt Abbruch."},"ProductCategory-product_category.move":{"type":"object","description":"Katalog-Kategorie (04-16 §3/§7) als Baum (parentUlid/parentId).\n- `kind`: Reporting-Schnitt (service/product/license).\n- `categoryType`: Shop-Darstellung (page/structure/link).\n- Shop-Texte (Beschreibung/SEO/Slug) je Locale in `translations`; `name` = interner Fallback.\n- `/move`: hängt Kategorie atomar um, resequenziert Geschwister lückenlos.","properties":{"parentUlid":{"description":"Übergeordnete Kategorie als ULID (bevorzugte Schreibform).","type":["string","null"]},"position":{"description":"Nur `/move`: Ziel-Position innerhalb der Geschwister (0-basiert; fehlend = ans Ende).","type":["integer","null"]}}},"ProductCategory-product_category.read":{"type":"object","description":"Katalog-Kategorie (04-16 §3/§7) als Baum (parentUlid/parentId).\n- `kind`: Reporting-Schnitt (service/product/license).\n- `categoryType`: Shop-Darstellung (page/structure/link).\n- Shop-Texte (Beschreibung/SEO/Slug) je Locale in `translations`; `name` = interner Fallback.\n- `/move`: hängt Kategorie atomar um, resequenziert Geschwister lückenlos.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische Id (read-only) — Produkte referenzieren sie als `categoryId`.","type":["integer","null"]},"name":{"maxLength":150,"description":"Interner Name (Fallback, wenn keine Übersetzung für eine Locale gepflegt ist).","type":["string","null"]},"parentUlid":{"description":"Übergeordnete Kategorie als ULID (bevorzugte Schreibform).","type":["string","null"]},"parentId":{"description":"Übergeordnete Kategorie als numerische Id (Alt-Schreibform; `parentUlid` bevorzugen).","type":["integer","null"]},"kind":{"enum":["service","product","license"],"description":"service | product | license.","type":["string","null"]},"categoryType":{"enum":["page","structure","link"],"description":"Shop-Darstellung: page (eigene Seite) | structure (Gliederung) | link (externe URL).","type":["string","null"]},"externalUrl":{"format":"uri","maxLength":500,"description":"Link-Ziel für `categoryType=link`; leerer String löscht (Merge-PATCH-Konvention).","externalDocs":{"url":"https://schema.org/url"},"type":["string","null"]},"linkNewTab":{"description":"Link in neuem Tab öffnen (nur `categoryType=link`).","type":["boolean","null"]},"visibleInNavigation":{"description":"In der Shop-Navigation anzeigen; unabhängig von `active`.","type":["boolean","null"]},"displayNestedProducts":{"description":"Produkte aus Unterkategorien auf der Kategorieseite mit anzeigen.","type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Kategorie-Bild (File-Modul); numerische File-Id, 0 löscht (Merge-PATCH-Konvention).","type":["integer","null"]},"mediaFileUlid":{"description":"ULID des Kategorie-Bilds (read-only, für Vorschau/Download über das File-Modul).","type":["string","null"]},"translations":{"description":"Locale => {name, shortDescription, longDescription, metaTitle, metaDescription, keywords, slug}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"productCount":{"description":"Anzahl aktiv zugeordneter Produkte (read-only, ohne Unterkategorien).","type":["integer","null"]}},"required":["name"]},"ProductCategory-product_category.write":{"type":"object","description":"Katalog-Kategorie (04-16 §3/§7) als Baum (parentUlid/parentId).\n- `kind`: Reporting-Schnitt (service/product/license).\n- `categoryType`: Shop-Darstellung (page/structure/link).\n- Shop-Texte (Beschreibung/SEO/Slug) je Locale in `translations`; `name` = interner Fallback.\n- `/move`: hängt Kategorie atomar um, resequenziert Geschwister lückenlos.","required":["name"],"properties":{"name":{"maxLength":150,"description":"Interner Name (Fallback, wenn keine Übersetzung für eine Locale gepflegt ist).","type":["string","null"]},"parentUlid":{"description":"Übergeordnete Kategorie als ULID (bevorzugte Schreibform).","type":["string","null"]},"parentId":{"description":"Übergeordnete Kategorie als numerische Id (Alt-Schreibform; `parentUlid` bevorzugen).","type":["integer","null"]},"kind":{"enum":["service","product","license"],"description":"service | product | license.","type":["string","null"]},"categoryType":{"enum":["page","structure","link"],"description":"Shop-Darstellung: page (eigene Seite) | structure (Gliederung) | link (externe URL).","type":["string","null"]},"externalUrl":{"format":"uri","maxLength":500,"description":"Link-Ziel für `categoryType=link`; leerer String löscht (Merge-PATCH-Konvention).","externalDocs":{"url":"https://schema.org/url"},"type":["string","null"]},"linkNewTab":{"description":"Link in neuem Tab öffnen (nur `categoryType=link`).","type":["boolean","null"]},"visibleInNavigation":{"description":"In der Shop-Navigation anzeigen; unabhängig von `active`.","type":["boolean","null"]},"displayNestedProducts":{"description":"Produkte aus Unterkategorien auf der Kategorieseite mit anzeigen.","type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Kategorie-Bild (File-Modul); numerische File-Id, 0 löscht (Merge-PATCH-Konvention).","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, longDescription, metaTitle, metaDescription, keywords, slug}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductCategory-product_category.write.jsonMergePatch":{"type":"object","description":"Katalog-Kategorie (04-16 §3/§7) als Baum (parentUlid/parentId).\n- `kind`: Reporting-Schnitt (service/product/license).\n- `categoryType`: Shop-Darstellung (page/structure/link).\n- Shop-Texte (Beschreibung/SEO/Slug) je Locale in `translations`; `name` = interner Fallback.\n- `/move`: hängt Kategorie atomar um, resequenziert Geschwister lückenlos.","properties":{"name":{"maxLength":150,"description":"Interner Name (Fallback, wenn keine Übersetzung für eine Locale gepflegt ist).","type":["string","null"]},"parentUlid":{"description":"Übergeordnete Kategorie als ULID (bevorzugte Schreibform).","type":["string","null"]},"parentId":{"description":"Übergeordnete Kategorie als numerische Id (Alt-Schreibform; `parentUlid` bevorzugen).","type":["integer","null"]},"kind":{"enum":["service","product","license"],"description":"service | product | license.","type":["string","null"]},"categoryType":{"enum":["page","structure","link"],"description":"Shop-Darstellung: page (eigene Seite) | structure (Gliederung) | link (externe URL).","type":["string","null"]},"externalUrl":{"format":"uri","maxLength":500,"description":"Link-Ziel für `categoryType=link`; leerer String löscht (Merge-PATCH-Konvention).","externalDocs":{"url":"https://schema.org/url"},"type":["string","null"]},"linkNewTab":{"description":"Link in neuem Tab öffnen (nur `categoryType=link`).","type":["boolean","null"]},"visibleInNavigation":{"description":"In der Shop-Navigation anzeigen; unabhängig von `active`.","type":["boolean","null"]},"displayNestedProducts":{"description":"Produkte aus Unterkategorien auf der Kategorieseite mit anzeigen.","type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Kategorie-Bild (File-Modul); numerische File-Id, 0 löscht (Merge-PATCH-Konvention).","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, longDescription, metaTitle, metaDescription, keywords, slug}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductCategory.jsonld-product_category.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische Id (read-only) — Produkte referenzieren sie als `categoryId`.","type":["integer","null"]},"name":{"maxLength":150,"description":"Interner Name (Fallback, wenn keine Übersetzung für eine Locale gepflegt ist).","type":["string","null"]},"parentUlid":{"description":"Übergeordnete Kategorie als ULID (bevorzugte Schreibform).","type":["string","null"]},"parentId":{"description":"Übergeordnete Kategorie als numerische Id (Alt-Schreibform; `parentUlid` bevorzugen).","type":["integer","null"]},"kind":{"enum":["service","product","license"],"description":"service | product | license.","type":["string","null"]},"categoryType":{"enum":["page","structure","link"],"description":"Shop-Darstellung: page (eigene Seite) | structure (Gliederung) | link (externe URL).","type":["string","null"]},"externalUrl":{"format":"uri","maxLength":500,"description":"Link-Ziel für `categoryType=link`; leerer String löscht (Merge-PATCH-Konvention).","externalDocs":{"url":"https://schema.org/url"},"type":["string","null"]},"linkNewTab":{"description":"Link in neuem Tab öffnen (nur `categoryType=link`).","type":["boolean","null"]},"visibleInNavigation":{"description":"In der Shop-Navigation anzeigen; unabhängig von `active`.","type":["boolean","null"]},"displayNestedProducts":{"description":"Produkte aus Unterkategorien auf der Kategorieseite mit anzeigen.","type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Kategorie-Bild (File-Modul); numerische File-Id, 0 löscht (Merge-PATCH-Konvention).","type":["integer","null"]},"mediaFileUlid":{"description":"ULID des Kategorie-Bilds (read-only, für Vorschau/Download über das File-Modul).","type":["string","null"]},"translations":{"description":"Locale => {name, shortDescription, longDescription, metaTitle, metaDescription, keywords, slug}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"productCount":{"description":"Anzahl aktiv zugeordneter Produkte (read-only, ohne Unterkategorien).","type":["integer","null"]}},"required":["name"]}],"description":"Katalog-Kategorie (04-16 §3/§7) als Baum (parentUlid/parentId).\n- `kind`: Reporting-Schnitt (service/product/license).\n- `categoryType`: Shop-Darstellung (page/structure/link).\n- Shop-Texte (Beschreibung/SEO/Slug) je Locale in `translations`; `name` = interner Fallback.\n- `/move`: hängt Kategorie atomar um, resequenziert Geschwister lückenlos."},"ProductCustomerPrice-product_customer_price.read":{"type":"object","description":"Produktsicht auf Kundenpreise (`GET /v1/product-customer-prices?productId=`).\n- Listet alle scope=product-Konditionen dieses Artikels über alle Preislisten\n- Read-only; Pflege bleibt kunden-scoped unter /v1/customer-prices.","properties":{"ulid":{"type":["string","null"]},"customerId":{"description":"Name-Auflösung im Frontend via Customer-Lookup.","type":["integer","null"]},"listName":{"type":["string","null"]},"listActive":{"type":["boolean","null"]},"rateType":{"description":"price | percent.","type":["string","null"]},"value":{"description":"Wert: bei price Cent, bei percent Prozent×100.","type":["integer","null"]},"minQty":{"description":"Ab-Menge (Staffel-Kondition) als Dezimal-String; null = ab 1.","type":["string","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]}}},"ProductCustomerPrice.jsonld-product_customer_price.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"customerId":{"description":"Name-Auflösung im Frontend via Customer-Lookup.","type":["integer","null"]},"listName":{"type":["string","null"]},"listActive":{"type":["boolean","null"]},"rateType":{"description":"price | percent.","type":["string","null"]},"value":{"description":"Wert: bei price Cent, bei percent Prozent×100.","type":["integer","null"]},"minQty":{"description":"Ab-Menge (Staffel-Kondition) als Dezimal-String; null = ab 1.","type":["string","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]}}}],"description":"Produktsicht auf Kundenpreise (`GET /v1/product-customer-prices?productId=`).\n- Listet alle scope=product-Konditionen dieses Artikels über alle Preislisten\n- Read-only; Pflege bleibt kunden-scoped unter /v1/customer-prices."},"ProductDefaultBin-product_default_bin.read":{"type":"object","description":"Feste Vorgabeplätze je Artikel (Doc 25 AP 4.8, B1 (c)).\n\nSie beantworten „wo gehört das hin\" VOR jeder Sortier-Strategie. Mehrere je Artikel sind\nerlaubt — ein Fach kann voll sein, dann ist der Nachbar die richtige Antwort.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"productId":{"description":"Artikel (nur bei Anlage setzbar).","type":["integer","null"]},"binId":{"description":"Lagerplatz (nur bei Anlage setzbar; muss zu diesem Lager gehören).","type":["integer","null"]},"binCode":{"type":["string","null"]},"priority":{"description":"Reihenfolge mehrerer Vorgabeplätze: niedriger = zuerst vorschlagen.","type":["integer","null"]}}},"ProductDefaultBin-product_default_bin.write":{"type":"object","description":"Feste Vorgabeplätze je Artikel (Doc 25 AP 4.8, B1 (c)).\n\nSie beantworten „wo gehört das hin\" VOR jeder Sortier-Strategie. Mehrere je Artikel sind\nerlaubt — ein Fach kann voll sein, dann ist der Nachbar die richtige Antwort.","properties":{"productId":{"description":"Artikel (nur bei Anlage setzbar).","type":["integer","null"]},"binId":{"description":"Lagerplatz (nur bei Anlage setzbar; muss zu diesem Lager gehören).","type":["integer","null"]},"priority":{"description":"Reihenfolge mehrerer Vorgabeplätze: niedriger = zuerst vorschlagen.","type":["integer","null"]}}},"ProductDefaultBin-product_default_bin.write.jsonMergePatch":{"type":"object","description":"Feste Vorgabeplätze je Artikel (Doc 25 AP 4.8, B1 (c)).\n\nSie beantworten „wo gehört das hin\" VOR jeder Sortier-Strategie. Mehrere je Artikel sind\nerlaubt — ein Fach kann voll sein, dann ist der Nachbar die richtige Antwort.","properties":{"productId":{"description":"Artikel (nur bei Anlage setzbar).","type":["integer","null"]},"binId":{"description":"Lagerplatz (nur bei Anlage setzbar; muss zu diesem Lager gehören).","type":["integer","null"]},"priority":{"description":"Reihenfolge mehrerer Vorgabeplätze: niedriger = zuerst vorschlagen.","type":["integer","null"]}}},"ProductDefaultBin.jsonld-product_default_bin.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"productId":{"description":"Artikel (nur bei Anlage setzbar).","type":["integer","null"]},"binId":{"description":"Lagerplatz (nur bei Anlage setzbar; muss zu diesem Lager gehören).","type":["integer","null"]},"binCode":{"type":["string","null"]},"priority":{"description":"Reihenfolge mehrerer Vorgabeplätze: niedriger = zuerst vorschlagen.","type":["integer","null"]}}}],"description":"Feste Vorgabeplätze je Artikel (Doc 25 AP 4.8, B1 (c)).\n\nSie beantworten „wo gehört das hin\" VOR jeder Sortier-Strategie. Mehrere je Artikel sind\nerlaubt — ein Fach kann voll sein, dann ist der Nachbar die richtige Antwort."},"ProductDeliveryTime-product_delivery_time.read":{"type":"object","description":"Lieferzeit-Lookup (04-16 §3/§7): reine Lesesicht.\n- Am Artikel per `deliveryTimeCode` referenziert.\n- Zeilen aus Standard-Daten-Seed (`ProductStandardDataProvider`).\n- Bewusst keine Schreib-Operationen über die API.","properties":{"ulid":{"type":["string","null"]},"code":{"type":["string","null"]},"name":{"type":["string","null"]},"minDays":{"description":"null = unbestimmt (auf Anfrage).","type":["integer","null"]},"maxDays":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ProductDeliveryTime.jsonld-product_delivery_time.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"code":{"type":["string","null"]},"name":{"type":["string","null"]},"minDays":{"description":"null = unbestimmt (auf Anfrage).","type":["integer","null"]},"maxDays":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}}],"description":"Lieferzeit-Lookup (04-16 §3/§7): reine Lesesicht.\n- Am Artikel per `deliveryTimeCode` referenziert.\n- Zeilen aus Standard-Daten-Seed (`ProductStandardDataProvider`).\n- Bewusst keine Schreib-Operationen über die API."},"ProductDuplicate-product_duplicate.read":{"type":"object","description":"Artikel duplizieren (`POST /v1/products/duplicate` mit `{sourceUlid}`).\n- Bewusst COLLECTION-Post-Aggregat (Muster {@see ProductImportResource}):\n  Item-Op `/{ulid}/duplicate` mit leerem Rumpf ließe `$data` im Legacy-Flow unauflösbar.\n- Antwort trägt Kennung des NEUEN Artikels (UI-Navigation).","properties":{"ulid":{"description":"ULID des NEUEN (duplizierten) Artikels — read-only Kennung der Aggregat-Antwort.","type":["string","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"status":{"type":["string","null"]}}},"ProductDuplicate-product_duplicate.write":{"type":"object","description":"Artikel duplizieren (`POST /v1/products/duplicate` mit `{sourceUlid}`).\n- Bewusst COLLECTION-Post-Aggregat (Muster {@see ProductImportResource}):\n  Item-Op `/{ulid}/duplicate` mit leerem Rumpf ließe `$data` im Legacy-Flow unauflösbar.\n- Antwort trägt Kennung des NEUEN Artikels (UI-Navigation).","required":["sourceUlid"],"properties":{"sourceUlid":{"description":"ULID des Quell-Artikels (Pflicht).","type":["string","null"]}}},"ProductDuplicate.jsonld-product_duplicate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID des NEUEN (duplizierten) Artikels — read-only Kennung der Aggregat-Antwort.","type":["string","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"status":{"type":["string","null"]}}}],"description":"Artikel duplizieren (`POST /v1/products/duplicate` mit `{sourceUlid}`).\n- Bewusst COLLECTION-Post-Aggregat (Muster {@see ProductImportResource}):\n  Item-Op `/{ulid}/duplicate` mit leerem Rumpf ließe `$data` im Legacy-Flow unauflösbar.\n- Antwort trägt Kennung des NEUEN Artikels (UI-Navigation)."},"ProductGroupPriceRule-product_group_price_rule.read":{"type":"object","description":"GET /v1/product-group-price-rules?productId= — alle scope=product-Regeln dieses Artikels\nüber alle Gruppen (Kundengruppen-Preise-Panel). Read-only; Pflege bleibt gruppen-scoped\nunter /v1/customer-groups/{ulid}/price-rules.","properties":{"ulid":{"type":["string","null"]},"groupUlid":{"description":"ULID der Kundengruppe (Sprung ins Gruppen-Detail).","type":["string","null"]},"groupName":{"type":["string","null"]},"rateType":{"description":"percent | fixed.","type":["string","null"]},"value":{"description":"Wert: bei percent Prozent×100, bei fixed Cent.","type":["integer","null"]},"basis":{"description":"list | net (Bezugsbasis des Rabatts).","type":["string","null"]},"priority":{"type":["integer","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]}}},"ProductGroupPriceRule.jsonld-product_group_price_rule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"groupUlid":{"description":"ULID der Kundengruppe (Sprung ins Gruppen-Detail).","type":["string","null"]},"groupName":{"type":["string","null"]},"rateType":{"description":"percent | fixed.","type":["string","null"]},"value":{"description":"Wert: bei percent Prozent×100, bei fixed Cent.","type":["integer","null"]},"basis":{"description":"list | net (Bezugsbasis des Rabatts).","type":["string","null"]},"priority":{"type":["integer","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]}}}],"description":"GET /v1/product-group-price-rules?productId= — alle scope=product-Regeln dieses Artikels\nüber alle Gruppen (Kundengruppen-Preise-Panel). Read-only; Pflege bleibt gruppen-scoped\nunter /v1/customer-groups/{ulid}/price-rules."},"ProductImport-product_import.read":{"type":"object","description":"CSV-Massen-Import des Produktkatalogs (`POST /v1/products/import`).\n- Base64-JSON `{content, dryRun?}` (Muster BankStatementImportResource, kein Multipart).\n- Upsert per SKU (nie Duplikate); Zeilenfehler gesammelt statt Abbruch.\n- `dryRun=true`: validiert vollständig, schreibt garantiert nichts.\n- Antwort: Lauf-Report `{dryRun, total, created, updated, skipped, errors[]}` (Muster PagesImportResource).\n- Spalten: sku (Pflicht) · name (Pflicht bei Neuanlage) · description · type · price ·\n  taxRate · category · manufacturer · unit · active. Details {@see \\Octi\\Plugin\\Product\\Service\\ProductCsvImporter}.","properties":{"ulid":{"description":"Synthetische Lauf-Kennung (Aggregat-Antwort ohne Entity).","type":["string","null"]},"dryRun":{"description":"true = nur validieren (Vorschau-Report), es wird garantiert nichts geschrieben. Default false.","type":["boolean","null"]},"total":{"description":"Anzahl der Datenzeilen der Datei.","type":["integer","null"]},"created":{"description":"Neu angelegte Artikel (bei dryRun: würde angelegt).","type":["integer","null"]},"updated":{"description":"Per SKU aktualisierte Artikel (bei dryRun: würde aktualisiert).","type":["integer","null"]},"skipped":{"description":"Übersprungene Zeilen: fehlerhafte (siehe errors) + unveränderte Bestandszeilen.","type":["integer","null"]},"errors":{"description":"Zeilenfehler `{line, field, message}`; `line` = 1-basierte CSV-Datensatz-Nr. (Kopfzeile=1).","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}},"ProductImport-product_import.write":{"type":"object","description":"CSV-Massen-Import des Produktkatalogs (`POST /v1/products/import`).\n- Base64-JSON `{content, dryRun?}` (Muster BankStatementImportResource, kein Multipart).\n- Upsert per SKU (nie Duplikate); Zeilenfehler gesammelt statt Abbruch.\n- `dryRun=true`: validiert vollständig, schreibt garantiert nichts.\n- Antwort: Lauf-Report `{dryRun, total, created, updated, skipped, errors[]}` (Muster PagesImportResource).\n- Spalten: sku (Pflicht) · name (Pflicht bei Neuanlage) · description · type · price ·\n  taxRate · category · manufacturer · unit · active. Details {@see \\Octi\\Plugin\\Product\\Service\\ProductCsvImporter}.","properties":{"content":{"description":"CSV-Inhalt Base64-kodiert (Pflicht). UTF-8 mit/ohne BOM; Trennzeichen `;` oder `,` (auto).","type":["string","null"]},"dryRun":{"description":"true = nur validieren (Vorschau-Report), es wird garantiert nichts geschrieben. Default false.","type":["boolean","null"]}}},"ProductImport.jsonld-product_import.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische Lauf-Kennung (Aggregat-Antwort ohne Entity).","type":["string","null"]},"dryRun":{"description":"true = nur validieren (Vorschau-Report), es wird garantiert nichts geschrieben. Default false.","type":["boolean","null"]},"total":{"description":"Anzahl der Datenzeilen der Datei.","type":["integer","null"]},"created":{"description":"Neu angelegte Artikel (bei dryRun: würde angelegt).","type":["integer","null"]},"updated":{"description":"Per SKU aktualisierte Artikel (bei dryRun: würde aktualisiert).","type":["integer","null"]},"skipped":{"description":"Übersprungene Zeilen: fehlerhafte (siehe errors) + unveränderte Bestandszeilen.","type":["integer","null"]},"errors":{"description":"Zeilenfehler `{line, field, message}`; `line` = 1-basierte CSV-Datensatz-Nr. (Kopfzeile=1).","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}}],"description":"CSV-Massen-Import des Produktkatalogs (`POST /v1/products/import`).\n- Base64-JSON `{content, dryRun?}` (Muster BankStatementImportResource, kein Multipart).\n- Upsert per SKU (nie Duplikate); Zeilenfehler gesammelt statt Abbruch.\n- `dryRun=true`: validiert vollständig, schreibt garantiert nichts.\n- Antwort: Lauf-Report `{dryRun, total, created, updated, skipped, errors[]}` (Muster PagesImportResource).\n- Spalten: sku (Pflicht) · name (Pflicht bei Neuanlage) · description · type · price ·\n  taxRate · category · manufacturer · unit · active. Details {@see \\Octi\\Plugin\\Product\\Service\\ProductCsvImporter}."},"ProductManufacturer-product_manufacturer.read":{"type":"object","description":"Hersteller-Stamm (04-16 §3/§7, PIM), markenübergreifend.\n- Inkl. GPSR-Pflichtangaben (Firmenname, EU-Verantwortlicher, Anschrift, Kontakt).\n- Anzeigename/Beschreibung/SEO je Locale in `translations` (min. 1 Zeile bei Neuanlage, sonst 422).","properties":{"ulid":{"type":["string","null"]},"code":{"maxLength":50,"type":["string","null"]},"url":{"maxLength":255,"format":"uri","externalDocs":{"url":"https://schema.org/url"},"type":["string","null"]},"legalName":{"maxLength":200,"description":"Gesetzlicher Firmenname für die Herstellerangaben (GPSR).","type":["string","null"]},"responsiblePersonEu":{"maxLength":200,"description":"Verantwortliche Person in der EU (GPSR) — Pflicht für Nicht-EU-Hersteller.","type":["string","null"]},"address":{"type":["string","null"]},"email":{"format":"email","maxLength":180,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"phone":{"maxLength":50,"type":["string","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Logo (File-Modul); bigint-Referenz analog Modul-Konvention.","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, description, metaTitle, metaDescription}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["code"]},"ProductManufacturer-product_manufacturer.write":{"type":"object","description":"Hersteller-Stamm (04-16 §3/§7, PIM), markenübergreifend.\n- Inkl. GPSR-Pflichtangaben (Firmenname, EU-Verantwortlicher, Anschrift, Kontakt).\n- Anzeigename/Beschreibung/SEO je Locale in `translations` (min. 1 Zeile bei Neuanlage, sonst 422).","required":["code"],"properties":{"code":{"maxLength":50,"type":["string","null"]},"url":{"maxLength":255,"format":"uri","externalDocs":{"url":"https://schema.org/url"},"type":["string","null"]},"legalName":{"maxLength":200,"description":"Gesetzlicher Firmenname für die Herstellerangaben (GPSR).","type":["string","null"]},"responsiblePersonEu":{"maxLength":200,"description":"Verantwortliche Person in der EU (GPSR) — Pflicht für Nicht-EU-Hersteller.","type":["string","null"]},"address":{"type":["string","null"]},"email":{"format":"email","maxLength":180,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"phone":{"maxLength":50,"type":["string","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Logo (File-Modul); bigint-Referenz analog Modul-Konvention.","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, description, metaTitle, metaDescription}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductManufacturer-product_manufacturer.write.jsonMergePatch":{"type":"object","description":"Hersteller-Stamm (04-16 §3/§7, PIM), markenübergreifend.\n- Inkl. GPSR-Pflichtangaben (Firmenname, EU-Verantwortlicher, Anschrift, Kontakt).\n- Anzeigename/Beschreibung/SEO je Locale in `translations` (min. 1 Zeile bei Neuanlage, sonst 422).","properties":{"code":{"maxLength":50,"type":["string","null"]},"url":{"maxLength":255,"format":"uri","externalDocs":{"url":"https://schema.org/url"},"type":["string","null"]},"legalName":{"maxLength":200,"description":"Gesetzlicher Firmenname für die Herstellerangaben (GPSR).","type":["string","null"]},"responsiblePersonEu":{"maxLength":200,"description":"Verantwortliche Person in der EU (GPSR) — Pflicht für Nicht-EU-Hersteller.","type":["string","null"]},"address":{"type":["string","null"]},"email":{"format":"email","maxLength":180,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"phone":{"maxLength":50,"type":["string","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Logo (File-Modul); bigint-Referenz analog Modul-Konvention.","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, description, metaTitle, metaDescription}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductManufacturer.jsonld-product_manufacturer.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"code":{"maxLength":50,"type":["string","null"]},"url":{"maxLength":255,"format":"uri","externalDocs":{"url":"https://schema.org/url"},"type":["string","null"]},"legalName":{"maxLength":200,"description":"Gesetzlicher Firmenname für die Herstellerangaben (GPSR).","type":["string","null"]},"responsiblePersonEu":{"maxLength":200,"description":"Verantwortliche Person in der EU (GPSR) — Pflicht für Nicht-EU-Hersteller.","type":["string","null"]},"address":{"type":["string","null"]},"email":{"format":"email","maxLength":180,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"phone":{"maxLength":50,"type":["string","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Logo (File-Modul); bigint-Referenz analog Modul-Konvention.","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, description, metaTitle, metaDescription}.","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["code"]}],"description":"Hersteller-Stamm (04-16 §3/§7, PIM), markenübergreifend.\n- Inkl. GPSR-Pflichtangaben (Firmenname, EU-Verantwortlicher, Anschrift, Kontakt).\n- Anzeigename/Beschreibung/SEO je Locale in `translations` (min. 1 Zeile bei Neuanlage, sonst 422)."},"ProductPackaging-uom_packaging.read":{"type":"object","description":"Gebinde je Artikel (04-30 §3/§4).\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen (packaging.units.*).\n- Processor: genau 1 Default-Verkaufseinheit/Artikel; Zyklen-Check (UnitConversionService::assertAcyclic, 422).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, z. B. für parentPackagingId).","type":["integer","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"code":{"maxLength":30,"type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"contentQty":{"description":"Menge in der Basis-Einheit des Artikels (decimal-String, > 0).","type":["string","null"]},"parentPackagingId":{"minimum":0,"exclusiveMinimum":0,"description":"Mehrstufige Gebinde (Palette→Karton→Stück); Zyklen-Guard im Processor (422).","type":["integer","null"]},"role":{"enum":["base","sales","stock","purchase","shipping"],"description":"base|sales|stock|purchase|shipping.","type":["string","null"]},"isDefaultSales":{"description":"Default-Verkaufseinheit — genau eine je Artikel (Setzen setzt andere zurück).","type":["boolean","null"]},"minSalesQty":{"description":"Mindestverkaufsmenge in dieser Gebinde-Einheit (decimal-String).","type":["string","null"]},"ean":{"maxLength":20,"description":"Gebinde-GTIN/EAN.","type":["string","null"]},"weightGrams":{"minimum":0,"description":"Verpackungsgewicht in Gramm.","type":["integer","null"]},"lengthMm":{"minimum":0,"type":["integer","null"]},"widthMm":{"minimum":0,"type":["integer","null"]},"heightMm":{"minimum":0,"type":["integer","null"]},"depositProductId":{"minimum":0,"exclusiveMinimum":0,"description":"Pfandartikel (Produkt-ID).","type":["integer","null"]},"depositAmount":{"minimum":0,"description":"Pfandbetrag je Gebinde in Cent.","type":["integer","null"]},"priceMode":{"enum":["per_base","per_package"],"description":"per_base|per_package.","type":["string","null"]}}},"ProductPackaging-uom_packaging.write":{"type":"object","description":"Gebinde je Artikel (04-30 §3/§4).\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen (packaging.units.*).\n- Processor: genau 1 Default-Verkaufseinheit/Artikel; Zyklen-Check (UnitConversionService::assertAcyclic, 422).","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"code":{"maxLength":30,"type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"contentQty":{"description":"Menge in der Basis-Einheit des Artikels (decimal-String, > 0).","type":["string","null"]},"parentPackagingId":{"minimum":0,"exclusiveMinimum":0,"description":"Mehrstufige Gebinde (Palette→Karton→Stück); Zyklen-Guard im Processor (422).","type":["integer","null"]},"role":{"enum":["base","sales","stock","purchase","shipping"],"description":"base|sales|stock|purchase|shipping.","type":["string","null"]},"isDefaultSales":{"description":"Default-Verkaufseinheit — genau eine je Artikel (Setzen setzt andere zurück).","type":["boolean","null"]},"minSalesQty":{"description":"Mindestverkaufsmenge in dieser Gebinde-Einheit (decimal-String).","type":["string","null"]},"ean":{"maxLength":20,"description":"Gebinde-GTIN/EAN.","type":["string","null"]},"weightGrams":{"minimum":0,"description":"Verpackungsgewicht in Gramm.","type":["integer","null"]},"lengthMm":{"minimum":0,"type":["integer","null"]},"widthMm":{"minimum":0,"type":["integer","null"]},"heightMm":{"minimum":0,"type":["integer","null"]},"depositProductId":{"minimum":0,"exclusiveMinimum":0,"description":"Pfandartikel (Produkt-ID).","type":["integer","null"]},"depositAmount":{"minimum":0,"description":"Pfandbetrag je Gebinde in Cent.","type":["integer","null"]},"priceMode":{"enum":["per_base","per_package"],"description":"per_base|per_package.","type":["string","null"]}}},"ProductPackaging-uom_packaging.write.jsonMergePatch":{"type":"object","description":"Gebinde je Artikel (04-30 §3/§4).\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen (packaging.units.*).\n- Processor: genau 1 Default-Verkaufseinheit/Artikel; Zyklen-Check (UnitConversionService::assertAcyclic, 422).","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"code":{"maxLength":30,"type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"contentQty":{"description":"Menge in der Basis-Einheit des Artikels (decimal-String, > 0).","type":["string","null"]},"parentPackagingId":{"minimum":0,"exclusiveMinimum":0,"description":"Mehrstufige Gebinde (Palette→Karton→Stück); Zyklen-Guard im Processor (422).","type":["integer","null"]},"role":{"enum":["base","sales","stock","purchase","shipping"],"description":"base|sales|stock|purchase|shipping.","type":["string","null"]},"isDefaultSales":{"description":"Default-Verkaufseinheit — genau eine je Artikel (Setzen setzt andere zurück).","type":["boolean","null"]},"minSalesQty":{"description":"Mindestverkaufsmenge in dieser Gebinde-Einheit (decimal-String).","type":["string","null"]},"ean":{"maxLength":20,"description":"Gebinde-GTIN/EAN.","type":["string","null"]},"weightGrams":{"minimum":0,"description":"Verpackungsgewicht in Gramm.","type":["integer","null"]},"lengthMm":{"minimum":0,"type":["integer","null"]},"widthMm":{"minimum":0,"type":["integer","null"]},"heightMm":{"minimum":0,"type":["integer","null"]},"depositProductId":{"minimum":0,"exclusiveMinimum":0,"description":"Pfandartikel (Produkt-ID).","type":["integer","null"]},"depositAmount":{"minimum":0,"description":"Pfandbetrag je Gebinde in Cent.","type":["integer","null"]},"priceMode":{"enum":["per_base","per_package"],"description":"per_base|per_package.","type":["string","null"]}}},"ProductPackaging.jsonld-uom_packaging.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, z. B. für parentPackagingId).","type":["integer","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"code":{"maxLength":30,"type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"contentQty":{"description":"Menge in der Basis-Einheit des Artikels (decimal-String, > 0).","type":["string","null"]},"parentPackagingId":{"minimum":0,"exclusiveMinimum":0,"description":"Mehrstufige Gebinde (Palette→Karton→Stück); Zyklen-Guard im Processor (422).","type":["integer","null"]},"role":{"enum":["base","sales","stock","purchase","shipping"],"description":"base|sales|stock|purchase|shipping.","type":["string","null"]},"isDefaultSales":{"description":"Default-Verkaufseinheit — genau eine je Artikel (Setzen setzt andere zurück).","type":["boolean","null"]},"minSalesQty":{"description":"Mindestverkaufsmenge in dieser Gebinde-Einheit (decimal-String).","type":["string","null"]},"ean":{"maxLength":20,"description":"Gebinde-GTIN/EAN.","type":["string","null"]},"weightGrams":{"minimum":0,"description":"Verpackungsgewicht in Gramm.","type":["integer","null"]},"lengthMm":{"minimum":0,"type":["integer","null"]},"widthMm":{"minimum":0,"type":["integer","null"]},"heightMm":{"minimum":0,"type":["integer","null"]},"depositProductId":{"minimum":0,"exclusiveMinimum":0,"description":"Pfandartikel (Produkt-ID).","type":["integer","null"]},"depositAmount":{"minimum":0,"description":"Pfandbetrag je Gebinde in Cent.","type":["integer","null"]},"priceMode":{"enum":["per_base","per_package"],"description":"per_base|per_package.","type":["string","null"]}}}],"description":"Gebinde je Artikel (04-30 §3/§4).\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen (packaging.units.*).\n- Processor: genau 1 Default-Verkaufseinheit/Artikel; Zyklen-Check (UnitConversionService::assertAcyclic, 422)."},"ProductPropertyGroup-product_property_group.read":{"type":"object","description":"Eigenschafts-/Attribut-Gruppe inkl. eingebetteter Optionen (04-16 §3/§7, z. B. Farbe → Rot/Blau).\n- `variantForming`: Gruppe als Varianten-Achse; `filterable`: Facetten-Sichtbarkeit.\n- `options`-Sync additiv (neu anlegen, per ulid aktualisieren — nie löschen; ausblenden via `active=false`).\n- Texte je Locale in `translations` (Gruppe) bzw. `options[].translations` (Option).","properties":{"ulid":{"type":["string","null"]},"code":{"maxLength":50,"type":["string","null"]},"displayType":{"enum":["select","color","image","text"],"description":"Darstellung der Optionen: select | color | image | text.","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"variantForming":{"description":"Als Varianten-Achse nutzbar (Container-Artikel, VariantSet).","type":["boolean","null"]},"filterable":{"description":"Sichtbar als Katalog-/Shop-Filterfacette.","type":["boolean","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Optionales Gruppenbild (File-Modul); bigint-Referenz analog Modul-Konvention.","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, longDescription}. Upsert (nie löschend);\nNeuanlage: min. 1 Zeile mit `name` Pflicht (422).","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"options":{"description":"list<{ulid?, code, sortOrder, active, mediaFileId, translations: locale => {value,\nshortDescription, longDescription}}>. Ohne ulid = neu, mit ulid = Update; nicht\nmitgesendete Optionen bleiben unangetastet (Ausblenden via active=false).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["code"]},"ProductPropertyGroup-product_property_group.write":{"type":"object","description":"Eigenschafts-/Attribut-Gruppe inkl. eingebetteter Optionen (04-16 §3/§7, z. B. Farbe → Rot/Blau).\n- `variantForming`: Gruppe als Varianten-Achse; `filterable`: Facetten-Sichtbarkeit.\n- `options`-Sync additiv (neu anlegen, per ulid aktualisieren — nie löschen; ausblenden via `active=false`).\n- Texte je Locale in `translations` (Gruppe) bzw. `options[].translations` (Option).","required":["code"],"properties":{"code":{"maxLength":50,"type":["string","null"]},"displayType":{"enum":["select","color","image","text"],"description":"Darstellung der Optionen: select | color | image | text.","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"variantForming":{"description":"Als Varianten-Achse nutzbar (Container-Artikel, VariantSet).","type":["boolean","null"]},"filterable":{"description":"Sichtbar als Katalog-/Shop-Filterfacette.","type":["boolean","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Optionales Gruppenbild (File-Modul); bigint-Referenz analog Modul-Konvention.","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, longDescription}. Upsert (nie löschend);\nNeuanlage: min. 1 Zeile mit `name` Pflicht (422).","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"options":{"description":"list<{ulid?, code, sortOrder, active, mediaFileId, translations: locale => {value,\nshortDescription, longDescription}}>. Ohne ulid = neu, mit ulid = Update; nicht\nmitgesendete Optionen bleiben unangetastet (Ausblenden via active=false).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductPropertyGroup-product_property_group.write.jsonMergePatch":{"type":"object","description":"Eigenschafts-/Attribut-Gruppe inkl. eingebetteter Optionen (04-16 §3/§7, z. B. Farbe → Rot/Blau).\n- `variantForming`: Gruppe als Varianten-Achse; `filterable`: Facetten-Sichtbarkeit.\n- `options`-Sync additiv (neu anlegen, per ulid aktualisieren — nie löschen; ausblenden via `active=false`).\n- Texte je Locale in `translations` (Gruppe) bzw. `options[].translations` (Option).","properties":{"code":{"maxLength":50,"type":["string","null"]},"displayType":{"enum":["select","color","image","text"],"description":"Darstellung der Optionen: select | color | image | text.","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"variantForming":{"description":"Als Varianten-Achse nutzbar (Container-Artikel, VariantSet).","type":["boolean","null"]},"filterable":{"description":"Sichtbar als Katalog-/Shop-Filterfacette.","type":["boolean","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Optionales Gruppenbild (File-Modul); bigint-Referenz analog Modul-Konvention.","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, longDescription}. Upsert (nie löschend);\nNeuanlage: min. 1 Zeile mit `name` Pflicht (422).","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"options":{"description":"list<{ulid?, code, sortOrder, active, mediaFileId, translations: locale => {value,\nshortDescription, longDescription}}>. Ohne ulid = neu, mit ulid = Update; nicht\nmitgesendete Optionen bleiben unangetastet (Ausblenden via active=false).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductPropertyGroup.jsonld-product_property_group.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"code":{"maxLength":50,"type":["string","null"]},"displayType":{"enum":["select","color","image","text"],"description":"Darstellung der Optionen: select | color | image | text.","type":["string","null"]},"sortOrder":{"type":["integer","null"]},"variantForming":{"description":"Als Varianten-Achse nutzbar (Container-Artikel, VariantSet).","type":["boolean","null"]},"filterable":{"description":"Sichtbar als Katalog-/Shop-Filterfacette.","type":["boolean","null"]},"active":{"type":["boolean","null"]},"mediaFileId":{"description":"Optionales Gruppenbild (File-Modul); bigint-Referenz analog Modul-Konvention.","type":["integer","null"]},"translations":{"description":"Locale => {name, shortDescription, longDescription}. Upsert (nie löschend);\nNeuanlage: min. 1 Zeile mit `name` Pflicht (422).","type":["object","null"],"additionalProperties":{"type":"object","additionalProperties":{"type":["string","null"]}}},"options":{"description":"list<{ulid?, code, sortOrder, active, mediaFileId, translations: locale => {value,\nshortDescription, longDescription}}>. Ohne ulid = neu, mit ulid = Update; nicht\nmitgesendete Optionen bleiben unangetastet (Ausblenden via active=false).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["code"]}],"description":"Eigenschafts-/Attribut-Gruppe inkl. eingebetteter Optionen (04-16 §3/§7, z. B. Farbe → Rot/Blau).\n- `variantForming`: Gruppe als Varianten-Achse; `filterable`: Facetten-Sichtbarkeit.\n- `options`-Sync additiv (neu anlegen, per ulid aktualisieren — nie löschen; ausblenden via `active=false`).\n- Texte je Locale in `translations` (Gruppe) bzw. `options[].translations` (Option)."},"ProductStock-product_stock.adjust":{"type":"object","description":"Bestandssicht je lagergeführtem Artikel (04-16 §6/§7, ein Lager).\n- Lesen: products.stock.view; Korrektur/Inventur (`…/adjust`, append-only Journal via\n  StockService) + Meldebestands-Pflege (PATCH): products.stock.manage.\n- Identifier: Artikel-ULID (`productUlid`), 1:1 zum Artikel.","properties":{"delta":{"description":"Vorzeichenbehaftete Korrekturmenge — nur POST …/adjust (Pflicht, 422 wenn fehlend).","type":["integer","null"]},"note":{"description":"Optionale Buchungsnotiz — nur POST …/adjust.","type":["string","null"]}}},"ProductStock-product_stock.read":{"type":"object","description":"Bestandssicht je lagergeführtem Artikel (04-16 §6/§7, ein Lager).\n- Lesen: products.stock.view; Korrektur/Inventur (`…/adjust`, append-only Journal via\n  StockService) + Meldebestands-Pflege (PATCH): products.stock.manage.\n- Identifier: Artikel-ULID (`productUlid`), 1:1 zum Artikel.","properties":{"productUlid":{"type":["string","null"]},"sku":{"type":["string","null"]},"name":{"type":["string","null"]},"onHand":{"description":"Physischer Bestand.","type":["integer","null"]},"reserved":{"description":"Durch Aufträge reservierter Bestand.","type":["integer","null"]},"available":{"description":"Verfügbar = onHand − reserved.","type":["integer","null"]},"reorderPoint":{"description":"Meldebestand — unterschreitet available diesen Wert, wird Nachbestellung fällig.","type":["integer","null"]},"reorderQty":{"description":"Vorgeschlagene Nachbestellmenge.","type":["integer","null"]},"allowNegative":{"description":"Erlaubt negative Verfügbarkeit (Überbuchung); sonst 409 beim Unterschreiten von 0.","type":["boolean","null"]},"avgCostAmount":{"description":"Gleitender Durchschnitts-Einstandspreis in Cent je Einheit (Doc 25 AP 2.4).","type":["integer","null"]},"stockValueAmount":{"description":"Bestandswert in Cent (`avgCostAmount × onHand`); `null` bei unbekanntem Einstandspreis.","type":["integer","null"]},"valuedAt":{"description":"Wann der Durchschnitt zuletzt fortgeschrieben wurde.","type":["string","null"]},"movements":{"description":"Letzte 50 Journal-Zeilen (nur Einzel-GET): {delta, type, sourceRef, note, bookedAt}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}},"ProductStock-product_stock.write.jsonMergePatch":{"type":"object","description":"Bestandssicht je lagergeführtem Artikel (04-16 §6/§7, ein Lager).\n- Lesen: products.stock.view; Korrektur/Inventur (`…/adjust`, append-only Journal via\n  StockService) + Meldebestands-Pflege (PATCH): products.stock.manage.\n- Identifier: Artikel-ULID (`productUlid`), 1:1 zum Artikel.","properties":{"reorderPoint":{"description":"Meldebestand — unterschreitet available diesen Wert, wird Nachbestellung fällig.","type":["integer","null"]},"reorderQty":{"description":"Vorgeschlagene Nachbestellmenge.","type":["integer","null"]},"allowNegative":{"description":"Erlaubt negative Verfügbarkeit (Überbuchung); sonst 409 beim Unterschreiten von 0.","type":["boolean","null"]}}},"ProductStock.jsonld-product_stock.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"productUlid":{"type":["string","null"]},"sku":{"type":["string","null"]},"name":{"type":["string","null"]},"onHand":{"description":"Physischer Bestand.","type":["integer","null"]},"reserved":{"description":"Durch Aufträge reservierter Bestand.","type":["integer","null"]},"available":{"description":"Verfügbar = onHand − reserved.","type":["integer","null"]},"reorderPoint":{"description":"Meldebestand — unterschreitet available diesen Wert, wird Nachbestellung fällig.","type":["integer","null"]},"reorderQty":{"description":"Vorgeschlagene Nachbestellmenge.","type":["integer","null"]},"allowNegative":{"description":"Erlaubt negative Verfügbarkeit (Überbuchung); sonst 409 beim Unterschreiten von 0.","type":["boolean","null"]},"avgCostAmount":{"description":"Gleitender Durchschnitts-Einstandspreis in Cent je Einheit (Doc 25 AP 2.4).","type":["integer","null"]},"stockValueAmount":{"description":"Bestandswert in Cent (`avgCostAmount × onHand`); `null` bei unbekanntem Einstandspreis.","type":["integer","null"]},"valuedAt":{"description":"Wann der Durchschnitt zuletzt fortgeschrieben wurde.","type":["string","null"]},"movements":{"description":"Letzte 50 Journal-Zeilen (nur Einzel-GET): {delta, type, sourceRef, note, bookedAt}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}}],"description":"Bestandssicht je lagergeführtem Artikel (04-16 §6/§7, ein Lager).\n- Lesen: products.stock.view; Korrektur/Inventur (`…/adjust`, append-only Journal via\n  StockService) + Meldebestands-Pflege (PATCH): products.stock.manage.\n- Identifier: Artikel-ULID (`productUlid`), 1:1 zum Artikel."},"ProductStockValue-stock_value.read":{"type":"object","description":"Bestandswert-Report (Doc 25 AP 2.4, G25).\n\n**Die wichtigste Zahl hier ist `unvaluedProducts`.** Ein Bestandswert, der die Artikel ohne\nbekannten Einstandspreis stillschweigend als 0 mitzählt, sieht vollständig aus und ist es\nnicht — und das fällt genau dann auf, wenn er gegen die Buchhaltung gestellt wird. Deshalb\nweist dieser Report die Lücke aus, statt sie zu glätten.","properties":{"ulid":{"description":"Synthetisch (Report ohne eigene Entität).","default":"stock-value","type":"string"},"totalValueAmount":{"description":"Summe über alle BEWERTETEN Artikel, in Cent.","default":0,"type":"integer"},"valuedProducts":{"description":"Artikel mit Bestand und bekanntem Einstandspreis.","default":0,"type":"integer"},"unvaluedProducts":{"description":"Artikel MIT Bestand, aber OHNE bekannten Einstandspreis — die Lücke im Wert.","default":0,"type":"integer"},"unvaluedOnHand":{"description":"Stückzahl in den unbewerteten Artikeln — damit die Lücke einzuordnen ist.","default":0,"type":"integer"},"lines":{"description":"Einzelzeilen, absteigend nach Wert.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}},"ProductStockValue.jsonld-stock_value.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetisch (Report ohne eigene Entität).","default":"stock-value","type":"string"},"totalValueAmount":{"description":"Summe über alle BEWERTETEN Artikel, in Cent.","default":0,"type":"integer"},"valuedProducts":{"description":"Artikel mit Bestand und bekanntem Einstandspreis.","default":0,"type":"integer"},"unvaluedProducts":{"description":"Artikel MIT Bestand, aber OHNE bekannten Einstandspreis — die Lücke im Wert.","default":0,"type":"integer"},"unvaluedOnHand":{"description":"Stückzahl in den unbewerteten Artikeln — damit die Lücke einzuordnen ist.","default":0,"type":"integer"},"lines":{"description":"Einzelzeilen, absteigend nach Wert.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}}],"description":"Bestandswert-Report (Doc 25 AP 2.4, G25).\n\n**Die wichtigste Zahl hier ist `unvaluedProducts`.** Ein Bestandswert, der die Artikel ohne\nbekannten Einstandspreis stillschweigend als 0 mitzählt, sieht vollständig aus und ist es\nnicht — und das fällt genau dann auf, wenn er gegen die Buchhaltung gestellt wird. Deshalb\nweist dieser Report die Lücke aus, statt sie zu glätten."},"ProductVariant-product_variant.read":{"type":"object","description":"Produktvariante (04-07 §3/§4.1): Edition/Seat-Stufe/Plan.\nFilterbar nach `productId`; optionaler Preis-Override in Cent; freie attributes.","properties":{"ulid":{"type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"priceOverrideAmount":{"minimum":0,"description":"Abweichender Stückpreis in Cent; null = Product.defaultPrice.","type":["integer","null"]},"attributes":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["name"]},"ProductVariant-product_variant.write":{"type":"object","description":"Produktvariante (04-07 §3/§4.1): Edition/Seat-Stufe/Plan.\nFilterbar nach `productId`; optionaler Preis-Override in Cent; freie attributes.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"priceOverrideAmount":{"minimum":0,"description":"Abweichender Stückpreis in Cent; null = Product.defaultPrice.","type":["integer","null"]},"attributes":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["name"]},"ProductVariant-product_variant.write.jsonMergePatch":{"type":"object","description":"Produktvariante (04-07 §3/§4.1): Edition/Seat-Stufe/Plan.\nFilterbar nach `productId`; optionaler Preis-Override in Cent; freie attributes.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"priceOverrideAmount":{"minimum":0,"description":"Abweichender Stückpreis in Cent; null = Product.defaultPrice.","type":["integer","null"]},"attributes":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"ProductVariant.jsonld-product_variant.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"name":{"type":["string","null"]},"sku":{"type":["string","null"]},"priceOverrideAmount":{"minimum":0,"description":"Abweichender Stückpreis in Cent; null = Product.defaultPrice.","type":["integer","null"]},"attributes":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["name"]}],"description":"Produktvariante (04-07 §3/§4.1): Edition/Seat-Stufe/Plan.\nFilterbar nach `productId`; optionaler Preis-Override in Cent; freie attributes."},"ProductVariantGeneration":{"type":"object","description":"Varianten-Generierung eines Container-Artikels (04-16 §6/§7).\n- POST spannt aus VariantSet-Achsen das kartesische Produkt der aktiven Optionen auf,\n  legt fehlende Varianten idempotent an ({@see \\Octi\\Plugin\\Product\\Service\\VariantGenerationService}).\n- Kein Request-Body nötig; Antwort: {created, variants: [{ulid, sku, name}]}.","properties":{"ulid":{"description":"ULID des Container-Artikels.","type":["string","null"]},"created":{"description":"Anzahl der in diesem Lauf NEU angelegten Varianten (bereits vorhandene zählen nicht).","type":["integer","null"]},"variants":{"description":"Die neu angelegten Varianten-Artikel.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductVariantGeneration-product_variant_generation.read":{"type":"object","description":"Varianten-Generierung eines Container-Artikels (04-16 §6/§7).\n- POST spannt aus VariantSet-Achsen das kartesische Produkt der aktiven Optionen auf,\n  legt fehlende Varianten idempotent an ({@see \\Octi\\Plugin\\Product\\Service\\VariantGenerationService}).\n- Kein Request-Body nötig; Antwort: {created, variants: [{ulid, sku, name}]}.","properties":{"ulid":{"description":"ULID des Container-Artikels.","type":["string","null"]},"created":{"description":"Anzahl der in diesem Lauf NEU angelegten Varianten (bereits vorhandene zählen nicht).","type":["integer","null"]},"variants":{"description":"Die neu angelegten Varianten-Artikel.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductVariantGeneration.jsonld-product_variant_generation.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"ULID des Container-Artikels.","type":["string","null"]},"created":{"description":"Anzahl der in diesem Lauf NEU angelegten Varianten (bereits vorhandene zählen nicht).","type":["integer","null"]},"variants":{"description":"Die neu angelegten Varianten-Artikel.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Varianten-Generierung eines Container-Artikels (04-16 §6/§7).\n- POST spannt aus VariantSet-Achsen das kartesische Produkt der aktiven Optionen auf,\n  legt fehlende Varianten idempotent an ({@see \\Octi\\Plugin\\Product\\Service\\VariantGenerationService}).\n- Kein Request-Body nötig; Antwort: {created, variants: [{ulid, sku, name}]}."},"ProductVersion-product_version.read":{"type":"object","description":"Versionsstand eines (Lizenz-)Produkts (04-07 §3/§4.1): SemVer mit Release-/EOL-\nDatum. Filterbar nach `productId`.","properties":{"ulid":{"type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"version":{"type":["string","null"]},"releasedAt":{"type":["string","null"]},"eolAt":{"type":["string","null"]},"releaseNotes":{"type":["string","null"]},"isCurrent":{"type":["boolean","null"]}},"required":["version"]},"ProductVersion-product_version.write":{"type":"object","description":"Versionsstand eines (Lizenz-)Produkts (04-07 §3/§4.1): SemVer mit Release-/EOL-\nDatum. Filterbar nach `productId`.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"version":{"type":["string","null"]},"releasedAt":{"type":["string","null"]},"eolAt":{"type":["string","null"]},"releaseNotes":{"type":["string","null"]},"isCurrent":{"type":["boolean","null"]}},"required":["version"]},"ProductVersion-product_version.write.jsonMergePatch":{"type":"object","description":"Versionsstand eines (Lizenz-)Produkts (04-07 §3/§4.1): SemVer mit Release-/EOL-\nDatum. Filterbar nach `productId`.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"version":{"type":["string","null"]},"releasedAt":{"type":["string","null"]},"eolAt":{"type":["string","null"]},"releaseNotes":{"type":["string","null"]},"isCurrent":{"type":["boolean","null"]}}},"ProductVersion.jsonld-product_version.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"version":{"type":["string","null"]},"releasedAt":{"type":["string","null"]},"eolAt":{"type":["string","null"]},"releaseNotes":{"type":["string","null"]},"isCurrent":{"type":["boolean","null"]}},"required":["version"]}],"description":"Versionsstand eines (Lizenz-)Produkts (04-07 §3/§4.1): SemVer mit Release-/EOL-\nDatum. Filterbar nach `productId`."},"ProductionOrder-production_order.read":{"type":"object","description":"Fertigungsaufträge (Doc 25 Stufe 12).\n\nEs gibt bewusst kein PATCH: nach dem Anlegen ist jeder Schritt eine Buchung (freigeben,\nentnehmen, fertigmelden, abbrechen) — ein Formular-Update würde Mengen ändern, zu denen bereits\nBestand bewegt wurde.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"type":["string","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"productSku":{"type":["string","null"]},"status":{"description":"planned|released|in_progress|completed|cancelled (read-only).","type":["string","null"]},"qtyPlanned":{"type":["integer","null"]},"qtyProduced":{"type":["integer","null"]},"qtyScrapped":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"bomId":{"type":["integer","null"]},"bomVersion":{"type":["integer","null"]},"outputBatchRef":{"type":["string","null"]},"outputExpiresAt":{"type":["string","null"]},"plannedStartAt":{"type":["string","null"]},"plannedEndAt":{"type":["string","null"]},"releasedAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"plannedMaterialCostAmount":{"description":"Soll-Materialkosten in Cent (Summe der BEWERTETEN Zeilen).","type":["integer","null"]},"actualMaterialCostAmount":{"description":"Ist-Materialkosten in Cent (fortgeschrieben je Entnahme).","type":["integer","null"]},"unvaluedMaterialCount":{"description":"Zahl der Materialzeilen ohne Bewertung. Solange sie > 0 ist, sind beide Summen eine\nUntergrenze — dieselbe Ehrlichkeitsregel wie im Bestandswert-Report (AP 2.4).","type":["integer","null"]},"costVarianceAmount":{"description":"Ist − Soll in Cent; null, solange eine der beiden Summen fehlt.","type":["integer","null"]},"openMaterialQty":{"description":"Offene Materialmenge über alle Zeilen — die Zahl, die am Arbeitsplatz zählt.","type":["integer","null"]},"materials":{"description":"Materialzeilen (nur im Detail): {ulid, position, productId, productName, productSku,\nqtyNet, qtyRequired, qtyReserved, qtyConsumed, qtyOpen, scrapPercent,\nplannedUnitCostAmount, actualCostAmount, availableQty}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProductionOrder-production_order.write":{"type":"object","description":"Fertigungsaufträge (Doc 25 Stufe 12).\n\nEs gibt bewusst kein PATCH: nach dem Anlegen ist jeder Schritt eine Buchung (freigeben,\nentnehmen, fertigmelden, abbrechen) — ein Formular-Update würde Mengen ändern, zu denen bereits\nBestand bewegt wurde.","properties":{"productId":{"type":["integer","null"]},"qtyPlanned":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"plannedStartAt":{"type":["string","null"]},"plannedEndAt":{"type":["string","null"]},"note":{"type":["string","null"]}}},"ProductionOrder.jsonld-production_order.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"type":["string","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"productSku":{"type":["string","null"]},"status":{"description":"planned|released|in_progress|completed|cancelled (read-only).","type":["string","null"]},"qtyPlanned":{"type":["integer","null"]},"qtyProduced":{"type":["integer","null"]},"qtyScrapped":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"bomId":{"type":["integer","null"]},"bomVersion":{"type":["integer","null"]},"outputBatchRef":{"type":["string","null"]},"outputExpiresAt":{"type":["string","null"]},"plannedStartAt":{"type":["string","null"]},"plannedEndAt":{"type":["string","null"]},"releasedAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"note":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"plannedMaterialCostAmount":{"description":"Soll-Materialkosten in Cent (Summe der BEWERTETEN Zeilen).","type":["integer","null"]},"actualMaterialCostAmount":{"description":"Ist-Materialkosten in Cent (fortgeschrieben je Entnahme).","type":["integer","null"]},"unvaluedMaterialCount":{"description":"Zahl der Materialzeilen ohne Bewertung. Solange sie > 0 ist, sind beide Summen eine\nUntergrenze — dieselbe Ehrlichkeitsregel wie im Bestandswert-Report (AP 2.4).","type":["integer","null"]},"costVarianceAmount":{"description":"Ist − Soll in Cent; null, solange eine der beiden Summen fehlt.","type":["integer","null"]},"openMaterialQty":{"description":"Offene Materialmenge über alle Zeilen — die Zahl, die am Arbeitsplatz zählt.","type":["integer","null"]},"materials":{"description":"Materialzeilen (nur im Detail): {ulid, position, productId, productName, productSku,\nqtyNet, qtyRequired, qtyReserved, qtyConsumed, qtyOpen, scrapPercent,\nplannedUnitCostAmount, actualCostAmount, availableQty}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Fertigungsaufträge (Doc 25 Stufe 12).\n\nEs gibt bewusst kein PATCH: nach dem Anlegen ist jeder Schritt eine Buchung (freigeben,\nentnehmen, fertigmelden, abbrechen) — ein Formular-Update würde Mengen ändern, zu denen bereits\nBestand bewegt wurde."},"Project-project.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK, zusätzlich zur ULID-IRI — für Relations-Filter (projectId) + EntityPicker.","type":["integer","null"]},"code":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"type":{"maxLength":50,"description":"Typ-Key (ProjectType-Katalog, settings-pflegbar). Leer = Default-Typ.","type":["string","null"]},"visibility":{"enum":["normal","private"],"description":"Sichtbarkeit (Doc 27 2.3): normal|private — privat = nur Ersteller + Mitglieder.","default":"normal","type":"string"},"externalAssignedOnly":{"description":"Projekt-Option „Externe sehen nur ZUGEWIESENE Aufgaben\" (Doc 27 Stufe 7, E-1).","default":false,"type":"boolean"},"taskMailToken":{"maxLength":40,"description":"E-Mail-zu-Aufgabe (Doc 27 1.4/G10): Lokalteil der Projekt-Aufgabenadresse. `null` = Eingang\nfür dieses Projekt aus. Beim Schreiben genügt ein beliebiger Wunsch-Token; er wird\nnormalisiert (Kleinbuchstaben, nur a–z/0–9/Bindestrich) und muss systemweit eindeutig sein.","type":["string","null"]},"taskMailListId":{"description":"Ziel-Aufgabenliste des Mail-Eingangs (WorkItemList-ID); null = ohne Liste.","type":["integer","null"]},"taskMailAddress":{"description":"Vollständige Eingangsadresse (read-only) — null, solange Token oder Domain fehlen.","type":["string","null"]},"statusKey":{"maxLength":50,"description":"Status-Key (ProjectStatus). Leer = Default-Status.","type":["string","null"]},"statusLabel":{"type":["string","null"]},"statusCategory":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"customerUlid":{"description":"Kundenbezug per ULID (system-weite Identifier-Konvention).","type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"quoteId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"budgetHours":{"minimum":0,"type":["integer","null"]},"budgetAmount":{"minimum":0,"description":"Soll-Betrag in Cent.","type":["integer","null"]},"billingMode":{"enum":["milestone","time","quota"],"type":["string","null"]},"defaultBillable":{"type":["boolean","null"]},"startsAt":{"type":["string","null"]},"dueAt":{"type":["string","null"]},"closedAt":{"type":["string","null"],"format":"date-time"},"health":{"description":"Budget-Ampel: green/yellow/red.","default":"green","type":"string"},"openRiskCount":{"description":"Anzahl offener Risiken/Issues. Bewusst getrennt von der Budget-Ampel {@see self::$health} — eigenes Badge.","default":0,"type":"integer"},"maxRiskSeverity":{"description":"Höchste Severity unter den offenen Risiken: low|medium|high|critical (null = keine offenen).","type":["string","null"]},"notes":{"type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"members":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"milestones":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"spentHours":{"description":"Profitabilität/Budget-Wächter (nur Item-Sicht, rechteabhängig).","type":["number","null"]},"spentCostAmount":{"type":["integer","null"]},"revenueAmount":{"type":["integer","null"]},"marginAmount":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"Project-project.write":{"type":"object","required":["name"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"type":{"maxLength":50,"description":"Typ-Key (ProjectType-Katalog, settings-pflegbar). Leer = Default-Typ.","type":["string","null"]},"visibility":{"enum":["normal","private"],"description":"Sichtbarkeit (Doc 27 2.3): normal|private — privat = nur Ersteller + Mitglieder.","default":"normal","type":"string"},"externalAssignedOnly":{"description":"Projekt-Option „Externe sehen nur ZUGEWIESENE Aufgaben\" (Doc 27 Stufe 7, E-1).","default":false,"type":"boolean"},"taskMailToken":{"maxLength":40,"description":"E-Mail-zu-Aufgabe (Doc 27 1.4/G10): Lokalteil der Projekt-Aufgabenadresse. `null` = Eingang\nfür dieses Projekt aus. Beim Schreiben genügt ein beliebiger Wunsch-Token; er wird\nnormalisiert (Kleinbuchstaben, nur a–z/0–9/Bindestrich) und muss systemweit eindeutig sein.","type":["string","null"]},"taskMailListId":{"description":"Ziel-Aufgabenliste des Mail-Eingangs (WorkItemList-ID); null = ohne Liste.","type":["integer","null"]},"statusKey":{"maxLength":50,"description":"Status-Key (ProjectStatus). Leer = Default-Status.","type":["string","null"]},"customerUlid":{"description":"Kundenbezug per ULID (system-weite Identifier-Konvention).","type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"quoteId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"quoteUlid":{"description":"Write-only: Angebot (ULID) für die create-from-quote-Aktion.","type":["string","null"]},"include":{"description":"Write-only: was beim Duplizieren bzw. beim Erzeugen einer Vorlage mitkommt.","type":"object","additionalProperties":{"type":"boolean"}},"targetName":{"maxLength":255,"description":"Write-only: Name des Duplikats bzw. der Vorlage; leer ⇒ „<Original> (Kopie)\".","type":["string","null"]},"templateUlid":{"description":"Write-only: Vorlage (ULID) für die create-from-template-Aktion.","type":["string","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"budgetHours":{"minimum":0,"type":["integer","null"]},"budgetAmount":{"minimum":0,"description":"Soll-Betrag in Cent.","type":["integer","null"]},"billingMode":{"enum":["milestone","time","quota"],"type":["string","null"]},"defaultBillable":{"type":["boolean","null"]},"startsAt":{"type":["string","null"]},"dueAt":{"type":["string","null"]},"notes":{"type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}}}},"Project-project.write.jsonMergePatch":{"type":"object","properties":{"name":{"maxLength":255,"default":"","type":"string"},"type":{"maxLength":50,"description":"Typ-Key (ProjectType-Katalog, settings-pflegbar). Leer = Default-Typ.","type":["string","null"]},"visibility":{"enum":["normal","private"],"description":"Sichtbarkeit (Doc 27 2.3): normal|private — privat = nur Ersteller + Mitglieder.","default":"normal","type":"string"},"externalAssignedOnly":{"description":"Projekt-Option „Externe sehen nur ZUGEWIESENE Aufgaben\" (Doc 27 Stufe 7, E-1).","default":false,"type":"boolean"},"taskMailToken":{"maxLength":40,"description":"E-Mail-zu-Aufgabe (Doc 27 1.4/G10): Lokalteil der Projekt-Aufgabenadresse. `null` = Eingang\nfür dieses Projekt aus. Beim Schreiben genügt ein beliebiger Wunsch-Token; er wird\nnormalisiert (Kleinbuchstaben, nur a–z/0–9/Bindestrich) und muss systemweit eindeutig sein.","type":["string","null"]},"taskMailListId":{"description":"Ziel-Aufgabenliste des Mail-Eingangs (WorkItemList-ID); null = ohne Liste.","type":["integer","null"]},"statusKey":{"maxLength":50,"description":"Status-Key (ProjectStatus). Leer = Default-Status.","type":["string","null"]},"customerUlid":{"description":"Kundenbezug per ULID (system-weite Identifier-Konvention).","type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"quoteId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"quoteUlid":{"description":"Write-only: Angebot (ULID) für die create-from-quote-Aktion.","type":["string","null"]},"include":{"description":"Write-only: was beim Duplizieren bzw. beim Erzeugen einer Vorlage mitkommt.","type":"object","additionalProperties":{"type":"boolean"}},"targetName":{"maxLength":255,"description":"Write-only: Name des Duplikats bzw. der Vorlage; leer ⇒ „<Original> (Kopie)\".","type":["string","null"]},"templateUlid":{"description":"Write-only: Vorlage (ULID) für die create-from-template-Aktion.","type":["string","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"budgetHours":{"minimum":0,"type":["integer","null"]},"budgetAmount":{"minimum":0,"description":"Soll-Betrag in Cent.","type":["integer","null"]},"billingMode":{"enum":["milestone","time","quota"],"type":["string","null"]},"defaultBillable":{"type":["boolean","null"]},"startsAt":{"type":["string","null"]},"dueAt":{"type":["string","null"]},"notes":{"type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}}}},"Project.jsonld-project.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK, zusätzlich zur ULID-IRI — für Relations-Filter (projectId) + EntityPicker.","type":["integer","null"]},"code":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"type":{"maxLength":50,"description":"Typ-Key (ProjectType-Katalog, settings-pflegbar). Leer = Default-Typ.","type":["string","null"]},"visibility":{"enum":["normal","private"],"description":"Sichtbarkeit (Doc 27 2.3): normal|private — privat = nur Ersteller + Mitglieder.","default":"normal","type":"string"},"externalAssignedOnly":{"description":"Projekt-Option „Externe sehen nur ZUGEWIESENE Aufgaben\" (Doc 27 Stufe 7, E-1).","default":false,"type":"boolean"},"taskMailToken":{"maxLength":40,"description":"E-Mail-zu-Aufgabe (Doc 27 1.4/G10): Lokalteil der Projekt-Aufgabenadresse. `null` = Eingang\nfür dieses Projekt aus. Beim Schreiben genügt ein beliebiger Wunsch-Token; er wird\nnormalisiert (Kleinbuchstaben, nur a–z/0–9/Bindestrich) und muss systemweit eindeutig sein.","type":["string","null"]},"taskMailListId":{"description":"Ziel-Aufgabenliste des Mail-Eingangs (WorkItemList-ID); null = ohne Liste.","type":["integer","null"]},"taskMailAddress":{"description":"Vollständige Eingangsadresse (read-only) — null, solange Token oder Domain fehlen.","type":["string","null"]},"statusKey":{"maxLength":50,"description":"Status-Key (ProjectStatus). Leer = Default-Status.","type":["string","null"]},"statusLabel":{"type":["string","null"]},"statusCategory":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"customerUlid":{"description":"Kundenbezug per ULID (system-weite Identifier-Konvention).","type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"quoteId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"budgetHours":{"minimum":0,"type":["integer","null"]},"budgetAmount":{"minimum":0,"description":"Soll-Betrag in Cent.","type":["integer","null"]},"billingMode":{"enum":["milestone","time","quota"],"type":["string","null"]},"defaultBillable":{"type":["boolean","null"]},"startsAt":{"type":["string","null"]},"dueAt":{"type":["string","null"]},"closedAt":{"type":["string","null"],"format":"date-time"},"health":{"description":"Budget-Ampel: green/yellow/red.","default":"green","type":"string"},"openRiskCount":{"description":"Anzahl offener Risiken/Issues. Bewusst getrennt von der Budget-Ampel {@see self::$health} — eigenes Badge.","default":0,"type":"integer"},"maxRiskSeverity":{"description":"Höchste Severity unter den offenen Risiken: low|medium|high|critical (null = keine offenen).","type":["string","null"]},"notes":{"type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":"string"}},"members":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"milestones":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"spentHours":{"description":"Profitabilität/Budget-Wächter (nur Item-Sicht, rechteabhängig).","type":["number","null"]},"spentCostAmount":{"type":["integer","null"]},"revenueAmount":{"type":["integer","null"]},"marginAmount":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}]},"ProjectAcceptance-acceptance.read":{"type":"object","description":"Abnahme intern/Kunde je Projekt/Meilenstein (04-02 §4.5, PM7).\n- Anfordern: legt pending an, löst {@see \\App\\Project\\Event\\AcceptanceRequested} aus (Portal-Benachrichtigung)\n- Kunden-Entscheidung nur im Portal (beweissicher, ApprovalService)\n- interne Abnahme: direkt via POST /v1/project-milestones/{ulid}/accept\n- daher: Anfordern akzeptiert nur kind=customer.","properties":{"ulid":{"type":["string","null"]},"projectUlid":{"type":["string","null"]},"projectName":{"type":["string","null"]},"milestoneUlid":{"type":["string","null"]},"milestoneName":{"type":["string","null"]},"scope":{"description":"project | milestone.","default":"","type":"string"},"kind":{"description":"internal | customer — beim Anfordern ist nur customer zulässig (Default).","default":"customer","type":"string"},"status":{"default":"","type":"string"},"requestedAt":{"type":["string","null"],"format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"comment":{"type":["string","null"]}}},"ProjectAcceptance-acceptance.write":{"type":"object","description":"Abnahme intern/Kunde je Projekt/Meilenstein (04-02 §4.5, PM7).\n- Anfordern: legt pending an, löst {@see \\App\\Project\\Event\\AcceptanceRequested} aus (Portal-Benachrichtigung)\n- Kunden-Entscheidung nur im Portal (beweissicher, ApprovalService)\n- interne Abnahme: direkt via POST /v1/project-milestones/{ulid}/accept\n- daher: Anfordern akzeptiert nur kind=customer.","properties":{"kind":{"description":"internal | customer — beim Anfordern ist nur customer zulässig (Default).","default":"customer","type":"string"}}},"ProjectAcceptance.jsonld-acceptance.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"projectUlid":{"type":["string","null"]},"projectName":{"type":["string","null"]},"milestoneUlid":{"type":["string","null"]},"milestoneName":{"type":["string","null"]},"scope":{"description":"project | milestone.","default":"","type":"string"},"kind":{"description":"internal | customer — beim Anfordern ist nur customer zulässig (Default).","default":"customer","type":"string"},"status":{"default":"","type":"string"},"requestedAt":{"type":["string","null"],"format":"date-time"},"decidedAt":{"type":["string","null"],"format":"date-time"},"comment":{"type":["string","null"]}}}],"description":"Abnahme intern/Kunde je Projekt/Meilenstein (04-02 §4.5, PM7).\n- Anfordern: legt pending an, löst {@see \\App\\Project\\Event\\AcceptanceRequested} aus (Portal-Benachrichtigung)\n- Kunden-Entscheidung nur im Portal (beweissicher, ApprovalService)\n- interne Abnahme: direkt via POST /v1/project-milestones/{ulid}/accept\n- daher: Anfordern akzeptiert nur kind=customer."},"ProjectActivity-project_activity.read":{"type":"object","description":"Aggregierte Vorgangs-Kommunikation eines Projekts (10-kommunikation-integration, D5/AP-4.1).\n- read-only Verdichtung der WorkItemMessages aller Vorgänge (Tasks+Tickets) mit projectId = Projekt\n- getrennt von CommunicationMessage (subjectType=project, Portal-Kollaboration): das hier zeigt\n  Vorgangs-Kommunikation, jene die direkte Projekt-Kunden-Korrespondenz.","properties":{"id":{"description":"Message-ULID (Identifier des Aggregations-Eintrags).","default":"","type":"string"},"workItemUlid":{"description":"Quell-Vorgang der Nachricht (Sprungziel in der UI).","type":["string","null"]},"workItemRef":{"type":["string","null"]},"workItemTitle":{"type":["string","null"]},"workItemKind":{"description":"task | ticket — steuert das Sprungziel (/work-items vs. /tickets) im Frontend.","type":["string","null"]},"type":{"default":"comment","type":"string"},"direction":{"type":["string","null"]},"internal":{"default":true,"type":"boolean"},"subject":{"type":["string","null"]},"body":{"type":["string","null"]},"authorId":{"type":["integer","null"]},"occurredAt":{"type":["string","null"]}}},"ProjectActivity.jsonld-project_activity.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Message-ULID (Identifier des Aggregations-Eintrags).","default":"","type":"string"},"workItemUlid":{"description":"Quell-Vorgang der Nachricht (Sprungziel in der UI).","type":["string","null"]},"workItemRef":{"type":["string","null"]},"workItemTitle":{"type":["string","null"]},"workItemKind":{"description":"task | ticket — steuert das Sprungziel (/work-items vs. /tickets) im Frontend.","type":["string","null"]},"type":{"default":"comment","type":"string"},"direction":{"type":["string","null"]},"internal":{"default":true,"type":"boolean"},"subject":{"type":["string","null"]},"body":{"type":["string","null"]},"authorId":{"type":["integer","null"]},"occurredAt":{"type":["string","null"]}}}],"description":"Aggregierte Vorgangs-Kommunikation eines Projekts (10-kommunikation-integration, D5/AP-4.1).\n- read-only Verdichtung der WorkItemMessages aller Vorgänge (Tasks+Tickets) mit projectId = Projekt\n- getrennt von CommunicationMessage (subjectType=project, Portal-Kollaboration): das hier zeigt\n  Vorgangs-Kommunikation, jene die direkte Projekt-Kunden-Korrespondenz."},"ProjectAi-projectai.read":{"type":"object","description":"KI-Assistenz am Projekt (Doc 27 Stufe 5) — durchgehend **Vorschlag statt Automatik**.\n\nVier Operationen, alle als POST (sie verbrauchen KI-Budget und sind damit keine cachebaren Reads):\n - `…/ai/task-breakdown`        (5.1) Aufgaben-Vorschlag aus Briefing — legt NICHTS an\n - `…/ai/task-breakdown/apply`  (5.1) übernimmt die vom Nutzer ausgewählten Vorschläge\n - `…/ai/status-summary`        (5.2) Statusbericht auf Abruf\n - `…/ai/risk-scan`             (5.4) Heuristik-Signale + KI-Einordnung; optional als Risiko anlegen\n\nLesen/Vorschlagen verlangt `projects.project.view`, jedes Anlegen `projects.project.edit`.","properties":{"projectUlid":{"type":["string","null"]},"suggestions":{"description":"Vorgeschlagene Aufgaben (`task-breakdown`).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}]}}},"createdTasks":{"description":"Anzahl tatsächlich angelegter Aufgaben (`apply`).","type":["integer","null"]},"summary":{"description":"Statusbericht bzw. Risiko-Einordnung; null = keine KI konfiguriert oder nichts zu berichten.","type":["string","null"]},"signals":{"description":"Heuristische Risiko-Signale (`risk-scan`) — entstehen OHNE KI und sind daher immer belastbar.","type":"array","items":{"type":"string"}},"riskUlid":{"description":"ULID des angelegten Risikos, wenn `createRisk` griff.","type":["string","null"]}}},"ProjectAi-projectai.write":{"type":"object","description":"KI-Assistenz am Projekt (Doc 27 Stufe 5) — durchgehend **Vorschlag statt Automatik**.\n\nVier Operationen, alle als POST (sie verbrauchen KI-Budget und sind damit keine cachebaren Reads):\n - `…/ai/task-breakdown`        (5.1) Aufgaben-Vorschlag aus Briefing — legt NICHTS an\n - `…/ai/task-breakdown/apply`  (5.1) übernimmt die vom Nutzer ausgewählten Vorschläge\n - `…/ai/status-summary`        (5.2) Statusbericht auf Abruf\n - `…/ai/risk-scan`             (5.4) Heuristik-Signale + KI-Einordnung; optional als Risiko anlegen\n\nLesen/Vorschlagen verlangt `projects.project.view`, jedes Anlegen `projects.project.edit`.","properties":{"briefing":{"description":"Briefing für den Aufgaben-Vorschlag; leer = die Projekt-Notizen werden verwendet.","type":["string","null"]},"tasks":{"description":"Zu übernehmende Vorschläge (nur `apply`) — üblicherweise die vom Nutzer angehakte Teilmenge\nder Vorschau.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}]}}},"listId":{"description":"Ziel-Aufgabenliste der übernommenen Aufgaben (nur `apply`).","type":["integer","null"]},"createRisk":{"description":"Beim Risiko-Scan zusätzlich ein `ProjectRisk` anlegen (verlangt Schreibrecht).","default":false,"type":"boolean"}}},"ProjectAi.jsonld-projectai.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"projectUlid":{"type":["string","null"]},"suggestions":{"description":"Vorgeschlagene Aufgaben (`task-breakdown`).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}]}}},"createdTasks":{"description":"Anzahl tatsächlich angelegter Aufgaben (`apply`).","type":["integer","null"]},"summary":{"description":"Statusbericht bzw. Risiko-Einordnung; null = keine KI konfiguriert oder nichts zu berichten.","type":["string","null"]},"signals":{"description":"Heuristische Risiko-Signale (`risk-scan`) — entstehen OHNE KI und sind daher immer belastbar.","type":"array","items":{"type":"string"}},"riskUlid":{"description":"ULID des angelegten Risikos, wenn `createRisk` griff.","type":["string","null"]}}}],"description":"KI-Assistenz am Projekt (Doc 27 Stufe 5) — durchgehend **Vorschlag statt Automatik**.\n\nVier Operationen, alle als POST (sie verbrauchen KI-Budget und sind damit keine cachebaren Reads):\n - `…/ai/task-breakdown`        (5.1) Aufgaben-Vorschlag aus Briefing — legt NICHTS an\n - `…/ai/task-breakdown/apply`  (5.1) übernimmt die vom Nutzer ausgewählten Vorschläge\n - `…/ai/status-summary`        (5.2) Statusbericht auf Abruf\n - `…/ai/risk-scan`             (5.4) Heuristik-Signale + KI-Einordnung; optional als Risiko anlegen\n\nLesen/Vorschlagen verlangt `projects.project.view`, jedes Anlegen `projects.project.edit`."},"ProjectAutopilot-projectautopilot.read":{"type":"object","description":"Projekt-Autopilot je Projekt (Doc 27 2.5/G15, E3) — Singleton unter dem Projekt.\n- GET liefert immer eine Antwort (Defaults, falls noch nie konfiguriert)\n- Rechte wie Projekt-Bearbeitung; Marken-Scope über die Projekt-Marke im State-Layer\n- **Nur Benachrichtigungen**: die Einstellung löst nie Status-/Termin-Änderungen aus.","properties":{"projectUlid":{"type":["string","null"]},"enabled":{"default":false,"type":"boolean"},"mode":{"enum":["agile","scheduled"],"description":"`agile` (Fortschritts-Signale) oder `scheduled` (Termin-Signale).","default":"scheduled","type":"string"},"alertPlanningNeeded":{"default":true,"type":"boolean"},"alertDeadlineDeviation":{"default":true,"type":"boolean"},"alertBudgetWarning":{"default":true,"type":"boolean"},"alertInactivity":{"default":true,"type":"boolean"},"inactivityDays":{"minimum":1,"maximum":365,"default":14,"type":"integer"},"budgetThresholdPct":{"minimum":1,"maximum":100,"default":80,"type":"integer"},"lastAlertAt":{"description":"Letzter Versand je Alarm (`alarmKey => ISO-8601`) — macht die Wiedervorlage-Sperre sichtbar.","type":"object","additionalProperties":{"type":"string"}}}},"ProjectAutopilot-projectautopilot.write.jsonMergePatch":{"type":"object","description":"Projekt-Autopilot je Projekt (Doc 27 2.5/G15, E3) — Singleton unter dem Projekt.\n- GET liefert immer eine Antwort (Defaults, falls noch nie konfiguriert)\n- Rechte wie Projekt-Bearbeitung; Marken-Scope über die Projekt-Marke im State-Layer\n- **Nur Benachrichtigungen**: die Einstellung löst nie Status-/Termin-Änderungen aus.","properties":{"enabled":{"default":false,"type":"boolean"},"mode":{"enum":["agile","scheduled"],"description":"`agile` (Fortschritts-Signale) oder `scheduled` (Termin-Signale).","default":"scheduled","type":"string"},"alertPlanningNeeded":{"default":true,"type":"boolean"},"alertDeadlineDeviation":{"default":true,"type":"boolean"},"alertBudgetWarning":{"default":true,"type":"boolean"},"alertInactivity":{"default":true,"type":"boolean"},"inactivityDays":{"minimum":1,"maximum":365,"default":14,"type":"integer"},"budgetThresholdPct":{"minimum":1,"maximum":100,"default":80,"type":"integer"}}},"ProjectAutopilot.jsonld-projectautopilot.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"projectUlid":{"type":["string","null"]},"enabled":{"default":false,"type":"boolean"},"mode":{"enum":["agile","scheduled"],"description":"`agile` (Fortschritts-Signale) oder `scheduled` (Termin-Signale).","default":"scheduled","type":"string"},"alertPlanningNeeded":{"default":true,"type":"boolean"},"alertDeadlineDeviation":{"default":true,"type":"boolean"},"alertBudgetWarning":{"default":true,"type":"boolean"},"alertInactivity":{"default":true,"type":"boolean"},"inactivityDays":{"minimum":1,"maximum":365,"default":14,"type":"integer"},"budgetThresholdPct":{"minimum":1,"maximum":100,"default":80,"type":"integer"},"lastAlertAt":{"description":"Letzter Versand je Alarm (`alarmKey => ISO-8601`) — macht die Wiedervorlage-Sperre sichtbar.","type":"object","additionalProperties":{"type":"string"}}}}],"description":"Projekt-Autopilot je Projekt (Doc 27 2.5/G15, E3) — Singleton unter dem Projekt.\n- GET liefert immer eine Antwort (Defaults, falls noch nie konfiguriert)\n- Rechte wie Projekt-Bearbeitung; Marken-Scope über die Projekt-Marke im State-Layer\n- **Nur Benachrichtigungen**: die Einstellung löst nie Status-/Termin-Änderungen aus."},"ProjectGantt-projectgantt.read":{"type":"object","description":"Gantt-Lesesicht eines Projekts (Doc 27 Stufe 2.1/G11, ENT-PM-GANTT-01).\n\n**Warum eine eigene Ressource statt der Aufgaben-Collection:** ein Gantt braucht Balken UND\nKanten in einem Rutsch. Die Abhängigkeiten liefert `/v1/work-items` nur in der **Item**-Sicht —\nein Gantt mit 200 Aufgaben würde daraus 200 Einzelaufrufe machen. Diese Sicht holt beides mit\nzwei Abfragen und liefert genau die Felder, die die Zeitachse zeichnet.\n\n**Nur lesend.** Verschieben/Verknüpfen schreibt der Client über die bestehenden Endpunkte\n(`PATCH /v1/work-items/{ulid}` bzw. `POST|DELETE /v1/work-items/{ulid}/dependencies`) — sonst\ngäbe es einen zweiten Schreibpfad mit eigener Rechte-/Audit-Logik neben dem etablierten.","properties":{"projectUlid":{"type":["string","null"]},"projectStartsAt":{"description":"Projekt-Eckdaten als Rahmen der Zeitachse (kann leer sein — dann rahmt der Client über die Aufgaben).","type":["string","null"],"format":"date-time"},"projectDueAt":{"type":["string","null"],"format":"date-time"},"tasks":{"description":"Balken. `startAt`/`dueDate` können einzeln fehlen — der Client entscheidet, ob er daraus einen\nkurzen Balken macht oder die Aufgabe in die „ungeplant\"-Leiste stellt (ENT-PM-PAR-01: der\n`createdAt`-Fallback gilt nur der Darstellung, nie der Rechnung).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"links":{"description":"Kanten zwischen den Balken. Richtung wie im Kernel: `fromUlid` = Nachfolger,\n`toUlid` = Vorgänger.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"milestones":{"description":"Meilensteine des Projekts als Rauten auf der Achse.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProjectGantt.jsonld-projectgantt.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"projectUlid":{"type":["string","null"]},"projectStartsAt":{"description":"Projekt-Eckdaten als Rahmen der Zeitachse (kann leer sein — dann rahmt der Client über die Aufgaben).","type":["string","null"],"format":"date-time"},"projectDueAt":{"type":["string","null"],"format":"date-time"},"tasks":{"description":"Balken. `startAt`/`dueDate` können einzeln fehlen — der Client entscheidet, ob er daraus einen\nkurzen Balken macht oder die Aufgabe in die „ungeplant\"-Leiste stellt (ENT-PM-PAR-01: der\n`createdAt`-Fallback gilt nur der Darstellung, nie der Rechnung).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"links":{"description":"Kanten zwischen den Balken. Richtung wie im Kernel: `fromUlid` = Nachfolger,\n`toUlid` = Vorgänger.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"milestones":{"description":"Meilensteine des Projekts als Rauten auf der Achse.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Gantt-Lesesicht eines Projekts (Doc 27 Stufe 2.1/G11, ENT-PM-GANTT-01).\n\n**Warum eine eigene Ressource statt der Aufgaben-Collection:** ein Gantt braucht Balken UND\nKanten in einem Rutsch. Die Abhängigkeiten liefert `/v1/work-items` nur in der **Item**-Sicht —\nein Gantt mit 200 Aufgaben würde daraus 200 Einzelaufrufe machen. Diese Sicht holt beides mit\nzwei Abfragen und liefert genau die Felder, die die Zeitachse zeichnet.\n\n**Nur lesend.** Verschieben/Verknüpfen schreibt der Client über die bestehenden Endpunkte\n(`PATCH /v1/work-items/{ulid}` bzw. `POST|DELETE /v1/work-items/{ulid}/dependencies`) — sonst\ngäbe es einen zweiten Schreibpfad mit eigener Rechte-/Audit-Logik neben dem etablierten."},"ProjectMember-projectmember.read":{"type":"object","description":"Team-Mitglieder je Projekt (04-02 §4.2).\n- Rechte wie Risiken: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer.","properties":{"id":{"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectUlid":{"type":["string","null"]},"projectName":{"description":"Anzeige-Attribute des Projekts (read-only).","type":["string","null"]},"projectCode":{"type":["string","null"]},"projectStatusLabel":{"type":["string","null"]},"projectStartsAt":{"type":["string","null"]},"projectDueAt":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectRole":{"enum":["lead","member","reviewer","observer"],"default":"member","type":"string"},"allocationHint":{"description":"Geplante Auslastung in Prozent (Ressourcenplanung).","type":["integer","null"]},"internalRateId":{"description":"Abweichender interner Satz für die Margenrechnung (Rate-Override).","type":["integer","null"]}},"required":["projectId","employeeId"]},"ProjectMember-projectmember.write":{"type":"object","description":"Team-Mitglieder je Projekt (04-02 §4.2).\n- Rechte wie Risiken: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer.","required":["projectId","employeeId"],"properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectRole":{"enum":["lead","member","reviewer","observer"],"default":"member","type":"string"},"allocationHint":{"description":"Geplante Auslastung in Prozent (Ressourcenplanung).","type":["integer","null"]},"internalRateId":{"description":"Abweichender interner Satz für die Margenrechnung (Rate-Override).","type":["integer","null"]}}},"ProjectMember-projectmember.write.jsonMergePatch":{"type":"object","description":"Team-Mitglieder je Projekt (04-02 §4.2).\n- Rechte wie Risiken: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer.","properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectRole":{"enum":["lead","member","reviewer","observer"],"default":"member","type":"string"},"allocationHint":{"description":"Geplante Auslastung in Prozent (Ressourcenplanung).","type":["integer","null"]},"internalRateId":{"description":"Abweichender interner Satz für die Margenrechnung (Rate-Override).","type":["integer","null"]}}},"ProjectMember.jsonld-projectmember.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectUlid":{"type":["string","null"]},"projectName":{"description":"Anzeige-Attribute des Projekts (read-only).","type":["string","null"]},"projectCode":{"type":["string","null"]},"projectStatusLabel":{"type":["string","null"]},"projectStartsAt":{"type":["string","null"]},"projectDueAt":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectRole":{"enum":["lead","member","reviewer","observer"],"default":"member","type":"string"},"allocationHint":{"description":"Geplante Auslastung in Prozent (Ressourcenplanung).","type":["integer","null"]},"internalRateId":{"description":"Abweichender interner Satz für die Margenrechnung (Rate-Override).","type":["integer","null"]}},"required":["projectId","employeeId"]}],"description":"Team-Mitglieder je Projekt (04-02 §4.2).\n- Rechte wie Risiken: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer."},"ProjectRisk-projectrisk.read":{"type":"object","description":"Risiken/Issues je Projekt (04-02 S2-1).\n- Rechte wie Meilensteine: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer.","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectUlid":{"type":["string","null"]},"type":{"enum":["risk","issue"],"default":"risk","type":"string"},"title":{"maxLength":255,"default":"","type":"string"},"description":{"type":["string","null"]},"severity":{"enum":["low","medium","high","critical"],"default":"medium","type":"string"},"status":{"enum":["open","mitigated","closed"],"default":"open","type":"string"},"ownerId":{"minimum":0,"exclusiveMinimum":0,"description":"Verantwortlicher (Employee-ID).","type":["integer","null"]},"mitigation":{"description":"Gegenmaßnahme/Mitigationsplan.","type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["projectId","title"]},"ProjectRisk-projectrisk.write":{"type":"object","description":"Risiken/Issues je Projekt (04-02 S2-1).\n- Rechte wie Meilensteine: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer.","required":["projectId","title"],"properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"type":{"enum":["risk","issue"],"default":"risk","type":"string"},"title":{"maxLength":255,"default":"","type":"string"},"description":{"type":["string","null"]},"severity":{"enum":["low","medium","high","critical"],"default":"medium","type":"string"},"status":{"enum":["open","mitigated","closed"],"default":"open","type":"string"},"ownerId":{"minimum":0,"exclusiveMinimum":0,"description":"Verantwortlicher (Employee-ID).","type":["integer","null"]},"mitigation":{"description":"Gegenmaßnahme/Mitigationsplan.","type":["string","null"]}}},"ProjectRisk-projectrisk.write.jsonMergePatch":{"type":"object","description":"Risiken/Issues je Projekt (04-02 S2-1).\n- Rechte wie Meilensteine: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer.","properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"type":{"enum":["risk","issue"],"default":"risk","type":"string"},"title":{"maxLength":255,"default":"","type":"string"},"description":{"type":["string","null"]},"severity":{"enum":["low","medium","high","critical"],"default":"medium","type":"string"},"status":{"enum":["open","mitigated","closed"],"default":"open","type":"string"},"ownerId":{"minimum":0,"exclusiveMinimum":0,"description":"Verantwortlicher (Employee-ID).","type":["integer","null"]},"mitigation":{"description":"Gegenmaßnahme/Mitigationsplan.","type":["string","null"]}}},"ProjectRisk.jsonld-projectrisk.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectUlid":{"type":["string","null"]},"type":{"enum":["risk","issue"],"default":"risk","type":"string"},"title":{"maxLength":255,"default":"","type":"string"},"description":{"type":["string","null"]},"severity":{"enum":["low","medium","high","critical"],"default":"medium","type":"string"},"status":{"enum":["open","mitigated","closed"],"default":"open","type":"string"},"ownerId":{"minimum":0,"exclusiveMinimum":0,"description":"Verantwortlicher (Employee-ID).","type":["integer","null"]},"mitigation":{"description":"Gegenmaßnahme/Mitigationsplan.","type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["projectId","title"]}],"description":"Risiken/Issues je Projekt (04-02 S2-1).\n- Rechte wie Meilensteine: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer."},"ProjectStatus-project_status.read":{"type":"object","description":"Projekt-Status als Daten (04-02 §3.1), konfigurierbar ohne Code.\n`category` bildet den Lebenszyklus open|active|done|cancelled ab.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProjectStatus-project_status.update.jsonMergePatch":{"type":"object","description":"Projekt-Status als Daten (04-02 §3.1), konfigurierbar ohne Code.\n`category` bildet den Lebenszyklus open|active|done|cancelled ab.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProjectStatus-project_status.write":{"type":"object","description":"Projekt-Status als Daten (04-02 §3.1), konfigurierbar ohne Code.\n`category` bildet den Lebenszyklus open|active|done|cancelled ab.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProjectStatus.jsonld-project_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Projekt-Status als Daten (04-02 §3.1), konfigurierbar ohne Code.\n`category` bildet den Lebenszyklus open|active|done|cancelled ab."},"ProjectTaskPriority-project_task_priority.read":{"type":"object","description":"Aufgaben-Prioritäten als Daten (konfigurierbar, kein Code). weight: höher = dringender.\nkey = WorkItem.priorityId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-priorities\nauf /v1/work-item/task-priorities gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"weight":{"description":"Höher = dringender.","type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProjectTaskPriority-project_task_priority.update.jsonMergePatch":{"type":"object","description":"Aufgaben-Prioritäten als Daten (konfigurierbar, kein Code). weight: höher = dringender.\nkey = WorkItem.priorityId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-priorities\nauf /v1/work-item/task-priorities gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t.","properties":{"label":{"type":["string","null"]},"color":{"type":["string","null"]},"weight":{"description":"Höher = dringender.","type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProjectTaskPriority-project_task_priority.write":{"type":"object","description":"Aufgaben-Prioritäten als Daten (konfigurierbar, kein Code). weight: höher = dringender.\nkey = WorkItem.priorityId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-priorities\nauf /v1/work-item/task-priorities gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"weight":{"description":"Höher = dringender.","type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProjectTaskPriority.jsonld-project_task_priority.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"color":{"type":["string","null"]},"weight":{"description":"Höher = dringender.","type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Aufgaben-Prioritäten als Daten (konfigurierbar, kein Code). weight: höher = dringender.\nkey = WorkItem.priorityId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-priorities\nauf /v1/work-item/task-priorities gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t."},"ProjectTaskStatus-project_task_status.read":{"type":"object","description":"Aufgaben-Status als Daten (04-02 §3.2, konfigurierbar, kein Code). category = Lebenszyklus\nopen|active|done|cancelled. key = WorkItem.statusId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-statuses\nauf /v1/work-item/task-statuses gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"timerStartStatusKey":{"maxLength":50,"description":"Folgestatus beim Start einer Stoppuhr auf einer Aufgabe in DIESEM Status (Owner 2026-08-25).","type":["string","null"]}}},"ProjectTaskStatus-project_task_status.update.jsonMergePatch":{"type":"object","description":"Aufgaben-Status als Daten (04-02 §3.2, konfigurierbar, kein Code). category = Lebenszyklus\nopen|active|done|cancelled. key = WorkItem.statusId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-statuses\nauf /v1/work-item/task-statuses gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"timerStartStatusKey":{"maxLength":50,"description":"Folgestatus beim Start einer Stoppuhr auf einer Aufgabe in DIESEM Status (Owner 2026-08-25).","type":["string","null"]}}},"ProjectTaskStatus-project_task_status.write":{"type":"object","description":"Aufgaben-Status als Daten (04-02 §3.2, konfigurierbar, kein Code). category = Lebenszyklus\nopen|active|done|cancelled. key = WorkItem.statusId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-statuses\nauf /v1/work-item/task-statuses gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"timerStartStatusKey":{"maxLength":50,"description":"Folgestatus beim Start einer Stoppuhr auf einer Aufgabe in DIESEM Status (Owner 2026-08-25).","type":["string","null"]}}},"ProjectTaskStatus.jsonld-project_task_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"timerStartStatusKey":{"maxLength":50,"description":"Folgestatus beim Start einer Stoppuhr auf einer Aufgabe in DIESEM Status (Owner 2026-08-25).","type":["string","null"]}}}],"description":"Aufgaben-Status als Daten (04-02 §3.2, konfigurierbar, kein Code). category = Lebenszyklus\nopen|active|done|cancelled. key = WorkItem.statusId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-statuses\nauf /v1/work-item/task-statuses gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t."},"ProjectTemplate-project_template.read":{"type":"object","description":"Projekt-Vorlagen (04-02): vordefinierte Meilensteine+Aufgaben für wiederkehrende Zuschnitte.\n- Lesen: Projekt-Leserecht (Vorlagen-Auswahl beim Anlegen)\n- Pflege: Projekt-Konfigurationsrecht (analog Status-Kataloge)\n- Anwenden: POST /v1/projects/from-template ({@see ProjectResource}).","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"description":{"type":["string","null"]},"projectType":{"maxLength":50,"description":"Typ-Key des erzeugten Projekts (ProjectType-Katalog). Leer = Default-Typ.","type":["string","null"]},"defaultBudgetHours":{"minimum":0,"description":"Vorbelegung des Stundenbudgets im erzeugten Projekt.","type":["integer","null"]},"brandId":{"description":"null = Vorlage für alle Marken.","type":["integer","null"]},"active":{"default":true,"type":"boolean"},"milestones":{"description":"Meilenstein-Zeilen in Anwendungs-Reihenfolge:\n{title, offsetDays, billable, sortOrder}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Aufgaben-Zeilen in Anwendungs-Reihenfolge:\n{title, description, milestoneIndex, priorityKey, estimatedHours, offsetDays, sortOrder, assigneeRole}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"ProjectTemplate-project_template.write":{"type":"object","description":"Projekt-Vorlagen (04-02): vordefinierte Meilensteine+Aufgaben für wiederkehrende Zuschnitte.\n- Lesen: Projekt-Leserecht (Vorlagen-Auswahl beim Anlegen)\n- Pflege: Projekt-Konfigurationsrecht (analog Status-Kataloge)\n- Anwenden: POST /v1/projects/from-template ({@see ProjectResource}).","required":["name"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"description":{"type":["string","null"]},"projectType":{"maxLength":50,"description":"Typ-Key des erzeugten Projekts (ProjectType-Katalog). Leer = Default-Typ.","type":["string","null"]},"defaultBudgetHours":{"minimum":0,"description":"Vorbelegung des Stundenbudgets im erzeugten Projekt.","type":["integer","null"]},"brandId":{"description":"null = Vorlage für alle Marken.","type":["integer","null"]},"active":{"default":true,"type":"boolean"},"milestones":{"description":"Meilenstein-Zeilen in Anwendungs-Reihenfolge:\n{title, offsetDays, billable, sortOrder}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Aufgaben-Zeilen in Anwendungs-Reihenfolge:\n{title, description, milestoneIndex, priorityKey, estimatedHours, offsetDays, sortOrder, assigneeRole}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProjectTemplate-project_template.write.jsonMergePatch":{"type":"object","description":"Projekt-Vorlagen (04-02): vordefinierte Meilensteine+Aufgaben für wiederkehrende Zuschnitte.\n- Lesen: Projekt-Leserecht (Vorlagen-Auswahl beim Anlegen)\n- Pflege: Projekt-Konfigurationsrecht (analog Status-Kataloge)\n- Anwenden: POST /v1/projects/from-template ({@see ProjectResource}).","properties":{"name":{"maxLength":255,"default":"","type":"string"},"description":{"type":["string","null"]},"projectType":{"maxLength":50,"description":"Typ-Key des erzeugten Projekts (ProjectType-Katalog). Leer = Default-Typ.","type":["string","null"]},"defaultBudgetHours":{"minimum":0,"description":"Vorbelegung des Stundenbudgets im erzeugten Projekt.","type":["integer","null"]},"brandId":{"description":"null = Vorlage für alle Marken.","type":["integer","null"]},"active":{"default":true,"type":"boolean"},"milestones":{"description":"Meilenstein-Zeilen in Anwendungs-Reihenfolge:\n{title, offsetDays, billable, sortOrder}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Aufgaben-Zeilen in Anwendungs-Reihenfolge:\n{title, description, milestoneIndex, priorityKey, estimatedHours, offsetDays, sortOrder, assigneeRole}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ProjectTemplate.jsonld-project_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"description":{"type":["string","null"]},"projectType":{"maxLength":50,"description":"Typ-Key des erzeugten Projekts (ProjectType-Katalog). Leer = Default-Typ.","type":["string","null"]},"defaultBudgetHours":{"minimum":0,"description":"Vorbelegung des Stundenbudgets im erzeugten Projekt.","type":["integer","null"]},"brandId":{"description":"null = Vorlage für alle Marken.","type":["integer","null"]},"active":{"default":true,"type":"boolean"},"milestones":{"description":"Meilenstein-Zeilen in Anwendungs-Reihenfolge:\n{title, offsetDays, billable, sortOrder}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Aufgaben-Zeilen in Anwendungs-Reihenfolge:\n{title, description, milestoneIndex, priorityKey, estimatedHours, offsetDays, sortOrder, assigneeRole}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}],"description":"Projekt-Vorlagen (04-02): vordefinierte Meilensteine+Aufgaben für wiederkehrende Zuschnitte.\n- Lesen: Projekt-Leserecht (Vorlagen-Auswahl beim Anlegen)\n- Pflege: Projekt-Konfigurationsrecht (analog Status-Kataloge)\n- Anwenden: POST /v1/projects/from-template ({@see ProjectResource})."},"ProjectType-project_type.read":{"type":"object","description":"Konfigurierbare Projekttypen (Lookup als Daten): liefert Abrechnungs-Defaults\n(billingMode+defaultBillable) neuer Projekte.\nSystemtypen (fixed/tm/retainer) nicht löschbar — Keys referenziert von Quote-Konvertierung/Profitabilität.","required":["key","label"],"properties":{"key":{"maxLength":50,"type":["string","null"]},"label":{"maxLength":100,"type":["string","null"]},"billingMode":{"enum":["time","milestone","quota"],"description":"Default-Abrechnungsmodus neuer Projekte dieses Typs.","type":["string","null"]},"defaultBillable":{"description":"Default-Abrechenbarkeit der Aufwände neuer Projekte dieses Typs.","type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"isSystem":{"description":"Systemtyp (Seed): nicht löschbar — read-only.","default":false,"type":"boolean"}}},"ProjectType-project_type.update.jsonMergePatch":{"type":"object","description":"Konfigurierbare Projekttypen (Lookup als Daten): liefert Abrechnungs-Defaults\n(billingMode+defaultBillable) neuer Projekte.\nSystemtypen (fixed/tm/retainer) nicht löschbar — Keys referenziert von Quote-Konvertierung/Profitabilität.","properties":{"label":{"maxLength":100,"type":["string","null"]},"billingMode":{"enum":["time","milestone","quota"],"description":"Default-Abrechnungsmodus neuer Projekte dieses Typs.","type":["string","null"]},"defaultBillable":{"description":"Default-Abrechenbarkeit der Aufwände neuer Projekte dieses Typs.","type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProjectType-project_type.write":{"type":"object","description":"Konfigurierbare Projekttypen (Lookup als Daten): liefert Abrechnungs-Defaults\n(billingMode+defaultBillable) neuer Projekte.\nSystemtypen (fixed/tm/retainer) nicht löschbar — Keys referenziert von Quote-Konvertierung/Profitabilität.","required":["key","label"],"properties":{"key":{"maxLength":50,"type":["string","null"]},"label":{"maxLength":100,"type":["string","null"]},"billingMode":{"enum":["time","milestone","quota"],"description":"Default-Abrechnungsmodus neuer Projekte dieses Typs.","type":["string","null"]},"defaultBillable":{"description":"Default-Abrechenbarkeit der Aufwände neuer Projekte dieses Typs.","type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"ProjectType.jsonld-project_type.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"maxLength":50,"type":["string","null"]},"label":{"maxLength":100,"type":["string","null"]},"billingMode":{"enum":["time","milestone","quota"],"description":"Default-Abrechnungsmodus neuer Projekte dieses Typs.","type":["string","null"]},"defaultBillable":{"description":"Default-Abrechenbarkeit der Aufwände neuer Projekte dieses Typs.","type":["boolean","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"isSystem":{"description":"Systemtyp (Seed): nicht löschbar — read-only.","default":false,"type":"boolean"}}}],"description":"Konfigurierbare Projekttypen (Lookup als Daten): liefert Abrechnungs-Defaults\n(billingMode+defaultBillable) neuer Projekte.\nSystemtypen (fixed/tm/retainer) nicht löschbar — Keys referenziert von Quote-Konvertierung/Profitabilität."},"Promotion-promotion.read":{"type":"object","description":"Aktionspreis-Kampagne inkl. eingebetteter Regeln (Doc 25 AP 6.2, Spec 04-45 §5).\n\n`rules` schreiben = voller Ersatz (Muster Staffel-Sets): eine Aktion wird als Ganzes gepflegt,\nnicht Regel für Regel — sonst müsste die Oberfläche Teil-Zustände verwalten, die niemand sehen\nwill. DELETE ist ein Soft-Delete; die Aktion verschwindet damit sofort aus der Preisfindung.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"customerGroupId":{"minimum":0,"exclusiveMinimum":0,"description":"Zielgruppe: Kundengruppen-ID; null = alle Kunden.","type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Marken-Scope; null = markenübergreifend.","type":["integer","null"]},"priority":{"description":"Bei mehreren gleichzeitig gültigen Aktionen gewinnt die höhere Priorität.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (ISO-Datum); null = ohne Anfang.","type":["string","null"]},"validTo":{"description":"Gültig bis (ISO-Datum, einschliesslich); null = ohne Ende.","type":["string","null"]},"active":{"type":["boolean","null"]},"current":{"description":"Greift die Aktion heute? (read-only — beantwortet die Frage, die man in einer Liste stellt).","type":["boolean","null"]},"rules":{"description":"Regeln der Aktion; Schreiben ersetzt den Satz vollständig.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["name"]},"Promotion-promotion.write":{"type":"object","description":"Aktionspreis-Kampagne inkl. eingebetteter Regeln (Doc 25 AP 6.2, Spec 04-45 §5).\n\n`rules` schreiben = voller Ersatz (Muster Staffel-Sets): eine Aktion wird als Ganzes gepflegt,\nnicht Regel für Regel — sonst müsste die Oberfläche Teil-Zustände verwalten, die niemand sehen\nwill. DELETE ist ein Soft-Delete; die Aktion verschwindet damit sofort aus der Preisfindung.","required":["name"],"properties":{"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"customerGroupId":{"minimum":0,"exclusiveMinimum":0,"description":"Zielgruppe: Kundengruppen-ID; null = alle Kunden.","type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Marken-Scope; null = markenübergreifend.","type":["integer","null"]},"priority":{"description":"Bei mehreren gleichzeitig gültigen Aktionen gewinnt die höhere Priorität.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (ISO-Datum); null = ohne Anfang.","type":["string","null"]},"validTo":{"description":"Gültig bis (ISO-Datum, einschliesslich); null = ohne Ende.","type":["string","null"]},"active":{"type":["boolean","null"]},"rules":{"description":"Regeln der Aktion; Schreiben ersetzt den Satz vollständig.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Promotion-promotion.write.jsonMergePatch":{"type":"object","description":"Aktionspreis-Kampagne inkl. eingebetteter Regeln (Doc 25 AP 6.2, Spec 04-45 §5).\n\n`rules` schreiben = voller Ersatz (Muster Staffel-Sets): eine Aktion wird als Ganzes gepflegt,\nnicht Regel für Regel — sonst müsste die Oberfläche Teil-Zustände verwalten, die niemand sehen\nwill. DELETE ist ein Soft-Delete; die Aktion verschwindet damit sofort aus der Preisfindung.","properties":{"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"customerGroupId":{"minimum":0,"exclusiveMinimum":0,"description":"Zielgruppe: Kundengruppen-ID; null = alle Kunden.","type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Marken-Scope; null = markenübergreifend.","type":["integer","null"]},"priority":{"description":"Bei mehreren gleichzeitig gültigen Aktionen gewinnt die höhere Priorität.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (ISO-Datum); null = ohne Anfang.","type":["string","null"]},"validTo":{"description":"Gültig bis (ISO-Datum, einschliesslich); null = ohne Ende.","type":["string","null"]},"active":{"type":["boolean","null"]},"rules":{"description":"Regeln der Aktion; Schreiben ersetzt den Satz vollständig.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Promotion.jsonld-promotion.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"description":{"type":["string","null"]},"customerGroupId":{"minimum":0,"exclusiveMinimum":0,"description":"Zielgruppe: Kundengruppen-ID; null = alle Kunden.","type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Marken-Scope; null = markenübergreifend.","type":["integer","null"]},"priority":{"description":"Bei mehreren gleichzeitig gültigen Aktionen gewinnt die höhere Priorität.","type":["integer","null"]},"validFrom":{"description":"Gültig ab (ISO-Datum); null = ohne Anfang.","type":["string","null"]},"validTo":{"description":"Gültig bis (ISO-Datum, einschliesslich); null = ohne Ende.","type":["string","null"]},"active":{"type":["boolean","null"]},"current":{"description":"Greift die Aktion heute? (read-only — beantwortet die Frage, die man in einer Liste stellt).","type":["boolean","null"]},"rules":{"description":"Regeln der Aktion; Schreiben ersetzt den Satz vollständig.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["name"]}],"description":"Aktionspreis-Kampagne inkl. eingebetteter Regeln (Doc 25 AP 6.2, Spec 04-45 §5).\n\n`rules` schreiben = voller Ersatz (Muster Staffel-Sets): eine Aktion wird als Ganzes gepflegt,\nnicht Regel für Regel — sonst müsste die Oberfläche Teil-Zustände verwalten, die niemand sehen\nwill. DELETE ist ein Soft-Delete; die Aktion verschwindet damit sofort aus der Preisfindung."},"PurchaseRfq-rfq.read":{"type":"object","description":"Anfrage an mehrere Lieferanten (Doc 25 AP 7.5).\n\nDer Weg ist durchgängig und hat vier Schritte: anlegen (mit Positionen und Lieferanten) →\n`send` → je Lieferant `quote` oder `decline` → `award`. Der Vergleich liegt im Detail und\nbraucht keinen eigenen Aufruf — wer eine Anfrage öffnet, will die Tabelle sehen.\n\n**Vergeben wird positionsweise**, nicht als Gesamtangebot: Position 1 beim einen, Position 2 beim\nanderen ist genau das Ergebnis, für das man mehrere Lieferanten fragt.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"title":{"maxLength":160,"type":["string","null"]},"status":{"description":"draft|sent|awarded|cancelled (read-only — gesetzt über die Aktionen).","type":["string","null"]},"dueDate":{"description":"Frist für die Angebotsabgabe (YYYY-MM-DD).","type":["string","null"]},"note":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen: `{ulid, position, productId, description, qty, unit}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"suppliers":{"description":"Angefragte Lieferanten mit Antwort-Zustand: `{supplierRoleId, status, quotedAt, freightCostAmount, note}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"comparison":{"description":"Die Vergleichstabelle (nur im Detail): je Position alle Angebote nebeneinander.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdOrderUlids":{"description":"ULIDs der bei `award` erzeugten Entwurfs-Bestellungen.","type":["array","null"],"items":{"type":"string"}}}},"PurchaseRfq-rfq.write":{"type":"object","description":"Anfrage an mehrere Lieferanten (Doc 25 AP 7.5).\n\nDer Weg ist durchgängig und hat vier Schritte: anlegen (mit Positionen und Lieferanten) →\n`send` → je Lieferant `quote` oder `decline` → `award`. Der Vergleich liegt im Detail und\nbraucht keinen eigenen Aufruf — wer eine Anfrage öffnet, will die Tabelle sehen.\n\n**Vergeben wird positionsweise**, nicht als Gesamtangebot: Position 1 beim einen, Position 2 beim\nanderen ist genau das Ergebnis, für das man mehrere Lieferanten fragt.","properties":{"title":{"maxLength":160,"type":["string","null"]},"dueDate":{"description":"Frist für die Angebotsabgabe (YYYY-MM-DD).","type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen: `{ulid, position, productId, description, qty, unit}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"supplierRoleIds":{"description":"Angefragte Lieferanten (beim Schreiben: Liste von SupplierRole-IDs).","type":["array","null"],"items":{"type":"integer"}}}},"PurchaseRfq-rfq.write.jsonMergePatch":{"type":"object","description":"Anfrage an mehrere Lieferanten (Doc 25 AP 7.5).\n\nDer Weg ist durchgängig und hat vier Schritte: anlegen (mit Positionen und Lieferanten) →\n`send` → je Lieferant `quote` oder `decline` → `award`. Der Vergleich liegt im Detail und\nbraucht keinen eigenen Aufruf — wer eine Anfrage öffnet, will die Tabelle sehen.\n\n**Vergeben wird positionsweise**, nicht als Gesamtangebot: Position 1 beim einen, Position 2 beim\nanderen ist genau das Ergebnis, für das man mehrere Lieferanten fragt.","properties":{"title":{"maxLength":160,"type":["string","null"]},"dueDate":{"description":"Frist für die Angebotsabgabe (YYYY-MM-DD).","type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen: `{ulid, position, productId, description, qty, unit}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"supplierRoleIds":{"description":"Angefragte Lieferanten (beim Schreiben: Liste von SupplierRole-IDs).","type":["array","null"],"items":{"type":"integer"}}}},"PurchaseRfq.jsonld-rfq.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"title":{"maxLength":160,"type":["string","null"]},"status":{"description":"draft|sent|awarded|cancelled (read-only — gesetzt über die Aktionen).","type":["string","null"]},"dueDate":{"description":"Frist für die Angebotsabgabe (YYYY-MM-DD).","type":["string","null"]},"note":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen: `{ulid, position, productId, description, qty, unit}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"suppliers":{"description":"Angefragte Lieferanten mit Antwort-Zustand: `{supplierRoleId, status, quotedAt, freightCostAmount, note}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"comparison":{"description":"Die Vergleichstabelle (nur im Detail): je Position alle Angebote nebeneinander.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdOrderUlids":{"description":"ULIDs der bei `award` erzeugten Entwurfs-Bestellungen.","type":["array","null"],"items":{"type":"string"}}}}],"description":"Anfrage an mehrere Lieferanten (Doc 25 AP 7.5).\n\nDer Weg ist durchgängig und hat vier Schritte: anlegen (mit Positionen und Lieferanten) →\n`send` → je Lieferant `quote` oder `decline` → `award`. Der Vergleich liegt im Detail und\nbraucht keinen eigenen Aufruf — wer eine Anfrage öffnet, will die Tabelle sehen.\n\n**Vergeben wird positionsweise**, nicht als Gesamtangebot: Position 1 beim einen, Position 2 beim\nanderen ist genau das Ergebnis, für das man mehrere Lieferanten fragt."},"PurchaseSuggestionParameterSet-suggestion_param_set.read":{"type":"object","description":"Gespeicherte Parameter-Sets für den Bestellvorschlag (Doc 25 AP 7.2, B2 (b)).\n\nEin Set gehört seinem Anleger. Sichtbar sind die eigenen plus die ausdrücklich geteilten —\nändern und löschen darf nur der Eigentümer, auch bei einem geteilten Set: „geteilt\" heißt\nmitbenutzen, nicht mitverwalten.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"type":["string","null"]},"parameters":{"description":"Der Parametersatz — dieselben Schlüssel wie beim Lauf.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isShared":{"description":"Für alle mit Vorschlags-Recht sichtbar (ändern bleibt beim Anleger).","type":["boolean","null"]},"brandId":{"type":["integer","null"]},"ownerUlid":{"description":"ULID des Anlegers — nur lesbar; ein Set wechselt nicht den Eigentümer.","type":["string","null"]},"isOwn":{"description":"Gehört das Set der aufrufenden Person? Steuert die Bearbeitbarkeit in der Oberfläche.","type":["boolean","null"]},"createdAt":{"type":["string","null"]}}},"PurchaseSuggestionParameterSet-suggestion_param_set.write":{"type":"object","description":"Gespeicherte Parameter-Sets für den Bestellvorschlag (Doc 25 AP 7.2, B2 (b)).\n\nEin Set gehört seinem Anleger. Sichtbar sind die eigenen plus die ausdrücklich geteilten —\nändern und löschen darf nur der Eigentümer, auch bei einem geteilten Set: „geteilt\" heißt\nmitbenutzen, nicht mitverwalten.","properties":{"name":{"maxLength":120,"type":["string","null"]},"parameters":{"description":"Der Parametersatz — dieselben Schlüssel wie beim Lauf.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isShared":{"description":"Für alle mit Vorschlags-Recht sichtbar (ändern bleibt beim Anleger).","type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"PurchaseSuggestionParameterSet-suggestion_param_set.write.jsonMergePatch":{"type":"object","description":"Gespeicherte Parameter-Sets für den Bestellvorschlag (Doc 25 AP 7.2, B2 (b)).\n\nEin Set gehört seinem Anleger. Sichtbar sind die eigenen plus die ausdrücklich geteilten —\nändern und löschen darf nur der Eigentümer, auch bei einem geteilten Set: „geteilt\" heißt\nmitbenutzen, nicht mitverwalten.","properties":{"name":{"maxLength":120,"type":["string","null"]},"parameters":{"description":"Der Parametersatz — dieselben Schlüssel wie beim Lauf.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isShared":{"description":"Für alle mit Vorschlags-Recht sichtbar (ändern bleibt beim Anleger).","type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"PurchaseSuggestionParameterSet.jsonld-suggestion_param_set.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"type":["string","null"]},"parameters":{"description":"Der Parametersatz — dieselben Schlüssel wie beim Lauf.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isShared":{"description":"Für alle mit Vorschlags-Recht sichtbar (ändern bleibt beim Anleger).","type":["boolean","null"]},"brandId":{"type":["integer","null"]},"ownerUlid":{"description":"ULID des Anlegers — nur lesbar; ein Set wechselt nicht den Eigentümer.","type":["string","null"]},"isOwn":{"description":"Gehört das Set der aufrufenden Person? Steuert die Bearbeitbarkeit in der Oberfläche.","type":["boolean","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Gespeicherte Parameter-Sets für den Bestellvorschlag (Doc 25 AP 7.2, B2 (b)).\n\nEin Set gehört seinem Anleger. Sichtbar sind die eigenen plus die ausdrücklich geteilten —\nändern und löschen darf nur der Eigentümer, auch bei einem geteilten Set: „geteilt\" heißt\nmitbenutzen, nicht mitverwalten."},"PurchaseSuggestionRun-suggestion_run.read":{"type":"object","description":"Bestellvorschlags-Läufe (Doc 25 AP 7.2, B2 (a)/(b)).\n\nEin Lauf rechnet und wird abgelegt — er bestellt nicht. Der Endgate verlangt, dass eine Zeile\nREPRODUZIERBAR ist: „warum stand da 40?\" muss auch nächste Woche beantwortbar sein. Deshalb\nliegen Parameter UND jede Zwischengröße am Lauf; er ist ein Protokoll, kein Stammdatensatz.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"parameters":{"description":"Der Parametersatz, mit dem gerechnet wurde (auch beim Schreiben die Eingabe).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"lines":{"description":"Ergebniszeilen: `{productId, description, supplierRoleId, suggestedQty, explanation}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"lineCount":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"PurchaseSuggestionRun-suggestion_run.write":{"type":"object","description":"Bestellvorschlags-Läufe (Doc 25 AP 7.2, B2 (a)/(b)).\n\nEin Lauf rechnet und wird abgelegt — er bestellt nicht. Der Endgate verlangt, dass eine Zeile\nREPRODUZIERBAR ist: „warum stand da 40?\" muss auch nächste Woche beantwortbar sein. Deshalb\nliegen Parameter UND jede Zwischengröße am Lauf; er ist ein Protokoll, kein Stammdatensatz.","properties":{"parameters":{"description":"Der Parametersatz, mit dem gerechnet wurde (auch beim Schreiben die Eingabe).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"parameterSetUlid":{"description":"Gespeichertes Parameter-Set als Grundlage (Doc 25 AP 7.2); `parameters` überschreibt es\nfeldweise.","type":["string","null"]},"brandId":{"type":["integer","null"]}}},"PurchaseSuggestionRun.jsonld-suggestion_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"parameters":{"description":"Der Parametersatz, mit dem gerechnet wurde (auch beim Schreiben die Eingabe).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"lines":{"description":"Ergebniszeilen: `{productId, description, supplierRoleId, suggestedQty, explanation}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"lineCount":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}}],"description":"Bestellvorschlags-Läufe (Doc 25 AP 7.2, B2 (a)/(b)).\n\nEin Lauf rechnet und wird abgelegt — er bestellt nicht. Der Endgate verlangt, dass eine Zeile\nREPRODUZIERBAR ist: „warum stand da 40?\" muss auch nächste Woche beantwortbar sein. Deshalb\nliegen Parameter UND jede Zwischengröße am Lauf; er ist ein Protokoll, kein Stammdatensatz."},"PurchasingList-purchasing_list.read":{"type":"object","description":"Einkaufsliste (Doc 25 AP 7.2, B2 (b)) — das Sammelobjekt zwischen Rechnung und Bestellung.\n\nDort findet die Arbeit statt, die der Einkauf wirklich tut: über mehrere Läufe sammeln, Mengen\nanfassen, Positionen streichen, erst dann losschicken. `add-from-run` trägt die\n`replace`-vs-`add`-Semantik ausdrücklich im Aufruf — still das Falsche zu tun heißt entweder\nverlorene Handarbeit oder doppelte Mengen.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"type":["string","null"]},"status":{"description":"open|ordered|cancelled (read-only — gesetzt wird über `convert`).","type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen: `{ulid, productId, description, qty, supplierRoleId, sourceWarehouseId, targetWarehouseId, explanation}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdOrderUlids":{"description":"ULIDs der erzeugten Entwurfs-Bestellungen (nur in der Antwort auf `convert`).","type":["array","null"],"items":{"type":"string"}},"createdTransferCount":{"description":"Anzahl der erzeugten Umlagerungs-Entwürfe (nur in der Antwort auf `convert`).","type":["integer","null"]}}},"PurchasingList-purchasing_list.write":{"type":"object","description":"Einkaufsliste (Doc 25 AP 7.2, B2 (b)) — das Sammelobjekt zwischen Rechnung und Bestellung.\n\nDort findet die Arbeit statt, die der Einkauf wirklich tut: über mehrere Läufe sammeln, Mengen\nanfassen, Positionen streichen, erst dann losschicken. `add-from-run` trägt die\n`replace`-vs-`add`-Semantik ausdrücklich im Aufruf — still das Falsche zu tun heißt entweder\nverlorene Handarbeit oder doppelte Mengen.","properties":{"name":{"maxLength":120,"type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen: `{ulid, productId, description, qty, supplierRoleId, sourceWarehouseId, targetWarehouseId, explanation}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PurchasingList-purchasing_list.write.jsonMergePatch":{"type":"object","description":"Einkaufsliste (Doc 25 AP 7.2, B2 (b)) — das Sammelobjekt zwischen Rechnung und Bestellung.\n\nDort findet die Arbeit statt, die der Einkauf wirklich tut: über mehrere Läufe sammeln, Mengen\nanfassen, Positionen streichen, erst dann losschicken. `add-from-run` trägt die\n`replace`-vs-`add`-Semantik ausdrücklich im Aufruf — still das Falsche zu tun heißt entweder\nverlorene Handarbeit oder doppelte Mengen.","properties":{"name":{"maxLength":120,"type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen: `{ulid, productId, description, qty, supplierRoleId, sourceWarehouseId, targetWarehouseId, explanation}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"PurchasingList.jsonld-purchasing_list.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"type":["string","null"]},"status":{"description":"open|ordered|cancelled (read-only — gesetzt wird über `convert`).","type":["string","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"items":{"description":"Positionen: `{ulid, productId, description, qty, supplierRoleId, sourceWarehouseId, targetWarehouseId, explanation}`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"createdOrderUlids":{"description":"ULIDs der erzeugten Entwurfs-Bestellungen (nur in der Antwort auf `convert`).","type":["array","null"],"items":{"type":"string"}},"createdTransferCount":{"description":"Anzahl der erzeugten Umlagerungs-Entwürfe (nur in der Antwort auf `convert`).","type":["integer","null"]}}}],"description":"Einkaufsliste (Doc 25 AP 7.2, B2 (b)) — das Sammelobjekt zwischen Rechnung und Bestellung.\n\nDort findet die Arbeit statt, die der Einkauf wirklich tut: über mehrere Läufe sammeln, Mengen\nanfassen, Positionen streichen, erst dann losschicken. `add-from-run` trägt die\n`replace`-vs-`add`-Semantik ausdrücklich im Aufruf — still das Falsche zu tun heißt entweder\nverlorene Handarbeit oder doppelte Mengen."},"PutawaySuggestion-putaway_suggestion.read":{"type":"object","description":"Platzvorschlag der Einlagerung (Doc 25 AP 4.8, B1 (c)).\n\nOhne `productId` beantwortet die Operation die vorgelagerte Frage: **was liegt überhaupt noch\nherum** — also welche Artikel im Lager Bestand haben, der keinem Platz zugeordnet ist. Mit\n`productId` liefert sie die Platz-Empfehlung für genau diesen Artikel.\n\nDer Vorschlag ist eine Empfehlung. Gebucht wird der Platz, der wirklich gescannt wurde.","properties":{"id":{"description":"Synthetischer Identifier `<productId>-<binId>` (Auswertung, keine Entität).","default":"","type":"string"},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"sku":{"type":["string","null"]},"unplacedQty":{"description":"Noch nicht verortete Menge dieses Artikels im Lager.","type":["integer","null"]},"binId":{"description":"Vorgeschlagener Platz (null in der Übersicht ohne `productId`).","type":["integer","null"]},"binCode":{"type":["string","null"]},"binType":{"type":["string","null"]},"binQty":{"description":"Menge, die an diesem Platz bereits liegt.","type":["integer","null"]},"reason":{"description":"Warum dieser Platz: `default_bin` · `existing_stock` · `free`.","type":["string","null"]}}},"PutawaySuggestion.jsonld-putaway_suggestion.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Synthetischer Identifier `<productId>-<binId>` (Auswertung, keine Entität).","default":"","type":"string"},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"sku":{"type":["string","null"]},"unplacedQty":{"description":"Noch nicht verortete Menge dieses Artikels im Lager.","type":["integer","null"]},"binId":{"description":"Vorgeschlagener Platz (null in der Übersicht ohne `productId`).","type":["integer","null"]},"binCode":{"type":["string","null"]},"binType":{"type":["string","null"]},"binQty":{"description":"Menge, die an diesem Platz bereits liegt.","type":["integer","null"]},"reason":{"description":"Warum dieser Platz: `default_bin` · `existing_stock` · `free`.","type":["string","null"]}}}],"description":"Platzvorschlag der Einlagerung (Doc 25 AP 4.8, B1 (c)).\n\nOhne `productId` beantwortet die Operation die vorgelagerte Frage: **was liegt überhaupt noch\nherum** — also welche Artikel im Lager Bestand haben, der keinem Platz zugeordnet ist. Mit\n`productId` liefert sie die Platz-Empfehlung für genau diesen Artikel.\n\nDer Vorschlag ist eine Empfehlung. Gebucht wird der Platz, der wirklich gescannt wurde."},"QueueHealth-queue_health.read":{"type":"object","description":"Betriebs-Monitoring der Messenger-Queues (Audit R21 PAR-6, P-1/P-2).\n- Read-only Health der Transports (async/webhooks/outbox/failed); CLI-Pendant {@see \\App\\Platform\\Integration\\Command\\FailedQueueReportCommand} bleibt Cron-Alarm-Kanal.\n- `messageCount` null, wenn Transport nicht zählbar (kein {@see \\Symfony\\Component\\Messenger\\Transport\\Receiver\\MessageCountAwareInterface}) — bewusst kein Fehler.\n- `status` 'degraded' bei Einträgen in failed-Queue oder Backlog über Schwelle, sonst 'ok'.\n- Ein-Element-Collection (Muster LicenseSummary/Search). GET /health (anonymer Ping) unberührt.","properties":{"id":{"type":["string","null"]},"transports":{"description":"Alle bekannten Transports mit ihrer aktuellen Message-Anzahl (null = nicht zählbar).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"failedCount":{"description":"Anzahl endgültig fehlgeschlagener Messages auf dem failure-Transport (null = nicht zählbar).","type":["integer","null"]},"status":{"description":"'ok' oder 'degraded' (failed-Queue nicht leer bzw. zählbarer Backlog über der Schwelle).","default":"ok","type":"string"},"backlogThreshold":{"description":"Backlog-Schwelle, ab der ein Transport als 'degraded' zählt.","default":0,"type":"integer"},"generatedAt":{"description":"Erzeugungszeitpunkt der Momentaufnahme (ATOM).","type":["string","null"]}}},"QueueHealth.jsonld-queue_health.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"transports":{"description":"Alle bekannten Transports mit ihrer aktuellen Message-Anzahl (null = nicht zählbar).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}},"failedCount":{"description":"Anzahl endgültig fehlgeschlagener Messages auf dem failure-Transport (null = nicht zählbar).","type":["integer","null"]},"status":{"description":"'ok' oder 'degraded' (failed-Queue nicht leer bzw. zählbarer Backlog über der Schwelle).","default":"ok","type":"string"},"backlogThreshold":{"description":"Backlog-Schwelle, ab der ein Transport als 'degraded' zählt.","default":0,"type":"integer"},"generatedAt":{"description":"Erzeugungszeitpunkt der Momentaufnahme (ATOM).","type":["string","null"]}}}],"description":"Betriebs-Monitoring der Messenger-Queues (Audit R21 PAR-6, P-1/P-2).\n- Read-only Health der Transports (async/webhooks/outbox/failed); CLI-Pendant {@see \\App\\Platform\\Integration\\Command\\FailedQueueReportCommand} bleibt Cron-Alarm-Kanal.\n- `messageCount` null, wenn Transport nicht zählbar (kein {@see \\Symfony\\Component\\Messenger\\Transport\\Receiver\\MessageCountAwareInterface}) — bewusst kein Fehler.\n- `status` 'degraded' bei Einträgen in failed-Queue oder Backlog über Schwelle, sonst 'ok'.\n- Ein-Element-Collection (Muster LicenseSummary/Search). GET /health (anonymer Ping) unberührt."},"Quote-quote.read":{"type":"object","description":"Angebots-Resource (04-06 §5). CRUD + Workflow-Aktionen (send/accept/reject/convert).\nPositionen eingebettet (`items`), Bepreisung via LineCalculator beim Speichern.\nSummen read-only; Nummer erst beim Versand vergeben.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — u. a. entityId für den polymorphen Benutzerfeld-Editor.","type":["integer","null"]},"number":{"type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"dealId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"status":{"type":["string","null"]},"editable":{"description":"Editierbar bis Endzustand (Katalog-`category` ∈ {done, cancelled}); SSoT fürs Frontend-Gating.","type":["boolean","null"]},"itemsEditable":{"description":"Positionen editierbar; beim Angebot deckungsgleich mit {@see $editable}.","type":["boolean","null"]},"title":{"maxLength":255,"type":["string","null"]},"validUntil":{"type":["string","null"]},"introText":{"maxLength":10000,"type":["string","null"]},"terms":{"maxLength":10000,"type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland, ohne USt).","type":["string","null"]},"currency":{"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieses Belegs stehen in ihr; ohne\naktive Mehrwährung ist alles ausser `EUR` ein 422.","type":["string","null"]},"fxRate":{"description":"Eingefrorener Umrechnungskurs (Fremdwährungseinheiten je 1 EUR); EUR-Beleg → \"1.00000000\".","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Angebots-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"shareToken":{"description":"Nur in der Share-Antwort gesetzt: Token des trackbaren Freigabe-Links (Doc 26 8.1).","type":["string","null"]},"signed":{"description":"Klick-Signatur (Doc 26 8.2): Zeitpunkt + Evidenz-Nachweis, sofern signiert.","default":false,"type":"boolean"},"signedAt":{"type":["string","null"]},"signatureEvidenceHash":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"acceptedAt":{"type":["string","null"]},"convertedAt":{"type":["string","null"]},"createdAt":{"description":"Anlagedatum (Belegdatum der Maske) — read-only, ATOM.","type":["string","null"]},"items":{"description":"Positionen (Schreiben): itemType?(article|text|heading|subtotal|separator|pagebreak), description,\nlongText?, isOptional?, productId?, variantId?, qty, unit?, unitPriceAmount, discountPercent?,\ndiscountAmount?, taxRate?, taxCategory?. Struktur-Typen (text/heading/subtotal/separator/pagebreak):\nkein Preis, nicht in Summe. Lesen: zusätzlich lineNetAmount/lineTaxAmount/lineGrossAmount.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"availableOutputWays":{"description":"Ausgabewege, die dieser Beleg anbieten kann (Doc 40 Stufe 6) — nur an der Einzelansicht\ngefüllt; die Oberfläche schaltet daran ihre Schalter scharf.","type":["array","null"],"items":{"type":"string"}},"standingAttachments":{"description":"Feste Beleg-Beilagen, die an diesem Beleg automatisch mitgehen (Doc 40) — nur an der\nEinzelansicht gefüllt, damit der Abschluss-Dialog sie zeigen kann.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"Quote-quote.write":{"type":"object","description":"Angebots-Resource (04-06 §5). CRUD + Workflow-Aktionen (send/accept/reject/convert).\nPositionen eingebettet (`items`), Bepreisung via LineCalculator beim Speichern.\nSummen read-only; Nummer erst beim Versand vergeben.","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"dealId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"title":{"maxLength":255,"type":["string","null"]},"validUntil":{"type":["string","null"]},"introText":{"maxLength":10000,"type":["string","null"]},"terms":{"maxLength":10000,"type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland, ohne USt).","type":["string","null"]},"currency":{"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieses Belegs stehen in ihr; ohne\naktive Mehrwährung ist alles ausser `EUR` ein 422.","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Angebots-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"items":{"description":"Positionen (Schreiben): itemType?(article|text|heading|subtotal|separator|pagebreak), description,\nlongText?, isOptional?, productId?, variantId?, qty, unit?, unitPriceAmount, discountPercent?,\ndiscountAmount?, taxRate?, taxCategory?. Struktur-Typen (text/heading/subtotal/separator/pagebreak):\nkein Preis, nicht in Summe. Lesen: zusätzlich lineNetAmount/lineTaxAmount/lineGrossAmount.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"reason":{"description":"Ablehnungsgrund (reject-Aktion).","type":["string","null"]},"createProject":{"description":"Projekt mit überführen (convert-Aktion; Default true).","type":["boolean","null"]},"createLicenses":{"description":"Lizenzpositionen mit überführen (convert-Aktion; Default true).","type":["boolean","null"]},"createContract":{"description":"Vertrags-Entwurf mit überführen — One-Click „Angebot → Vertrag\" (convert-Aktion; Default false).","type":["boolean","null"]},"dispatch":{"description":"Belegausgabe der send-Aktion (Doc 40 Stufe 5, ENT-BELEG-04) — ohne Angabe bleibt es beim\nbisherigen Weg (Mail an den Kunden-Hauptkontakt mit der Standardvorlage).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"Quote-quote.write.jsonMergePatch":{"type":"object","description":"Angebots-Resource (04-06 §5). CRUD + Workflow-Aktionen (send/accept/reject/convert).\nPositionen eingebettet (`items`), Bepreisung via LineCalculator beim Speichern.\nSummen read-only; Nummer erst beim Versand vergeben.","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"dealId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"title":{"maxLength":255,"type":["string","null"]},"validUntil":{"type":["string","null"]},"introText":{"maxLength":10000,"type":["string","null"]},"terms":{"maxLength":10000,"type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland, ohne USt).","type":["string","null"]},"currency":{"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieses Belegs stehen in ihr; ohne\naktive Mehrwährung ist alles ausser `EUR` ein 422.","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Angebots-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"items":{"description":"Positionen (Schreiben): itemType?(article|text|heading|subtotal|separator|pagebreak), description,\nlongText?, isOptional?, productId?, variantId?, qty, unit?, unitPriceAmount, discountPercent?,\ndiscountAmount?, taxRate?, taxCategory?. Struktur-Typen (text/heading/subtotal/separator/pagebreak):\nkein Preis, nicht in Summe. Lesen: zusätzlich lineNetAmount/lineTaxAmount/lineGrossAmount.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"reason":{"description":"Ablehnungsgrund (reject-Aktion).","type":["string","null"]},"createProject":{"description":"Projekt mit überführen (convert-Aktion; Default true).","type":["boolean","null"]},"createLicenses":{"description":"Lizenzpositionen mit überführen (convert-Aktion; Default true).","type":["boolean","null"]},"createContract":{"description":"Vertrags-Entwurf mit überführen — One-Click „Angebot → Vertrag\" (convert-Aktion; Default false).","type":["boolean","null"]},"dispatch":{"description":"Belegausgabe der send-Aktion (Doc 40 Stufe 5, ENT-BELEG-04) — ohne Angabe bleibt es beim\nbisherigen Weg (Mail an den Kunden-Hauptkontakt mit der Standardvorlage).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"Quote.jsonld-quote.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — u. a. entityId für den polymorphen Benutzerfeld-Editor.","type":["integer","null"]},"number":{"type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"dealId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"status":{"type":["string","null"]},"editable":{"description":"Editierbar bis Endzustand (Katalog-`category` ∈ {done, cancelled}); SSoT fürs Frontend-Gating.","type":["boolean","null"]},"itemsEditable":{"description":"Positionen editierbar; beim Angebot deckungsgleich mit {@see $editable}.","type":["boolean","null"]},"title":{"maxLength":255,"type":["string","null"]},"validUntil":{"type":["string","null"]},"introText":{"maxLength":10000,"type":["string","null"]},"terms":{"maxLength":10000,"type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland, ohne USt).","type":["string","null"]},"currency":{"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieses Belegs stehen in ihr; ohne\naktive Mehrwährung ist alles ausser `EUR` ein 422.","type":["string","null"]},"fxRate":{"description":"Eingefrorener Umrechnungskurs (Fremdwährungseinheiten je 1 EUR); EUR-Beleg → \"1.00000000\".","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Belegvorlage für das Angebots-PDF (15 §7); null → Marken-Standard/Fallback-Layout.","type":["integer","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"shareToken":{"description":"Nur in der Share-Antwort gesetzt: Token des trackbaren Freigabe-Links (Doc 26 8.1).","type":["string","null"]},"signed":{"description":"Klick-Signatur (Doc 26 8.2): Zeitpunkt + Evidenz-Nachweis, sofern signiert.","default":false,"type":"boolean"},"signedAt":{"type":["string","null"]},"signatureEvidenceHash":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"acceptedAt":{"type":["string","null"]},"convertedAt":{"type":["string","null"]},"createdAt":{"description":"Anlagedatum (Belegdatum der Maske) — read-only, ATOM.","type":["string","null"]},"items":{"description":"Positionen (Schreiben): itemType?(article|text|heading|subtotal|separator|pagebreak), description,\nlongText?, isOptional?, productId?, variantId?, qty, unit?, unitPriceAmount, discountPercent?,\ndiscountAmount?, taxRate?, taxCategory?. Struktur-Typen (text/heading/subtotal/separator/pagebreak):\nkein Preis, nicht in Summe. Lesen: zusätzlich lineNetAmount/lineTaxAmount/lineGrossAmount.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"availableOutputWays":{"description":"Ausgabewege, die dieser Beleg anbieten kann (Doc 40 Stufe 6) — nur an der Einzelansicht\ngefüllt; die Oberfläche schaltet daran ihre Schalter scharf.","type":["array","null"],"items":{"type":"string"}},"standingAttachments":{"description":"Feste Beleg-Beilagen, die an diesem Beleg automatisch mitgehen (Doc 40) — nur an der\nEinzelansicht gefüllt, damit der Abschluss-Dialog sie zeigen kann.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}}],"description":"Angebots-Resource (04-06 §5). CRUD + Workflow-Aktionen (send/accept/reject/convert).\nPositionen eingebettet (`items`), Bepreisung via LineCalculator beim Speichern.\nSummen read-only; Nummer erst beim Versand vergeben."},"QuoteExpiryRun-quote_expiry_run.read":{"type":"object","description":"`POST /v1/quotes/expiry-run` — API-Pendant zu `finance:expire-quotes` (Audit R21 PAR-5: zuvor nur CLI/Cron).\nNutzt {@see \\Octi\\Plugin\\Quote\\Service\\QuoteExpiryService::expireDue()} unter demselben\n`default-schedule`-Lock wie Scheduler/CLI (belegt → 409).\nLiteral `expiry-run` kollidiert nicht mit `{ulid}`-Routen (nur suffigiert, z. B. `…/{ulid}/send`).","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"QuoteExpiryRun-quote_expiry_run.write":{"type":"object","description":"`POST /v1/quotes/expiry-run` — API-Pendant zu `finance:expire-quotes` (Audit R21 PAR-5: zuvor nur CLI/Cron).\nNutzt {@see \\Octi\\Plugin\\Quote\\Service\\QuoteExpiryService::expireDue()} unter demselben\n`default-schedule`-Lock wie Scheduler/CLI (belegt → 409).\nLiteral `expiry-run` kollidiert nicht mit `{ulid}`-Routen (nur suffigiert, z. B. `…/{ulid}/send`).","properties":{"asOfDate":{"description":"Optionaler Stichtag (YYYY-MM-DD); ohne Angabe heute — wie `finance:expire-quotes --date`.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]}}},"QuoteExpiryRun.jsonld-quote_expiry_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"`POST /v1/quotes/expiry-run` — API-Pendant zu `finance:expire-quotes` (Audit R21 PAR-5: zuvor nur CLI/Cron).\nNutzt {@see \\Octi\\Plugin\\Quote\\Service\\QuoteExpiryService::expireDue()} unter demselben\n`default-schedule`-Lock wie Scheduler/CLI (belegt → 409).\nLiteral `expiry-run` kollidiert nicht mit `{ulid}`-Routen (nur suffigiert, z. B. `…/{ulid}/send`)."},"QuoteStatus-quote_status.read":{"type":"object","description":"Angebots-Status als Daten (04-06 §3), konfigurierbar ohne Code.\n`key` == Quote::STATUS_*-Konstanten; `category` = Lebenszyklus-Phase (open/active/done/cancelled).","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"QuoteStatus-quote_status.update.jsonMergePatch":{"type":"object","description":"Angebots-Status als Daten (04-06 §3), konfigurierbar ohne Code.\n`key` == Quote::STATUS_*-Konstanten; `category` = Lebenszyklus-Phase (open/active/done/cancelled).","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"QuoteStatus-quote_status.write":{"type":"object","description":"Angebots-Status als Daten (04-06 §3), konfigurierbar ohne Code.\n`key` == Quote::STATUS_*-Konstanten; `category` = Lebenszyklus-Phase (open/active/done/cancelled).","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"QuoteStatus.jsonld-quote_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Angebots-Status als Daten (04-06 §3), konfigurierbar ohne Code.\n`key` == Quote::STATUS_*-Konstanten; `category` = Lebenszyklus-Phase (open/active/done/cancelled)."},"QuoteSummary-quote_summary.read":{"type":"object","description":"Angebots-Kennzahl-Aggregat für die Liste (Perf, Muster\n{@see \\Octi\\Plugin\\Contract\\ApiResource\\ContractSummaryResource}): offene Gesamtsumme (Status\ndraft|sent) über den GESAMTbestand, nicht nur die geladene Seite. Ersetzt frühere clientseitige\n`listAll`-Reduktion (stille 5000er-Truncation). Read-only, markenscope-gefiltert, Ein-Element-Collection.","properties":{"id":{"type":["string","null"]},"openTotalAmount":{"description":"Offene Gesamtsumme in Cent (Status draft|sent, nicht gelöscht) im Marken-Scope: SUM(totalAmount).","type":["integer","null"]},"openCount":{"description":"Anzahl offener Angebote (Status draft|sent, nicht gelöscht) im Marken-Scope.","type":["integer","null"]}}},"QuoteSummary.jsonld-quote_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"openTotalAmount":{"description":"Offene Gesamtsumme in Cent (Status draft|sent, nicht gelöscht) im Marken-Scope: SUM(totalAmount).","type":["integer","null"]},"openCount":{"description":"Anzahl offener Angebote (Status draft|sent, nicht gelöscht) im Marken-Scope.","type":["integer","null"]}}}],"description":"Angebots-Kennzahl-Aggregat für die Liste (Perf, Muster\n{@see \\Octi\\Plugin\\Contract\\ApiResource\\ContractSummaryResource}): offene Gesamtsumme (Status\ndraft|sent) über den GESAMTbestand, nicht nur die geladene Seite. Ersetzt frühere clientseitige\n`listAll`-Reduktion (stille 5000er-Truncation). Read-only, markenscope-gefiltert, Ein-Element-Collection."},"QuoteTextTemplate-quote_text_template.read":{"type":"object","description":"Wiederverwendbarer Angebots-Textbaustein (Einleitung/Footer) mit Standard-Markierung.\nLesen: jeder Angebots-Bearbeiter; Pflege: Finance-Konfiguration. Inhalt serverseitig sanitisiert.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":150,"type":["string","null"]},"category":{"enum":["intro","footer"],"description":"intro|footer.","type":["string","null"]},"content":{"maxLength":50000,"description":"Rich-Text/HTML; wird serverseitig sanitisiert.","type":["string","null"]},"brandId":{"description":"null = markenübergreifend (Fallback für alle Marken).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["name","category"]},"QuoteTextTemplate-quote_text_template.write":{"type":"object","description":"Wiederverwendbarer Angebots-Textbaustein (Einleitung/Footer) mit Standard-Markierung.\nLesen: jeder Angebots-Bearbeiter; Pflege: Finance-Konfiguration. Inhalt serverseitig sanitisiert.","required":["name","category"],"properties":{"name":{"maxLength":150,"type":["string","null"]},"category":{"enum":["intro","footer"],"description":"intro|footer.","type":["string","null"]},"content":{"maxLength":50000,"description":"Rich-Text/HTML; wird serverseitig sanitisiert.","type":["string","null"]},"brandId":{"description":"null = markenübergreifend (Fallback für alle Marken).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"QuoteTextTemplate-quote_text_template.write.jsonMergePatch":{"type":"object","description":"Wiederverwendbarer Angebots-Textbaustein (Einleitung/Footer) mit Standard-Markierung.\nLesen: jeder Angebots-Bearbeiter; Pflege: Finance-Konfiguration. Inhalt serverseitig sanitisiert.","properties":{"name":{"maxLength":150,"type":["string","null"]},"category":{"enum":["intro","footer"],"description":"intro|footer.","type":["string","null"]},"content":{"maxLength":50000,"description":"Rich-Text/HTML; wird serverseitig sanitisiert.","type":["string","null"]},"brandId":{"description":"null = markenübergreifend (Fallback für alle Marken).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}}},"QuoteTextTemplate.jsonld-quote_text_template.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":150,"type":["string","null"]},"category":{"enum":["intro","footer"],"description":"intro|footer.","type":["string","null"]},"content":{"maxLength":50000,"description":"Rich-Text/HTML; wird serverseitig sanitisiert.","type":["string","null"]},"brandId":{"description":"null = markenübergreifend (Fallback für alle Marken).","type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]}},"required":["name","category"]}],"description":"Wiederverwendbarer Angebots-Textbaustein (Einleitung/Footer) mit Standard-Markierung.\nLesen: jeder Angebots-Bearbeiter; Pflege: Finance-Konfiguration. Inhalt serverseitig sanitisiert."},"RecurringBillingPlan-rbp.read":{"type":"object","description":"Wiederkehrender Abrechnungsplan (04-06 §4.3).\n- meist automatisch aus aktivierten Lizenzen (Modul 07); manuell für Verträge/Pauschalen\n- pause/resume/end steuern den Lauf; Betrag in Cent (Netto je Zyklus).","properties":{"ulid":{"type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"status":{"type":["string","null"]},"cycle":{"enum":["monthly","quarterly","yearly"],"description":"monthly | quarterly | yearly.","type":["string","null"]},"anchorDay":{"minimum":1,"maximum":31,"type":["integer","null"]},"nextRunAt":{"type":["string","null"]},"lastRunAt":{"type":["string","null"]},"amountAmount":{"minimum":0,"description":"Netto je Zyklus in Cent.","type":["integer","null"]},"sourceType":{"type":["string","null"]},"licenseId":{"type":["integer","null"]},"contractId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"priceIndexNote":{"maxLength":255,"type":["string","null"]}}},"RecurringBillingPlan-rbp.write":{"type":"object","description":"Wiederkehrender Abrechnungsplan (04-06 §4.3).\n- meist automatisch aus aktivierten Lizenzen (Modul 07); manuell für Verträge/Pauschalen\n- pause/resume/end steuern den Lauf; Betrag in Cent (Netto je Zyklus).","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"cycle":{"enum":["monthly","quarterly","yearly"],"description":"monthly | quarterly | yearly.","type":["string","null"]},"anchorDay":{"minimum":1,"maximum":31,"type":["integer","null"]},"amountAmount":{"minimum":0,"description":"Netto je Zyklus in Cent.","type":["integer","null"]},"contractId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"priceIndexNote":{"maxLength":255,"type":["string","null"]}}},"RecurringBillingPlan-rbp.write.jsonMergePatch":{"type":"object","description":"Wiederkehrender Abrechnungsplan (04-06 §4.3).\n- meist automatisch aus aktivierten Lizenzen (Modul 07); manuell für Verträge/Pauschalen\n- pause/resume/end steuern den Lauf; Betrag in Cent (Netto je Zyklus).","properties":{"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"cycle":{"enum":["monthly","quarterly","yearly"],"description":"monthly | quarterly | yearly.","type":["string","null"]},"anchorDay":{"minimum":1,"maximum":31,"type":["integer","null"]},"amountAmount":{"minimum":0,"description":"Netto je Zyklus in Cent.","type":["integer","null"]},"contractId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"priceIndexNote":{"maxLength":255,"type":["string","null"]}}},"RecurringBillingPlan.jsonld-rbp.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"type":["integer","null"]},"status":{"type":["string","null"]},"cycle":{"enum":["monthly","quarterly","yearly"],"description":"monthly | quarterly | yearly.","type":["string","null"]},"anchorDay":{"minimum":1,"maximum":31,"type":["integer","null"]},"nextRunAt":{"type":["string","null"]},"lastRunAt":{"type":["string","null"]},"amountAmount":{"minimum":0,"description":"Netto je Zyklus in Cent.","type":["integer","null"]},"sourceType":{"type":["string","null"]},"licenseId":{"type":["integer","null"]},"contractId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"priceIndexNote":{"maxLength":255,"type":["string","null"]}}}],"description":"Wiederkehrender Abrechnungsplan (04-06 §4.3).\n- meist automatisch aus aktivierten Lizenzen (Modul 07); manuell für Verträge/Pauschalen\n- pause/resume/end steuern den Lauf; Betrag in Cent (Netto je Zyklus)."},"RecurringBillingRun-recurring_run.read":{"type":"object","description":"Recurring-Abrechnungslauf als API-Aktion (`POST /v1/recurring-billing-plans/run` → {created}).\n- API-Pendant zu `finance:recurring-run`; vorher nur CLI/Cron (Vorbild: POST /v1/invoices/dunning-run)\n- selbe Service-Logik ({@see \\Octi\\Plugin\\Billing\\Service\\BillingPreparationService::processDueRecurring()})\n  unter gleichem `default-schedule`-Lock wie Scheduler/CLI (belegt → 409)\n- ULID-Routen der Plan-Resource matchen das Literal `run` nicht (Format-Requirement).","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"RecurringBillingRun-recurring_run.write":{"type":"object","description":"Recurring-Abrechnungslauf als API-Aktion (`POST /v1/recurring-billing-plans/run` → {created}).\n- API-Pendant zu `finance:recurring-run`; vorher nur CLI/Cron (Vorbild: POST /v1/invoices/dunning-run)\n- selbe Service-Logik ({@see \\Octi\\Plugin\\Billing\\Service\\BillingPreparationService::processDueRecurring()})\n  unter gleichem `default-schedule`-Lock wie Scheduler/CLI (belegt → 409)\n- ULID-Routen der Plan-Resource matchen das Literal `run` nicht (Format-Requirement).","properties":{"asOfDate":{"description":"Optionaler Stichtag (YYYY-MM-DD); ohne Angabe heute — wie `finance:recurring-run --date`.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]}}},"RecurringBillingRun.jsonld-recurring_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"Recurring-Abrechnungslauf als API-Aktion (`POST /v1/recurring-billing-plans/run` → {created}).\n- API-Pendant zu `finance:recurring-run`; vorher nur CLI/Cron (Vorbild: POST /v1/invoices/dunning-run)\n- selbe Service-Logik ({@see \\Octi\\Plugin\\Billing\\Service\\BillingPreparationService::processDueRecurring()})\n  unter gleichem `default-schedule`-Lock wie Scheduler/CLI (belegt → 409)\n- ULID-Routen der Plan-Resource matchen das Literal `run` nicht (Format-Requirement)."},"RecurringInvoice-recurring_invoice.read":{"type":"object","description":"Serienrechnung-Resource (04-21 §8, API-First).\n- CRUD der Vorlage (Kunde/Marke/Zyklus/Positionen) + Lifecycle-Ops: pause/resume/end, „jetzt ausführen\" (`run-now`, respektiert `runMode`).\n- Positionen eingebettet (`items`), beim Speichern als Anzeige-Schätzung bepreist; echte Rechnung entsteht erst beim Serien-Lauf.\n- Status read-only (Übergänge über pause/resume/end); nextRunAt/lastRunAt/generatedCount/Summen abgeleitet.\n- ULID-Requirement verhindert Match auf Literal-Segmente.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"title":{"maxLength":160,"type":["string","null"]},"status":{"description":"Lebenszyklus-Status (read-only — Übergänge über pause/resume/end).","type":["string","null"]},"cycle":{"enum":["weekly","monthly","quarterly","yearly"],"type":["string","null"]},"runMode":{"enum":["draft","auto_issue"],"description":"draft = Lauf legt Entwurf an · auto_issue = Lauf schreibt fest + versendet.","type":["string","null"]},"anchorDay":{"minimum":1,"maximum":28,"type":["integer","null"]},"startDate":{"type":["string","null"]},"endDate":{"type":["string","null"]},"nextRunAt":{"type":["string","null"]},"lastRunAt":{"type":["string","null"]},"generatedCount":{"type":["integer","null"]},"taxMode":{"enum":["standard","small_business","exempt"],"type":["string","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"type":["string","null"]},"paymentTermDays":{"minimum":0,"type":["integer","null"]},"buyerReference":{"maxLength":100,"type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"type":["number","null"]},"documentDiscountAmount":{"minimum":0,"type":["integer","null"]},"subtotalAmount":{"description":"Geschätzte Zyklus-Summen (Anzeige) — beim Lauf frisch bepreist.","type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionsvorlage. Schreiben: Liste von {itemType?, description, longText?, isOptional?, productId?,\nqty, unit?, unitPriceAmount, discountPercent?, discountAmount?, taxRate?, taxCategory?}.","type":["array","null"],"items":{"type":["string","null"]}},"generatedInvoiceUlid":{"description":"Antwort der run-now-Aktion: ULID der erzeugten Rechnung (null, wenn nicht fällig/beendet).","type":["string","null"]}}},"RecurringInvoice-recurring_invoice.write":{"type":"object","description":"Serienrechnung-Resource (04-21 §8, API-First).\n- CRUD der Vorlage (Kunde/Marke/Zyklus/Positionen) + Lifecycle-Ops: pause/resume/end, „jetzt ausführen\" (`run-now`, respektiert `runMode`).\n- Positionen eingebettet (`items`), beim Speichern als Anzeige-Schätzung bepreist; echte Rechnung entsteht erst beim Serien-Lauf.\n- Status read-only (Übergänge über pause/resume/end); nextRunAt/lastRunAt/generatedCount/Summen abgeleitet.\n- ULID-Requirement verhindert Match auf Literal-Segmente.","properties":{"title":{"maxLength":160,"type":["string","null"]},"cycle":{"enum":["weekly","monthly","quarterly","yearly"],"type":["string","null"]},"runMode":{"enum":["draft","auto_issue"],"description":"draft = Lauf legt Entwurf an · auto_issue = Lauf schreibt fest + versendet.","type":["string","null"]},"anchorDay":{"minimum":1,"maximum":28,"type":["integer","null"]},"startDate":{"type":["string","null"]},"endDate":{"type":["string","null"]},"taxMode":{"enum":["standard","small_business","exempt"],"type":["string","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"type":["string","null"]},"paymentTermDays":{"minimum":0,"type":["integer","null"]},"buyerReference":{"maxLength":100,"type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"type":["number","null"]},"documentDiscountAmount":{"minimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionsvorlage. Schreiben: Liste von {itemType?, description, longText?, isOptional?, productId?,\nqty, unit?, unitPriceAmount, discountPercent?, discountAmount?, taxRate?, taxCategory?}.","type":["array","null"],"items":{"type":["string","null"]}}}},"RecurringInvoice-recurring_invoice.write.jsonMergePatch":{"type":"object","description":"Serienrechnung-Resource (04-21 §8, API-First).\n- CRUD der Vorlage (Kunde/Marke/Zyklus/Positionen) + Lifecycle-Ops: pause/resume/end, „jetzt ausführen\" (`run-now`, respektiert `runMode`).\n- Positionen eingebettet (`items`), beim Speichern als Anzeige-Schätzung bepreist; echte Rechnung entsteht erst beim Serien-Lauf.\n- Status read-only (Übergänge über pause/resume/end); nextRunAt/lastRunAt/generatedCount/Summen abgeleitet.\n- ULID-Requirement verhindert Match auf Literal-Segmente.","properties":{"title":{"maxLength":160,"type":["string","null"]},"cycle":{"enum":["weekly","monthly","quarterly","yearly"],"type":["string","null"]},"runMode":{"enum":["draft","auto_issue"],"description":"draft = Lauf legt Entwurf an · auto_issue = Lauf schreibt fest + versendet.","type":["string","null"]},"anchorDay":{"minimum":1,"maximum":28,"type":["integer","null"]},"startDate":{"type":["string","null"]},"endDate":{"type":["string","null"]},"taxMode":{"enum":["standard","small_business","exempt"],"type":["string","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"type":["string","null"]},"paymentTermDays":{"minimum":0,"type":["integer","null"]},"buyerReference":{"maxLength":100,"type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"type":["number","null"]},"documentDiscountAmount":{"minimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionsvorlage. Schreiben: Liste von {itemType?, description, longText?, isOptional?, productId?,\nqty, unit?, unitPriceAmount, discountPercent?, discountAmount?, taxRate?, taxCategory?}.","type":["array","null"],"items":{"type":["string","null"]}}}},"RecurringInvoice.jsonld-recurring_invoice.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"title":{"maxLength":160,"type":["string","null"]},"status":{"description":"Lebenszyklus-Status (read-only — Übergänge über pause/resume/end).","type":["string","null"]},"cycle":{"enum":["weekly","monthly","quarterly","yearly"],"type":["string","null"]},"runMode":{"enum":["draft","auto_issue"],"description":"draft = Lauf legt Entwurf an · auto_issue = Lauf schreibt fest + versendet.","type":["string","null"]},"anchorDay":{"minimum":1,"maximum":28,"type":["integer","null"]},"startDate":{"type":["string","null"]},"endDate":{"type":["string","null"]},"nextRunAt":{"type":["string","null"]},"lastRunAt":{"type":["string","null"]},"generatedCount":{"type":["integer","null"]},"taxMode":{"enum":["standard","small_business","exempt"],"type":["string","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"type":["string","null"]},"paymentTermDays":{"minimum":0,"type":["integer","null"]},"buyerReference":{"maxLength":100,"type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"type":["number","null"]},"documentDiscountAmount":{"minimum":0,"type":["integer","null"]},"subtotalAmount":{"description":"Geschätzte Zyklus-Summen (Anzeige) — beim Lauf frisch bepreist.","type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionsvorlage. Schreiben: Liste von {itemType?, description, longText?, isOptional?, productId?,\nqty, unit?, unitPriceAmount, discountPercent?, discountAmount?, taxRate?, taxCategory?}.","type":["array","null"],"items":{"type":["string","null"]}},"generatedInvoiceUlid":{"description":"Antwort der run-now-Aktion: ULID der erzeugten Rechnung (null, wenn nicht fällig/beendet).","type":["string","null"]}}}],"description":"Serienrechnung-Resource (04-21 §8, API-First).\n- CRUD der Vorlage (Kunde/Marke/Zyklus/Positionen) + Lifecycle-Ops: pause/resume/end, „jetzt ausführen\" (`run-now`, respektiert `runMode`).\n- Positionen eingebettet (`items`), beim Speichern als Anzeige-Schätzung bepreist; echte Rechnung entsteht erst beim Serien-Lauf.\n- Status read-only (Übergänge über pause/resume/end); nextRunAt/lastRunAt/generatedCount/Summen abgeleitet.\n- ULID-Requirement verhindert Match auf Literal-Segmente."},"RecurringPlanSummary-recurring_plan_summary.read":{"type":"object","description":"Abo-Plan-Kennzahl-Aggregat für die Listenansicht (Perf-Muster {@see \\Octi\\Plugin\\Contract\\ApiResource\\ContractSummaryResource}).\n- MRR über ALLE aktiven Pläne (monats-normiert), Gesamtbestand statt geladener Seite\n- ersetzt frühere clientseitige listAll-Reduktion (stille 5000er-Truncation hätte Kennzahl unterschätzt)\n- read-only, markenscope-gefiltert, Ein-Element-Collection.","properties":{"id":{"type":["string","null"]},"mrrAmount":{"description":"MRR in Cent: amountAmount monats-normiert (yearly ÷ 12, quarterly ÷ 3).","type":["integer","null"]},"activeCount":{"description":"Anzahl aktiver Pläne (Status active, nicht gelöscht) im Marken-Scope.","type":["integer","null"]}}},"RecurringPlanSummary.jsonld-recurring_plan_summary.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"mrrAmount":{"description":"MRR in Cent: amountAmount monats-normiert (yearly ÷ 12, quarterly ÷ 3).","type":["integer","null"]},"activeCount":{"description":"Anzahl aktiver Pläne (Status active, nicht gelöscht) im Marken-Scope.","type":["integer","null"]}}}],"description":"Abo-Plan-Kennzahl-Aggregat für die Listenansicht (Perf-Muster {@see \\Octi\\Plugin\\Contract\\ApiResource\\ContractSummaryResource}).\n- MRR über ALLE aktiven Pläne (monats-normiert), Gesamtbestand statt geladener Seite\n- ersetzt frühere clientseitige listAll-Reduktion (stille 5000er-Truncation hätte Kennzahl unterschätzt)\n- read-only, markenscope-gefiltert, Ein-Element-Collection."},"ReorderSuggestion-purchasing_suggestion.read":{"type":"object","description":"Nachbestell-Vorschläge (04-23 §8).\n- Liste (Filter status), Verwerfen je Vorschlag, Bündel-Überführung in Entwurfs-Bestellungen (create-orders, Payload {ulids}).\n- Antwort: erzeugte Bestellungen in `orders` ({ulid, supplierRoleId} je Lieferant).\n- Markenlose Produkt-Stammdaten, kein Brand-Scope.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"productId":{"type":["integer","null"]},"productName":{"description":"Produktname, read-only, serverseitig gebatcht (Audit R20 PERF-2); null wenn OctiProduct inaktiv/entfernt.","type":["string","null"]},"suggestedQty":{"type":["string","null"]},"reason":{"type":["string","null"]},"status":{"description":"open | ordered | dismissed.","type":["string","null"]},"supplierRoleId":{"description":"Vorzugslieferant (04-29-Resolver); null = kein bestellbarer Lieferant bekannt.","type":["integer","null"]},"supplierName":{"description":"Lieferantenname, read-only, serverseitig gebatcht (Audit R20 PERF-2); null wenn OctiSuppliers inaktiv oder unbekannt.","type":["string","null"]},"goodsOrderId":{"type":["integer","null"]},"createdAt":{"description":"Anlagedatum (ISO-8601) — Listenspalte + Default-Sortierung der Vorschlagsliste.","type":["string","null"]},"orders":{"description":"Nur create-orders (Antwort): erzeugte Entwurfs-Bestellungen je Lieferant.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}},"ReorderSuggestion-purchasing_suggestion.write":{"type":"object","description":"Nachbestell-Vorschläge (04-23 §8).\n- Liste (Filter status), Verwerfen je Vorschlag, Bündel-Überführung in Entwurfs-Bestellungen (create-orders, Payload {ulids}).\n- Antwort: erzeugte Bestellungen in `orders` ({ulid, supplierRoleId} je Lieferant).\n- Markenlose Produkt-Stammdaten, kein Brand-Scope.","properties":{"ulids":{"description":"Nur create-orders (Payload): ULIDs der offenen Vorschläge; Processor validiert defensiv.","type":["array","null"],"items":{"type":["string","null"]}}}},"ReorderSuggestion.jsonld-purchasing_suggestion.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"productId":{"type":["integer","null"]},"productName":{"description":"Produktname, read-only, serverseitig gebatcht (Audit R20 PERF-2); null wenn OctiProduct inaktiv/entfernt.","type":["string","null"]},"suggestedQty":{"type":["string","null"]},"reason":{"type":["string","null"]},"status":{"description":"open | ordered | dismissed.","type":["string","null"]},"supplierRoleId":{"description":"Vorzugslieferant (04-29-Resolver); null = kein bestellbarer Lieferant bekannt.","type":["integer","null"]},"supplierName":{"description":"Lieferantenname, read-only, serverseitig gebatcht (Audit R20 PERF-2); null wenn OctiSuppliers inaktiv oder unbekannt.","type":["string","null"]},"goodsOrderId":{"type":["integer","null"]},"createdAt":{"description":"Anlagedatum (ISO-8601) — Listenspalte + Default-Sortierung der Vorschlagsliste.","type":["string","null"]},"orders":{"description":"Nur create-orders (Antwort): erzeugte Entwurfs-Bestellungen je Lieferant.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}}],"description":"Nachbestell-Vorschläge (04-23 §8).\n- Liste (Filter status), Verwerfen je Vorschlag, Bündel-Überführung in Entwurfs-Bestellungen (create-orders, Payload {ulids}).\n- Antwort: erzeugte Bestellungen in `orders` ({ulid, supplierRoleId} je Lieferant).\n- Markenlose Produkt-Stammdaten, kein Brand-Scope."},"ReplenishmentRule-replenishment_rule.read":{"type":"object","description":"Min/Max-Nachschubregeln je Lagerort (04-25 §4/§6, M5).\nGenau eine Regel je Lager × Produkt × Zielplatz (409 bei Duplikat) — ohne `targetBinId` gilt die\nRegel fürs ganze Lager, mit ihr für genau diesen Pickplatz (Doc 25 AP 4.7).\nVorschläge: `/v1/warehouses/replenishment-suggestions`.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"productId":{"description":"Produkt der Regel (nur bei Anlage setzbar — eine Regel je Lager × Produkt).","type":["integer","null"]},"minQty":{"description":"Meldeschwelle: available < minQty löst den Vorschlag aus.","type":["integer","null"]},"maxQty":{"description":"Auffüllziel: es wird bis maxQty aufgefüllt.","type":["integer","null"]},"sourceWarehouseId":{"description":"Bevorzugtes Quell-Lager der Umlagerung (null = Nachbestellung/manuell).","type":["integer","null"]},"targetBinId":{"description":"Pickplatz, dessen Min/Max überwacht wird (null = Regel gilt fürs ganze Lager).","type":["integer","null"]},"sourceBinId":{"description":"Fester Reserveplatz als Quelle (null = mengenstärkster Reserveplatz des Lagers).","type":["integer","null"]}}},"ReplenishmentRule-replenishment_rule.write":{"type":"object","description":"Min/Max-Nachschubregeln je Lagerort (04-25 §4/§6, M5).\nGenau eine Regel je Lager × Produkt × Zielplatz (409 bei Duplikat) — ohne `targetBinId` gilt die\nRegel fürs ganze Lager, mit ihr für genau diesen Pickplatz (Doc 25 AP 4.7).\nVorschläge: `/v1/warehouses/replenishment-suggestions`.","properties":{"productId":{"description":"Produkt der Regel (nur bei Anlage setzbar — eine Regel je Lager × Produkt).","type":["integer","null"]},"minQty":{"description":"Meldeschwelle: available < minQty löst den Vorschlag aus.","type":["integer","null"]},"maxQty":{"description":"Auffüllziel: es wird bis maxQty aufgefüllt.","type":["integer","null"]},"sourceWarehouseId":{"description":"Bevorzugtes Quell-Lager der Umlagerung (null = Nachbestellung/manuell).","type":["integer","null"]},"targetBinId":{"description":"Pickplatz, dessen Min/Max überwacht wird (null = Regel gilt fürs ganze Lager).","type":["integer","null"]},"sourceBinId":{"description":"Fester Reserveplatz als Quelle (null = mengenstärkster Reserveplatz des Lagers).","type":["integer","null"]}}},"ReplenishmentRule-replenishment_rule.write.jsonMergePatch":{"type":"object","description":"Min/Max-Nachschubregeln je Lagerort (04-25 §4/§6, M5).\nGenau eine Regel je Lager × Produkt × Zielplatz (409 bei Duplikat) — ohne `targetBinId` gilt die\nRegel fürs ganze Lager, mit ihr für genau diesen Pickplatz (Doc 25 AP 4.7).\nVorschläge: `/v1/warehouses/replenishment-suggestions`.","properties":{"productId":{"description":"Produkt der Regel (nur bei Anlage setzbar — eine Regel je Lager × Produkt).","type":["integer","null"]},"minQty":{"description":"Meldeschwelle: available < minQty löst den Vorschlag aus.","type":["integer","null"]},"maxQty":{"description":"Auffüllziel: es wird bis maxQty aufgefüllt.","type":["integer","null"]},"sourceWarehouseId":{"description":"Bevorzugtes Quell-Lager der Umlagerung (null = Nachbestellung/manuell).","type":["integer","null"]},"targetBinId":{"description":"Pickplatz, dessen Min/Max überwacht wird (null = Regel gilt fürs ganze Lager).","type":["integer","null"]},"sourceBinId":{"description":"Fester Reserveplatz als Quelle (null = mengenstärkster Reserveplatz des Lagers).","type":["integer","null"]}}},"ReplenishmentRule.jsonld-replenishment_rule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"productId":{"description":"Produkt der Regel (nur bei Anlage setzbar — eine Regel je Lager × Produkt).","type":["integer","null"]},"minQty":{"description":"Meldeschwelle: available < minQty löst den Vorschlag aus.","type":["integer","null"]},"maxQty":{"description":"Auffüllziel: es wird bis maxQty aufgefüllt.","type":["integer","null"]},"sourceWarehouseId":{"description":"Bevorzugtes Quell-Lager der Umlagerung (null = Nachbestellung/manuell).","type":["integer","null"]},"targetBinId":{"description":"Pickplatz, dessen Min/Max überwacht wird (null = Regel gilt fürs ganze Lager).","type":["integer","null"]},"sourceBinId":{"description":"Fester Reserveplatz als Quelle (null = mengenstärkster Reserveplatz des Lagers).","type":["integer","null"]}}}],"description":"Min/Max-Nachschubregeln je Lagerort (04-25 §4/§6, M5).\nGenau eine Regel je Lager × Produkt × Zielplatz (409 bei Duplikat) — ohne `targetBinId` gilt die\nRegel fürs ganze Lager, mit ihr für genau diesen Pickplatz (Doc 25 AP 4.7).\nVorschläge: `/v1/warehouses/replenishment-suggestions`."},"ReplenishmentSuggestion-replenishment_suggestion.read":{"type":"object","description":"Nachschub-Vorschläge (04-25 §6, M5): read-only Auswertung aller Regeln.\nVorschlag bei available < minQty, Auffüllung bis maxQty.\nLiteral-Segment unter `/v1/warehouses` (kollisionsfrei zu {ulid}-Requirement).","properties":{"id":{"description":"Synthetischer Identifier `<warehouseId>-<productId>` (Auswertung, keine Entität).","default":"","type":"string"},"warehouseId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"deficitQty":{"description":"Auffüllmenge bis maxQty (maxQty − available).","type":["integer","null"]},"sourceWarehouseId":{"description":"Bevorzugtes Quell-Lager der Umlagerung (null = Nachbestellung/manuell).","type":["integer","null"]},"scope":{"description":"`warehouse` (Nachbestellung/Umlagerung) oder `bin` (Nachschub Reserve → Pickplatz, AP 4.7).","default":"warehouse","type":"string"},"targetBinId":{"description":"Zielplatz des Nachschubs (nur bei scope=bin).","type":["integer","null"]},"targetBinCode":{"type":["string","null"]},"sourceBinId":{"description":"Ermittelter Quellplatz (nur bei scope=bin). **null heißt: es gibt keinen** — im Lager liegt\nkein verorteter Vorrat, aus dem aufgefüllt werden könnte. Der Vorschlag bleibt trotzdem\nsichtbar; ihn zu verschweigen hieße, ein leerlaufendes Greifplatz-Problem zu verstecken.","type":["integer","null"]},"sourceBinCode":{"type":["string","null"]},"sourceQty":{"description":"Am Quellplatz tatsächlich verfügbare Menge (nur bei scope=bin).","type":["integer","null"]}}},"ReplenishmentSuggestion.jsonld-replenishment_suggestion.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Synthetischer Identifier `<warehouseId>-<productId>` (Auswertung, keine Entität).","default":"","type":"string"},"warehouseId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"deficitQty":{"description":"Auffüllmenge bis maxQty (maxQty − available).","type":["integer","null"]},"sourceWarehouseId":{"description":"Bevorzugtes Quell-Lager der Umlagerung (null = Nachbestellung/manuell).","type":["integer","null"]},"scope":{"description":"`warehouse` (Nachbestellung/Umlagerung) oder `bin` (Nachschub Reserve → Pickplatz, AP 4.7).","default":"warehouse","type":"string"},"targetBinId":{"description":"Zielplatz des Nachschubs (nur bei scope=bin).","type":["integer","null"]},"targetBinCode":{"type":["string","null"]},"sourceBinId":{"description":"Ermittelter Quellplatz (nur bei scope=bin). **null heißt: es gibt keinen** — im Lager liegt\nkein verorteter Vorrat, aus dem aufgefüllt werden könnte. Der Vorschlag bleibt trotzdem\nsichtbar; ihn zu verschweigen hieße, ein leerlaufendes Greifplatz-Problem zu verstecken.","type":["integer","null"]},"sourceBinCode":{"type":["string","null"]},"sourceQty":{"description":"Am Quellplatz tatsächlich verfügbare Menge (nur bei scope=bin).","type":["integer","null"]}}}],"description":"Nachschub-Vorschläge (04-25 §6, M5): read-only Auswertung aller Regeln.\nVorschlag bei available < minQty, Auffüllung bis maxQty.\nLiteral-Segment unter `/v1/warehouses` (kollisionsfrei zu {ulid}-Requirement)."},"ReplenishmentTask-replenishment_task.read":{"type":"object","description":"Nachschub-Aufträge Reserve → Pickplatz (Doc 25 AP 4.7, B3).\n\nAngelegt werden sie nicht von Hand, sondern aus den Nachschubregeln (`generate`) — ein Auftrag\nohne unterschrittenes Minimum wäre ein Weg ohne Grund. Bestätigt wird per Scan; die Aktion ist\nüber `X-Idempotency-Key` benennbar, damit die Scanner-Warteschlange nach einem WLAN-Aussetzer\nwiederholen darf, ohne doppelt umzulagern.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"description":{"type":["string","null"]},"sourceBinId":{"type":["integer","null"]},"sourceBinCode":{"type":["string","null"]},"targetBinId":{"type":["integer","null"]},"targetBinCode":{"type":["string","null"]},"qtyRequested":{"type":["integer","null"]},"qtyMoved":{"type":["integer","null"]},"status":{"description":"open|done|cancelled.","type":["string","null"]},"sourceQtyNow":{"description":"Menge, die im Moment der Abfrage wirklich am Quellplatz liegt (Vorschau am Gerät).","type":["integer","null"]},"note":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"ReplenishmentTask-replenishment_task.write":{"type":"object","description":"Nachschub-Aufträge Reserve → Pickplatz (Doc 25 AP 4.7, B3).\n\nAngelegt werden sie nicht von Hand, sondern aus den Nachschubregeln (`generate`) — ein Auftrag\nohne unterschrittenes Minimum wäre ein Weg ohne Grund. Bestätigt wird per Scan; die Aktion ist\nüber `X-Idempotency-Key` benennbar, damit die Scanner-Warteschlange nach einem WLAN-Aussetzer\nwiederholen darf, ohne doppelt umzulagern."},"ReplenishmentTask.jsonld-replenishment_task.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"description":{"type":["string","null"]},"sourceBinId":{"type":["integer","null"]},"sourceBinCode":{"type":["string","null"]},"targetBinId":{"type":["integer","null"]},"targetBinCode":{"type":["string","null"]},"qtyRequested":{"type":["integer","null"]},"qtyMoved":{"type":["integer","null"]},"status":{"description":"open|done|cancelled.","type":["string","null"]},"sourceQtyNow":{"description":"Menge, die im Moment der Abfrage wirklich am Quellplatz liegt (Vorschau am Gerät).","type":["integer","null"]},"note":{"type":["string","null"]},"completedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Nachschub-Aufträge Reserve → Pickplatz (Doc 25 AP 4.7, B3).\n\nAngelegt werden sie nicht von Hand, sondern aus den Nachschubregeln (`generate`) — ein Auftrag\nohne unterschrittenes Minimum wäre ein Weg ohne Grund. Bestätigt wird per Scan; die Aktion ist\nüber `X-Idempotency-Key` benennbar, damit die Scanner-Warteschlange nach einem WLAN-Aussetzer\nwiederholen darf, ohne doppelt umzulagern."},"ReportDefinition-reportdef.read":{"type":"object","description":"Gespeicherte Auswertung (04-11 §4.2).\n- CRUD + /result (ausgeführte Tabelle, Soll-Ist/Vergleich) + /run (Export-Lauf anstoßen)\n- Sichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\ReportDefinitionVoter} (persönlich/rolle/geteilt, markenbewusst).","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"description":{"maxLength":1000,"type":["string","null"]},"dataset":{"maxLength":60,"type":["string","null"]},"dimensions":{"description":"Drill-down-Dimensionen (erste = Zeilenachse).","type":["array","null"],"items":{"type":"string"}},"measures":{"description":"Measures (Metric-Keys).","type":["array","null"],"items":{"type":"string"}},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortField":{"maxLength":60,"type":["string","null"]},"sortDir":{"type":["string","null"]},"period":{"type":["string","null"]},"dateRange":{"type":["string","null"]},"customFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"customTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"comparison":{"type":["string","null"]},"scope":{"type":["string","null"]},"brandFilter":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"result":{"description":"Ausgeführtes Ergebnis (nur /result).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"run":{"description":"Angestoßener Export-Lauf (nur /run).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ReportDefinition-reportdef.write":{"type":"object","description":"Gespeicherte Auswertung (04-11 §4.2).\n- CRUD + /result (ausgeführte Tabelle, Soll-Ist/Vergleich) + /run (Export-Lauf anstoßen)\n- Sichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\ReportDefinitionVoter} (persönlich/rolle/geteilt, markenbewusst).","properties":{"name":{"maxLength":200,"type":["string","null"]},"description":{"maxLength":1000,"type":["string","null"]},"dataset":{"maxLength":60,"type":["string","null"]},"dimensions":{"description":"Drill-down-Dimensionen (erste = Zeilenachse).","type":["array","null"],"items":{"type":"string"}},"measures":{"description":"Measures (Metric-Keys).","type":["array","null"],"items":{"type":"string"}},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortField":{"maxLength":60,"type":["string","null"]},"sortDir":{"type":["string","null"]},"period":{"type":["string","null"]},"dateRange":{"type":["string","null"]},"customFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"customTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"comparison":{"type":["string","null"]},"scope":{"type":["string","null"]},"brandFilter":{"type":["integer","null"]}}},"ReportDefinition-reportdef.write.jsonMergePatch":{"type":"object","description":"Gespeicherte Auswertung (04-11 §4.2).\n- CRUD + /result (ausgeführte Tabelle, Soll-Ist/Vergleich) + /run (Export-Lauf anstoßen)\n- Sichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\ReportDefinitionVoter} (persönlich/rolle/geteilt, markenbewusst).","properties":{"name":{"maxLength":200,"type":["string","null"]},"description":{"maxLength":1000,"type":["string","null"]},"dataset":{"maxLength":60,"type":["string","null"]},"dimensions":{"description":"Drill-down-Dimensionen (erste = Zeilenachse).","type":["array","null"],"items":{"type":"string"}},"measures":{"description":"Measures (Metric-Keys).","type":["array","null"],"items":{"type":"string"}},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortField":{"maxLength":60,"type":["string","null"]},"sortDir":{"type":["string","null"]},"period":{"type":["string","null"]},"dateRange":{"type":["string","null"]},"customFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"customTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"comparison":{"type":["string","null"]},"scope":{"type":["string","null"]},"brandFilter":{"type":["integer","null"]}}},"ReportDefinition.ReportFromTemplateInput-reportdef.write":{"type":"object","description":"Gespeicherte Auswertung (04-11 §4.2).\n- CRUD + /result (ausgeführte Tabelle, Soll-Ist/Vergleich) + /run (Export-Lauf anstoßen)\n- Sichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\ReportDefinitionVoter} (persönlich/rolle/geteilt, markenbewusst).","required":["templateKey"],"properties":{"templateKey":{"maxLength":100,"description":"Schlüssel der Vorlage (`GET /v1/reporting/report-templates` → `key`).","default":"","type":"string"},"name":{"maxLength":200,"description":"Optionaler Name (Default: aus dem Vorlagen-Schlüssel abgeleitet).","type":["string","null"]},"brandFilter":{"description":"Marken-Filter der neuen Auswertung (null = alle Marken, erfordert entsprechenden Zugriff).","type":["integer","null"]},"scope":{"description":"Sichtbarkeit. Default `personal` — die Vorlage landet als persönliche Auswertung, damit das\nAnlegen kein `reporting.report.manage` in der Zielmarke voraussetzt.","type":["string","null"]}}},"ReportDefinition.jsonld-reportdef.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"description":{"maxLength":1000,"type":["string","null"]},"dataset":{"maxLength":60,"type":["string","null"]},"dimensions":{"description":"Drill-down-Dimensionen (erste = Zeilenachse).","type":["array","null"],"items":{"type":"string"}},"measures":{"description":"Measures (Metric-Keys).","type":["array","null"],"items":{"type":"string"}},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sortField":{"maxLength":60,"type":["string","null"]},"sortDir":{"type":["string","null"]},"period":{"type":["string","null"]},"dateRange":{"type":["string","null"]},"customFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"customTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"comparison":{"type":["string","null"]},"scope":{"type":["string","null"]},"brandFilter":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"result":{"description":"Ausgeführtes Ergebnis (nur /result).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"run":{"description":"Angestoßener Export-Lauf (nur /run).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"Gespeicherte Auswertung (04-11 §4.2).\n- CRUD + /result (ausgeführte Tabelle, Soll-Ist/Vergleich) + /run (Export-Lauf anstoßen)\n- Sichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\ReportDefinitionVoter} (persönlich/rolle/geteilt, markenbewusst)."},"ReportRun-run.read":{"type":"object","description":"Ausführungs-/Export-Lauf (04-11 §3, §4.4), read-only.\n/download: Verweis-Metadaten auf Export-Datei (DMS); Byte-Auslieferung übernimmt Datei-/DMS-Layer.\nFilter (Liste): reportDefinitionUlid, status.","properties":{"ulid":{"type":["string","null"]},"reportDefinitionUlid":{"type":["string","null"]},"label":{"type":["string","null"]},"format":{"type":["string","null"]},"trigger":{"type":["string","null"]},"status":{"description":"queued | running | done | failed.","type":["string","null"]},"rowCount":{"type":["integer","null"]},"error":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"download":{"description":"Datei-Verweis (nur /download).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ReportRun.jsonld-run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"reportDefinitionUlid":{"type":["string","null"]},"label":{"type":["string","null"]},"format":{"type":["string","null"]},"trigger":{"type":["string","null"]},"status":{"description":"queued | running | done | failed.","type":["string","null"]},"rowCount":{"type":["integer","null"]},"error":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"download":{"description":"Datei-Verweis (nur /download).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"Ausführungs-/Export-Lauf (04-11 §3, §4.4), read-only.\n/download: Verweis-Metadaten auf Export-Datei (DMS); Byte-Auslieferung übernimmt Datei-/DMS-Layer.\nFilter (Liste): reportDefinitionUlid, status."},"ReportSchedule-schedule.read":{"type":"object","description":"Geplanter Export/Versand einer Auswertung (04-11 §4.4): Frequenz, Format, Empfänger.\nLesen/Pflege: reporting.export. Scheduler erzeugt zur Fälligkeit einen {@see \\Octi\\Plugin\\Reporting\\Entity\\ReportRun}.","properties":{"ulid":{"type":["string","null"]},"reportDefinitionUlid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"frequency":{"description":"daily | weekly | monthly.","type":["string","null"]},"format":{"description":"csv | xlsx | pdf.","type":["string","null"]},"recipients":{"description":"Empfänger (User-ULIDs oder E-Mail).","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"lastRunAt":{"type":["string","null"]},"nextRunAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"ReportSchedule-schedule.write":{"type":"object","description":"Geplanter Export/Versand einer Auswertung (04-11 §4.4): Frequenz, Format, Empfänger.\nLesen/Pflege: reporting.export. Scheduler erzeugt zur Fälligkeit einen {@see \\Octi\\Plugin\\Reporting\\Entity\\ReportRun}.","properties":{"reportDefinitionUlid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"frequency":{"description":"daily | weekly | monthly.","type":["string","null"]},"format":{"description":"csv | xlsx | pdf.","type":["string","null"]},"recipients":{"description":"Empfänger (User-ULIDs oder E-Mail).","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]}}},"ReportSchedule-schedule.write.jsonMergePatch":{"type":"object","description":"Geplanter Export/Versand einer Auswertung (04-11 §4.4): Frequenz, Format, Empfänger.\nLesen/Pflege: reporting.export. Scheduler erzeugt zur Fälligkeit einen {@see \\Octi\\Plugin\\Reporting\\Entity\\ReportRun}.","properties":{"reportDefinitionUlid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"frequency":{"description":"daily | weekly | monthly.","type":["string","null"]},"format":{"description":"csv | xlsx | pdf.","type":["string","null"]},"recipients":{"description":"Empfänger (User-ULIDs oder E-Mail).","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]}}},"ReportSchedule.jsonld-schedule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"reportDefinitionUlid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"frequency":{"description":"daily | weekly | monthly.","type":["string","null"]},"format":{"description":"csv | xlsx | pdf.","type":["string","null"]},"recipients":{"description":"Empfänger (User-ULIDs oder E-Mail).","type":["array","null"],"items":{"type":"string"}},"active":{"type":["boolean","null"]},"lastRunAt":{"type":["string","null"]},"nextRunAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Geplanter Export/Versand einer Auswertung (04-11 §4.4): Frequenz, Format, Empfänger.\nLesen/Pflege: reporting.export. Scheduler erzeugt zur Fälligkeit einen {@see \\Octi\\Plugin\\Reporting\\Entity\\ReportRun}."},"ReportTemplate-reporttemplate.read":{"type":"object","description":"Report-Vorlage der Galerie (Doc 26 6.2): read-only Blaupause aus dem\n{@see \\Octi\\Plugin\\Reporting\\Catalog\\ReportTemplateCatalog}. Materialisiert wird sie über\n`POST /v1/reporting/reports/from-template`.\n\nAusgeliefert werden nur Vorlagen, die für den aufrufenden Nutzer auch berechenbar UND sichtbar\nsind ({@see \\Octi\\Plugin\\Reporting\\Service\\ReportTemplateResolver}). Labels kommen aus der SPA\n(`reporting.reportTemplates.<key>.title` / `.summary`), nicht aus dem Backend.","properties":{"key":{"type":["string","null"]},"category":{"description":"Gruppierung der Galerie (== dataset).","type":["string","null"]},"dataset":{"type":["string","null"]},"dimensions":{"type":"array","items":{"type":"string"}},"measures":{"description":"Metric-Keys.","type":"array","items":{"type":"string"}},"measureLabels":{"description":"Katalog-Labels je Metric-Key (deutsch); die SPA überlagert sie per Key (I18N-6).","type":"object","additionalProperties":{"type":"string"}},"period":{"type":["string","null"]},"dateRange":{"type":["string","null"]},"comparison":{"type":["string","null"]}}},"ReportTemplate.jsonld-reporttemplate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"category":{"description":"Gruppierung der Galerie (== dataset).","type":["string","null"]},"dataset":{"type":["string","null"]},"dimensions":{"type":"array","items":{"type":"string"}},"measures":{"description":"Metric-Keys.","type":"array","items":{"type":"string"}},"measureLabels":{"description":"Katalog-Labels je Metric-Key (deutsch); die SPA überlagert sie per Key (I18N-6).","type":"object","additionalProperties":{"type":"string"}},"period":{"type":["string","null"]},"dateRange":{"type":["string","null"]},"comparison":{"type":["string","null"]}}}],"description":"Report-Vorlage der Galerie (Doc 26 6.2): read-only Blaupause aus dem\n{@see \\Octi\\Plugin\\Reporting\\Catalog\\ReportTemplateCatalog}. Materialisiert wird sie über\n`POST /v1/reporting/reports/from-template`.\n\nAusgeliefert werden nur Vorlagen, die für den aufrufenden Nutzer auch berechenbar UND sichtbar\nsind ({@see \\Octi\\Plugin\\Reporting\\Service\\ReportTemplateResolver}). Labels kommen aus der SPA\n(`reporting.reportTemplates.<key>.title` / `.summary`), nicht aus dem Backend."},"ReportingDashboard-dashboard.read":{"type":"object","description":"Dashboard/Cockpit (04-11 §4.1). CRUD + Widget-Set.\n`/data`: aufgelöste Widget-Daten, Query-Override brandId/range.\nSichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\DashboardVoter}.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"scope":{"maxLength":10,"description":"personal | role | shared.","type":["string","null"]},"roleId":{"type":["integer","null"]},"brandFilter":{"type":["integer","null"]},"layout":{"description":"Grid-Layout (Spalten/Positionen).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"type":["boolean","null"]},"widgets":{"description":"Widget-Set (ersetzt beim Schreiben das bestehende).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"ownerId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"data":{"description":"Aufgelöste Widget-Daten (nur /data).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"ReportingDashboard-dashboard.write":{"type":"object","description":"Dashboard/Cockpit (04-11 §4.1). CRUD + Widget-Set.\n`/data`: aufgelöste Widget-Daten, Query-Override brandId/range.\nSichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\DashboardVoter}.","properties":{"name":{"maxLength":200,"type":["string","null"]},"scope":{"maxLength":10,"description":"personal | role | shared.","type":["string","null"]},"roleId":{"type":["integer","null"]},"brandFilter":{"type":["integer","null"]},"layout":{"description":"Grid-Layout (Spalten/Positionen).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"type":["boolean","null"]},"widgets":{"description":"Widget-Set (ersetzt beim Schreiben das bestehende).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ReportingDashboard-dashboard.write.jsonMergePatch":{"type":"object","description":"Dashboard/Cockpit (04-11 §4.1). CRUD + Widget-Set.\n`/data`: aufgelöste Widget-Daten, Query-Override brandId/range.\nSichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\DashboardVoter}.","properties":{"name":{"maxLength":200,"type":["string","null"]},"scope":{"maxLength":10,"description":"personal | role | shared.","type":["string","null"]},"roleId":{"type":["integer","null"]},"brandFilter":{"type":["integer","null"]},"layout":{"description":"Grid-Layout (Spalten/Positionen).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"type":["boolean","null"]},"widgets":{"description":"Widget-Set (ersetzt beim Schreiben das bestehende).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ReportingDashboard.jsonld-dashboard.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":200,"type":["string","null"]},"scope":{"maxLength":10,"description":"personal | role | shared.","type":["string","null"]},"roleId":{"type":["integer","null"]},"brandFilter":{"type":["integer","null"]},"layout":{"description":"Grid-Layout (Spalten/Positionen).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"type":["boolean","null"]},"widgets":{"description":"Widget-Set (ersetzt beim Schreiben das bestehende).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"ownerId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]},"data":{"description":"Aufgelöste Widget-Daten (nur /data).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"Dashboard/Cockpit (04-11 §4.1). CRUD + Widget-Set.\n`/data`: aufgelöste Widget-Daten, Query-Override brandId/range.\nSichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\DashboardVoter}."},"ReportingDataset-reporting_dataset.read":{"type":"object","description":"Report-Datensätze/Quellbereiche (04-11 §4.2), read-only.\nBasis für dataset-Auswahl im Report-Builder (statt Freitext); MCP-/OpenAPI-sichtbar.","properties":{"key":{"type":["string","null"]},"label":{"description":"Kanonisches (deutsches) Label; das Frontend übersetzt bevorzugt via i18n.","type":["string","null"]}}},"ReportingDataset.jsonld-reporting_dataset.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"label":{"description":"Kanonisches (deutsches) Label; das Frontend übersetzt bevorzugt via i18n.","type":["string","null"]}}}],"description":"Report-Datensätze/Quellbereiche (04-11 §4.2), read-only.\nBasis für dataset-Auswahl im Report-Builder (statt Freitext); MCP-/OpenAPI-sichtbar."},"ReportingInsight-insight.read":{"type":"object","description":"KI-Auswertung des Reportings (04-11 §13 S11-2).\n- GET /insights/narrative: automatisches Narrativ zur Lage\n- GET /insights/anomalies: Anomalie-Erkennung ggü. Vormonat\n- POST /insights/query: natürlichsprachige Abfrage\n- Heuristik-first über AI-Gateway; maskiert sensible Kennzahlen gemäß Berechtigung.","properties":{"key":{"type":["string","null"]},"kind":{"description":"narrative | anomaly | answer.","type":["string","null"]},"text":{"type":["string","null"]},"question":{"type":["string","null"]}}},"ReportingInsight-insight.write":{"type":"object","description":"KI-Auswertung des Reportings (04-11 §13 S11-2).\n- GET /insights/narrative: automatisches Narrativ zur Lage\n- GET /insights/anomalies: Anomalie-Erkennung ggü. Vormonat\n- POST /insights/query: natürlichsprachige Abfrage\n- Heuristik-first über AI-Gateway; maskiert sensible Kennzahlen gemäß Berechtigung.","properties":{"question":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"ReportingInsight.jsonld-insight.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"kind":{"description":"narrative | anomaly | answer.","type":["string","null"]},"text":{"type":["string","null"]},"question":{"type":["string","null"]}}}],"description":"KI-Auswertung des Reportings (04-11 §13 S11-2).\n- GET /insights/narrative: automatisches Narrativ zur Lage\n- GET /insights/anomalies: Anomalie-Erkennung ggü. Vormonat\n- POST /insights/query: natürlichsprachige Abfrage\n- Heuristik-first über AI-Gateway; maskiert sensible Kennzahlen gemäß Berechtigung."},"ReportingKpi-kpi.read":{"type":"object","description":"Kennzahl je Dimensionswert (04-11 §4.2/§4.3), read-only.\n- GET /kpis: Aufschlüsselung je Dimension, Soll-Ist-Ampel + Vergleichs-Delta\n- GET /kpis/series: Zeitreihe je Periode\n- Filter: metric (Pflicht), dimension, from/to|range, period, brandId, compare\n- Drill-down-Eltern-Schnitt: parentDimension + parentValue (VOR17-14) — nur gemeinsam wirksam\n- Sensible Finanz-/HR-Kennzahlen ohne Recht maskiert.","properties":{"key":{"type":["string","null"]},"metric":{"type":["string","null"]},"metricLabel":{"type":["string","null"]},"unit":{"type":["string","null"]},"dimension":{"type":["string","null"]},"dimensionValue":{"type":["string","null"]},"label":{"type":["string","null"]},"periodKey":{"description":"Periode (nur Zeitreihe).","type":["string","null"]},"periodStart":{"type":["string","null"]},"raw":{"type":["integer","null"]},"value":{"type":["number","null"]},"formatted":{"type":["string","null"]},"masked":{"default":false,"type":"boolean"},"target":{"description":"Soll-Ist: targetValue/formatted/met/ampel/attainmentPct","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"deltaNumber":{"type":["number","null"]},"deltaFormatted":{"type":["string","null"]},"linkType":{"description":"Quellmodul-Typ für Drill-down-Deep-Link (voter-geprüft im Quellmodul).","type":["string","null"]}}},"ReportingKpi.jsonld-kpi.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"metric":{"type":["string","null"]},"metricLabel":{"type":["string","null"]},"unit":{"type":["string","null"]},"dimension":{"type":["string","null"]},"dimensionValue":{"type":["string","null"]},"label":{"type":["string","null"]},"periodKey":{"description":"Periode (nur Zeitreihe).","type":["string","null"]},"periodStart":{"type":["string","null"]},"raw":{"type":["integer","null"]},"value":{"type":["number","null"]},"formatted":{"type":["string","null"]},"masked":{"default":false,"type":"boolean"},"target":{"description":"Soll-Ist: targetValue/formatted/met/ampel/attainmentPct","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"deltaNumber":{"type":["number","null"]},"deltaFormatted":{"type":["string","null"]},"linkType":{"description":"Quellmodul-Typ für Drill-down-Deep-Link (voter-geprüft im Quellmodul).","type":["string","null"]}}}],"description":"Kennzahl je Dimensionswert (04-11 §4.2/§4.3), read-only.\n- GET /kpis: Aufschlüsselung je Dimension, Soll-Ist-Ampel + Vergleichs-Delta\n- GET /kpis/series: Zeitreihe je Periode\n- Filter: metric (Pflicht), dimension, from/to|range, period, brandId, compare\n- Drill-down-Eltern-Schnitt: parentDimension + parentValue (VOR17-14) — nur gemeinsam wirksam\n- Sensible Finanz-/HR-Kennzahlen ohne Recht maskiert."},"ReportingMetric-reporting_metric.read":{"type":"object","description":"Kennzahlen-Definitionen (04-11 §6), read-only.\nJe Kennzahl: Label, Einheit, Berechtigungs-Gate, Optimierungsrichtung. Basis für Report-Builder/Widget-Konfigurator.","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"unit":{"type":["string","null"]},"gate":{"description":"none | financial | hr — Maskierungs-Gate.","type":["string","null"]},"better":{"description":"higher | lower | neutral — für Ampel-Richtung.","type":["string","null"]},"kind":{"description":"flow | stock | derived.","type":["string","null"]}}},"ReportingMetric.jsonld-reporting_metric.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"unit":{"type":["string","null"]},"gate":{"description":"none | financial | hr — Maskierungs-Gate.","type":["string","null"]},"better":{"description":"higher | lower | neutral — für Ampel-Richtung.","type":["string","null"]},"kind":{"description":"flow | stock | derived.","type":["string","null"]}}}],"description":"Kennzahlen-Definitionen (04-11 §6), read-only.\nJe Kennzahl: Label, Einheit, Berechtigungs-Gate, Optimierungsrichtung. Basis für Report-Builder/Widget-Konfigurator."},"ReportingTarget-target.read":{"type":"object","description":"Soll-Wert (Ziel) je Kennzahl/Dimension (04-11 §4.2).\n- Lesen: reporting.dashboard.view · Pflege: reporting.report.manage\n- Ampel-Vergleich gegen Ist-Wert; Scheduler nutzt es für Abweichungs-Alerts.","properties":{"ulid":{"type":["string","null"]},"metricKey":{"maxLength":60,"type":["string","null"]},"dimensionKey":{"maxLength":30,"default":"global","type":["string","null"]},"dimensionValue":{"maxLength":60,"default":"","type":["string","null"]},"period":{"default":"month","type":["string","null"]},"targetValue":{"description":"Zielwert in kanonischer Einheit (Cent / Minuten / Basispunkte / Tage).","type":["integer","null"]},"comparison":{"description":"gte (erreichen/übertreffen) | lte (unterbieten, z.B. DSO).","default":"gte","type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"ReportingTarget-target.write":{"type":"object","description":"Soll-Wert (Ziel) je Kennzahl/Dimension (04-11 §4.2).\n- Lesen: reporting.dashboard.view · Pflege: reporting.report.manage\n- Ampel-Vergleich gegen Ist-Wert; Scheduler nutzt es für Abweichungs-Alerts.","properties":{"metricKey":{"maxLength":60,"type":["string","null"]},"dimensionKey":{"maxLength":30,"default":"global","type":["string","null"]},"dimensionValue":{"maxLength":60,"default":"","type":["string","null"]},"period":{"default":"month","type":["string","null"]},"targetValue":{"description":"Zielwert in kanonischer Einheit (Cent / Minuten / Basispunkte / Tage).","type":["integer","null"]},"comparison":{"description":"gte (erreichen/übertreffen) | lte (unterbieten, z.B. DSO).","default":"gte","type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"ReportingTarget-target.write.jsonMergePatch":{"type":"object","description":"Soll-Wert (Ziel) je Kennzahl/Dimension (04-11 §4.2).\n- Lesen: reporting.dashboard.view · Pflege: reporting.report.manage\n- Ampel-Vergleich gegen Ist-Wert; Scheduler nutzt es für Abweichungs-Alerts.","properties":{"metricKey":{"maxLength":60,"type":["string","null"]},"dimensionKey":{"maxLength":30,"default":"global","type":["string","null"]},"dimensionValue":{"maxLength":60,"default":"","type":["string","null"]},"period":{"default":"month","type":["string","null"]},"targetValue":{"description":"Zielwert in kanonischer Einheit (Cent / Minuten / Basispunkte / Tage).","type":["integer","null"]},"comparison":{"description":"gte (erreichen/übertreffen) | lte (unterbieten, z.B. DSO).","default":"gte","type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"ReportingTarget.jsonld-target.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"metricKey":{"maxLength":60,"type":["string","null"]},"dimensionKey":{"maxLength":30,"default":"global","type":["string","null"]},"dimensionValue":{"maxLength":60,"default":"","type":["string","null"]},"period":{"default":"month","type":["string","null"]},"targetValue":{"description":"Zielwert in kanonischer Einheit (Cent / Minuten / Basispunkte / Tage).","type":["integer","null"]},"comparison":{"description":"gte (erreichen/übertreffen) | lte (unterbieten, z.B. DSO).","default":"gte","type":["string","null"]},"validFrom":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"validTo":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Soll-Wert (Ziel) je Kennzahl/Dimension (04-11 §4.2).\n- Lesen: reporting.dashboard.view · Pflege: reporting.report.manage\n- Ampel-Vergleich gegen Ist-Wert; Scheduler nutzt es für Abweichungs-Alerts."},"ReportingWidgetType-reporting_widget_type.read":{"type":"object","description":"Widget-Typen der Registry (04-11 §3, §5), read-only.\nBasis für Widget-Konfigurator (KPI-Kachel, Linien-/Balkendiagramm, Tabelle, Gauge, Funnel, Heatmap).","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"renderKind":{"description":"value | series | breakdown | gauge | client.","type":["string","null"]},"needsDimension":{"default":false,"type":"boolean"},"category":{"description":"Picker-Gruppierung (Modul/Bereich).","type":["string","null"]},"defaultW":{"description":"Default-Rastergröße (Spalten/Zeilen).","default":6,"type":"integer"},"defaultH":{"default":2,"type":"integer"},"isOperational":{"description":"True = clientseitig aufgelöstes operatives Widget (kein Metrik-Resolving).","default":false,"type":"boolean"}}},"ReportingWidgetType.jsonld-reporting_widget_type.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"renderKind":{"description":"value | series | breakdown | gauge | client.","type":["string","null"]},"needsDimension":{"default":false,"type":"boolean"},"category":{"description":"Picker-Gruppierung (Modul/Bereich).","type":["string","null"]},"defaultW":{"description":"Default-Rastergröße (Spalten/Zeilen).","default":6,"type":"integer"},"defaultH":{"default":2,"type":"integer"},"isOperational":{"description":"True = clientseitig aufgelöstes operatives Widget (kein Metrik-Resolving).","default":false,"type":"boolean"}}}],"description":"Widget-Typen der Registry (04-11 §3, §5), read-only.\nBasis für Widget-Konfigurator (KPI-Kachel, Linien-/Balkendiagramm, Tabelle, Gauge, Funnel, Heatmap)."},"RepricingRule-repricing_rule.read":{"type":"object","description":"Preisregel für Verkaufskanäle (Doc 25 AP 9.7).\n\n- `simulate` rechnet OHNE zu speichern: eine Preisregel, die man erst im Shop sieht, ist eine\n  Regel, die man im Shop korrigiert","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"channelKey":{"maxLength":100,"description":"Kanal-Schlüssel; leer = gilt für jeden Kanal.","type":["string","null"]},"skuPrefix":{"maxLength":60,"description":"Artikelnummern-Präfix; leer = jedes Sortiment.","type":["string","null"]},"baseSource":{"enum":["cost","price"],"description":"Ausgangswert der Kette: `cost` (Einstand) oder `price` (aufgelöster Preis).","type":["string","null"]},"markupPercent":{"type":["number","null"]},"surchargeAmount":{"description":"Zuschlag in Cent.","type":["integer","null"]},"channelFeePercent":{"minimum":0,"maximum":99,"description":"Kanalgebühr in Prozent — wird herausgerechnet, nicht aufgeschlagen.","type":["number","null"]},"shippingAmount":{"description":"Versandanteil in Cent.","type":["integer","null"]},"rounding":{"enum":["none","end99","end95","full"],"type":["string","null"]},"minMarginPercent":{"minimum":0,"maximum":99,"description":"Mindestmarge in Prozent vom Verkaufspreis (Handelsmarge).","type":["number","null"]},"floorAmount":{"minimum":0,"description":"Preisuntergrenze in Cent.","type":["integer","null"]},"ceilingAmount":{"minimum":0,"description":"Preisobergrenze in Cent — greift NICHT, wenn sie unter der Mindestmarge läge.","type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"result":{"description":"Ergebnis der Aktion `simulate` (read-only).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}},"RepricingRule-repricing_rule.write":{"type":"object","description":"Preisregel für Verkaufskanäle (Doc 25 AP 9.7).\n\n- `simulate` rechnet OHNE zu speichern: eine Preisregel, die man erst im Shop sieht, ist eine\n  Regel, die man im Shop korrigiert","properties":{"name":{"maxLength":160,"type":["string","null"]},"channelKey":{"maxLength":100,"description":"Kanal-Schlüssel; leer = gilt für jeden Kanal.","type":["string","null"]},"skuPrefix":{"maxLength":60,"description":"Artikelnummern-Präfix; leer = jedes Sortiment.","type":["string","null"]},"baseSource":{"enum":["cost","price"],"description":"Ausgangswert der Kette: `cost` (Einstand) oder `price` (aufgelöster Preis).","type":["string","null"]},"markupPercent":{"type":["number","null"]},"surchargeAmount":{"description":"Zuschlag in Cent.","type":["integer","null"]},"channelFeePercent":{"minimum":0,"maximum":99,"description":"Kanalgebühr in Prozent — wird herausgerechnet, nicht aufgeschlagen.","type":["number","null"]},"shippingAmount":{"description":"Versandanteil in Cent.","type":["integer","null"]},"rounding":{"enum":["none","end99","end95","full"],"type":["string","null"]},"minMarginPercent":{"minimum":0,"maximum":99,"description":"Mindestmarge in Prozent vom Verkaufspreis (Handelsmarge).","type":["number","null"]},"floorAmount":{"minimum":0,"description":"Preisuntergrenze in Cent.","type":["integer","null"]},"ceilingAmount":{"minimum":0,"description":"Preisobergrenze in Cent — greift NICHT, wenn sie unter der Mindestmarge läge.","type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"costAmount":{"description":"NUR SCHREIBEN (Aktion `simulate`): angenommener Netto-Einstand in Cent.","type":["integer","null"]},"resolvedPrice":{"description":"NUR SCHREIBEN (Aktion `simulate`): angenommener aufgelöster Preis in Cent.","type":["integer","null"]}}},"RepricingRule-repricing_rule.write.jsonMergePatch":{"type":"object","description":"Preisregel für Verkaufskanäle (Doc 25 AP 9.7).\n\n- `simulate` rechnet OHNE zu speichern: eine Preisregel, die man erst im Shop sieht, ist eine\n  Regel, die man im Shop korrigiert","properties":{"name":{"maxLength":160,"type":["string","null"]},"channelKey":{"maxLength":100,"description":"Kanal-Schlüssel; leer = gilt für jeden Kanal.","type":["string","null"]},"skuPrefix":{"maxLength":60,"description":"Artikelnummern-Präfix; leer = jedes Sortiment.","type":["string","null"]},"baseSource":{"enum":["cost","price"],"description":"Ausgangswert der Kette: `cost` (Einstand) oder `price` (aufgelöster Preis).","type":["string","null"]},"markupPercent":{"type":["number","null"]},"surchargeAmount":{"description":"Zuschlag in Cent.","type":["integer","null"]},"channelFeePercent":{"minimum":0,"maximum":99,"description":"Kanalgebühr in Prozent — wird herausgerechnet, nicht aufgeschlagen.","type":["number","null"]},"shippingAmount":{"description":"Versandanteil in Cent.","type":["integer","null"]},"rounding":{"enum":["none","end99","end95","full"],"type":["string","null"]},"minMarginPercent":{"minimum":0,"maximum":99,"description":"Mindestmarge in Prozent vom Verkaufspreis (Handelsmarge).","type":["number","null"]},"floorAmount":{"minimum":0,"description":"Preisuntergrenze in Cent.","type":["integer","null"]},"ceilingAmount":{"minimum":0,"description":"Preisobergrenze in Cent — greift NICHT, wenn sie unter der Mindestmarge läge.","type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"costAmount":{"description":"NUR SCHREIBEN (Aktion `simulate`): angenommener Netto-Einstand in Cent.","type":["integer","null"]},"resolvedPrice":{"description":"NUR SCHREIBEN (Aktion `simulate`): angenommener aufgelöster Preis in Cent.","type":["integer","null"]}}},"RepricingRule.jsonld-repricing_rule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"channelKey":{"maxLength":100,"description":"Kanal-Schlüssel; leer = gilt für jeden Kanal.","type":["string","null"]},"skuPrefix":{"maxLength":60,"description":"Artikelnummern-Präfix; leer = jedes Sortiment.","type":["string","null"]},"baseSource":{"enum":["cost","price"],"description":"Ausgangswert der Kette: `cost` (Einstand) oder `price` (aufgelöster Preis).","type":["string","null"]},"markupPercent":{"type":["number","null"]},"surchargeAmount":{"description":"Zuschlag in Cent.","type":["integer","null"]},"channelFeePercent":{"minimum":0,"maximum":99,"description":"Kanalgebühr in Prozent — wird herausgerechnet, nicht aufgeschlagen.","type":["number","null"]},"shippingAmount":{"description":"Versandanteil in Cent.","type":["integer","null"]},"rounding":{"enum":["none","end99","end95","full"],"type":["string","null"]},"minMarginPercent":{"minimum":0,"maximum":99,"description":"Mindestmarge in Prozent vom Verkaufspreis (Handelsmarge).","type":["number","null"]},"floorAmount":{"minimum":0,"description":"Preisuntergrenze in Cent.","type":["integer","null"]},"ceilingAmount":{"minimum":0,"description":"Preisobergrenze in Cent — greift NICHT, wenn sie unter der Mindestmarge läge.","type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"result":{"description":"Ergebnis der Aktion `simulate` (read-only).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"Preisregel für Verkaufskanäle (Doc 25 AP 9.7).\n\n- `simulate` rechnet OHNE zu speichern: eine Preisregel, die man erst im Shop sieht, ist eine\n  Regel, die man im Shop korrigiert"},"ReserveOverride-reserve.read":{"type":"object","description":"Pro-Person-Override des internen Reserve-Anteils (04-09 §6.1, R8).\nOhne Override: globaler Default ({@see \\Octi\\Plugin\\Planning\\Service\\CapacityProvider::DEFAULT_RESERVE_PCT}).","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"reservePct":{"minimum":0,"maximum":100,"description":"Reserve-Anteil in Prozent (0–100).","type":["integer","null"]},"note":{"type":["string","null"]}}},"ReserveOverride-reserve.update.jsonMergePatch":{"type":"object","description":"Pro-Person-Override des internen Reserve-Anteils (04-09 §6.1, R8).\nOhne Override: globaler Default ({@see \\Octi\\Plugin\\Planning\\Service\\CapacityProvider::DEFAULT_RESERVE_PCT}).","properties":{"reservePct":{"minimum":0,"maximum":100,"description":"Reserve-Anteil in Prozent (0–100).","type":["integer","null"]},"note":{"type":["string","null"]}}},"ReserveOverride-reserve.write":{"type":"object","description":"Pro-Person-Override des internen Reserve-Anteils (04-09 §6.1, R8).\nOhne Override: globaler Default ({@see \\Octi\\Plugin\\Planning\\Service\\CapacityProvider::DEFAULT_RESERVE_PCT}).","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"reservePct":{"minimum":0,"maximum":100,"description":"Reserve-Anteil in Prozent (0–100).","type":["integer","null"]},"note":{"type":["string","null"]}}},"ReserveOverride.jsonld-reserve.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"reservePct":{"minimum":0,"maximum":100,"description":"Reserve-Anteil in Prozent (0–100).","type":["integer","null"]},"note":{"type":["string","null"]}}}],"description":"Pro-Person-Override des internen Reserve-Anteils (04-09 §6.1, R8).\nOhne Override: globaler Default ({@see \\Octi\\Plugin\\Planning\\Service\\CapacityProvider::DEFAULT_RESERVE_PCT})."},"ResourceSkillCatalog-resource_skill.read":{"type":"object","description":"Read-only Skill-Katalog fürs Skill-Matching (04-09 §4.5).\nLiefert zusätzlich numerische `id`, da {@see SkillDemandResource} Skills über `skillId` (int-PK) referenziert.\nFilter: q (Name/Code), active.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK — vom Skill-Bedarf als `skillId` referenziert.","type":["integer","null"]},"code":{"type":["string","null"]},"name":{"type":["string","null"]},"category":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"ResourceSkillCatalog.jsonld-resource_skill.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische PK — vom Skill-Bedarf als `skillId` referenziert.","type":["integer","null"]},"code":{"type":["string","null"]},"name":{"type":["string","null"]},"category":{"type":["string","null"]},"active":{"type":["boolean","null"]}}}],"description":"Read-only Skill-Katalog fürs Skill-Matching (04-09 §4.5).\nLiefert zusätzlich numerische `id`, da {@see SkillDemandResource} Skills über `skillId` (int-PK) referenziert.\nFilter: q (Name/Code), active."},"ReturnOrder-return_order.read":{"type":"object","description":"Retouren-Resource (04-22 §8, RMA).\n- Anlage: POST /v1/return-orders {orderUlid, reason, items}\n- Aktionen: approve, receive (restock zubuchen + Gutschrift-Signal), refund, reject\n- ULID-Routen: Format-Requirement wie SalesOrder.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"number":{"type":["string","null"]},"orderId":{"type":["integer","null"]},"orderNumber":{"description":"Quell-Auftragsnummer, read-only, gebatcht statt Client-Katalog (Audit R20 PERF-1/2); null falls OctiSalesOrder inaktiv/Auftrag entfernt.","type":["string","null"]},"reason":{"type":["string","null"]},"refundMode":{"enum":["auto","approval"],"description":"auto|approval — automatische Gutschrift bei einwandfreiem Zustand (S3).","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"status":{"description":"Lebenszyklus-Status requested/approved/received/refunded/rejected (read-only — Übergänge über die Aktionen).","type":["string","null"]},"receivedAt":{"type":["string","null"]},"createdAt":{"description":"Anlagedatum (ISO-8601) — Listenspalte + Default-Sortierung der Retouren-Liste.","type":["string","null"]},"brandId":{"type":["integer","null"]},"customerId":{"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"orderUlid":{"description":"Auftrags-ULID: Eingabe bei POST, beim Lesen ULID des Quell-Auftrags (Deep-Link); null falls OctiSalesOrder inaktiv/Auftrag entfernt.","type":["string","null"]}}},"ReturnOrder-return_order.write":{"type":"object","description":"Retouren-Resource (04-22 §8, RMA).\n- Anlage: POST /v1/return-orders {orderUlid, reason, items}\n- Aktionen: approve, receive (restock zubuchen + Gutschrift-Signal), refund, reject\n- ULID-Routen: Format-Requirement wie SalesOrder.","properties":{"reason":{"type":["string","null"]},"refundMode":{"enum":["auto","approval"],"description":"auto|approval — automatische Gutschrift bei einwandfreiem Zustand (S3).","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"orderUlid":{"description":"Auftrags-ULID: Eingabe bei POST, beim Lesen ULID des Quell-Auftrags (Deep-Link); null falls OctiSalesOrder inaktiv/Auftrag entfernt.","type":["string","null"]}}},"ReturnOrder.jsonld-return_order.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"number":{"type":["string","null"]},"orderId":{"type":["integer","null"]},"orderNumber":{"description":"Quell-Auftragsnummer, read-only, gebatcht statt Client-Katalog (Audit R20 PERF-1/2); null falls OctiSalesOrder inaktiv/Auftrag entfernt.","type":["string","null"]},"reason":{"type":["string","null"]},"refundMode":{"enum":["auto","approval"],"description":"auto|approval — automatische Gutschrift bei einwandfreiem Zustand (S3).","type":["string","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"status":{"description":"Lebenszyklus-Status requested/approved/received/refunded/rejected (read-only — Übergänge über die Aktionen).","type":["string","null"]},"receivedAt":{"type":["string","null"]},"createdAt":{"description":"Anlagedatum (ISO-8601) — Listenspalte + Default-Sortierung der Retouren-Liste.","type":["string","null"]},"brandId":{"type":["integer","null"]},"customerId":{"type":["integer","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"orderUlid":{"description":"Auftrags-ULID: Eingabe bei POST, beim Lesen ULID des Quell-Auftrags (Deep-Link); null falls OctiSalesOrder inaktiv/Auftrag entfernt.","type":["string","null"]}}}],"description":"Retouren-Resource (04-22 §8, RMA).\n- Anlage: POST /v1/return-orders {orderUlid, reason, items}\n- Aktionen: approve, receive (restock zubuchen + Gutschrift-Signal), refund, reject\n- ULID-Routen: Format-Requirement wie SalesOrder."},"ReturnReason-return_reason.read":{"type":"object","description":"Retourengrund-Katalog (Doc 25 AP 3.7, B7).\n\n**Warum diese Resource überhaupt existiert:** der Katalog wurde mit AP 3.7 angelegt und vom\nQuoten-Report gelesen — erreichbar war er von außen nie. Wer eine Retoure anlegt, konnte die\nGründe weder abfragen noch setzen; der Report meldete deshalb strukturell „ohne Grund\"\n(Befund `SESS-RETREASON-01`). Lesen darf, wer Retouren bearbeitet; ändern nur die\nVersand-Konfiguration — ein Grund ist Stammdatum, kein Vorgangsdatum.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"key":{"maxLength":40,"description":"Stabiler Auswertungs-Schlüssel — nach dem Anlegen unveränderlich (er steht in jeder erfassten Position).","type":["string","null"]},"label":{"maxLength":120,"type":["string","null"]},"customerSelectable":{"description":"Darf der Kunde diesen Grund im Portal auswählen? („Vom Versand beschädigt\" sieht erst, wer das Paket öffnet.)","type":["boolean","null"]},"restockByDefault":{"description":"Vorbelegung für „Ware geht zurück ins Lager\" — das letzte Wort hat der Wareneingang.","type":["boolean","null"]},"ourFault":{"description":"Liegt die Ursache bei uns? (Kern der Auswertung — siehe Quoten-Report.)","type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ReturnReason-return_reason.write":{"type":"object","description":"Retourengrund-Katalog (Doc 25 AP 3.7, B7).\n\n**Warum diese Resource überhaupt existiert:** der Katalog wurde mit AP 3.7 angelegt und vom\nQuoten-Report gelesen — erreichbar war er von außen nie. Wer eine Retoure anlegt, konnte die\nGründe weder abfragen noch setzen; der Report meldete deshalb strukturell „ohne Grund\"\n(Befund `SESS-RETREASON-01`). Lesen darf, wer Retouren bearbeitet; ändern nur die\nVersand-Konfiguration — ein Grund ist Stammdatum, kein Vorgangsdatum.","properties":{"key":{"maxLength":40,"description":"Stabiler Auswertungs-Schlüssel — nach dem Anlegen unveränderlich (er steht in jeder erfassten Position).","type":["string","null"]},"label":{"maxLength":120,"type":["string","null"]},"customerSelectable":{"description":"Darf der Kunde diesen Grund im Portal auswählen? („Vom Versand beschädigt\" sieht erst, wer das Paket öffnet.)","type":["boolean","null"]},"restockByDefault":{"description":"Vorbelegung für „Ware geht zurück ins Lager\" — das letzte Wort hat der Wareneingang.","type":["boolean","null"]},"ourFault":{"description":"Liegt die Ursache bei uns? (Kern der Auswertung — siehe Quoten-Report.)","type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ReturnReason-return_reason.write.jsonMergePatch":{"type":"object","description":"Retourengrund-Katalog (Doc 25 AP 3.7, B7).\n\n**Warum diese Resource überhaupt existiert:** der Katalog wurde mit AP 3.7 angelegt und vom\nQuoten-Report gelesen — erreichbar war er von außen nie. Wer eine Retoure anlegt, konnte die\nGründe weder abfragen noch setzen; der Report meldete deshalb strukturell „ohne Grund\"\n(Befund `SESS-RETREASON-01`). Lesen darf, wer Retouren bearbeitet; ändern nur die\nVersand-Konfiguration — ein Grund ist Stammdatum, kein Vorgangsdatum.","properties":{"key":{"maxLength":40,"description":"Stabiler Auswertungs-Schlüssel — nach dem Anlegen unveränderlich (er steht in jeder erfassten Position).","type":["string","null"]},"label":{"maxLength":120,"type":["string","null"]},"customerSelectable":{"description":"Darf der Kunde diesen Grund im Portal auswählen? („Vom Versand beschädigt\" sieht erst, wer das Paket öffnet.)","type":["boolean","null"]},"restockByDefault":{"description":"Vorbelegung für „Ware geht zurück ins Lager\" — das letzte Wort hat der Wareneingang.","type":["boolean","null"]},"ourFault":{"description":"Liegt die Ursache bei uns? (Kern der Auswertung — siehe Quoten-Report.)","type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"ReturnReason.jsonld-return_reason.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"key":{"maxLength":40,"description":"Stabiler Auswertungs-Schlüssel — nach dem Anlegen unveränderlich (er steht in jeder erfassten Position).","type":["string","null"]},"label":{"maxLength":120,"type":["string","null"]},"customerSelectable":{"description":"Darf der Kunde diesen Grund im Portal auswählen? („Vom Versand beschädigt\" sieht erst, wer das Paket öffnet.)","type":["boolean","null"]},"restockByDefault":{"description":"Vorbelegung für „Ware geht zurück ins Lager\" — das letzte Wort hat der Wareneingang.","type":["boolean","null"]},"ourFault":{"description":"Liegt die Ursache bei uns? (Kern der Auswertung — siehe Quoten-Report.)","type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}}],"description":"Retourengrund-Katalog (Doc 25 AP 3.7, B7).\n\n**Warum diese Resource überhaupt existiert:** der Katalog wurde mit AP 3.7 angelegt und vom\nQuoten-Report gelesen — erreichbar war er von außen nie. Wer eine Retoure anlegt, konnte die\nGründe weder abfragen noch setzen; der Report meldete deshalb strukturell „ohne Grund\"\n(Befund `SESS-RETREASON-01`). Lesen darf, wer Retouren bearbeitet; ändern nur die\nVersand-Konfiguration — ein Grund ist Stammdatum, kein Vorgangsdatum."},"Role-role.read":{"type":"object","properties":{"id":{"description":"Bewusst int-PK statt ULID (Katalog ohne ULID-Spalte).","type":["integer","null"]},"name":{"maxLength":100,"default":"","type":"string"},"description":{"maxLength":255,"type":["string","null"]},"system":{"default":false,"type":"boolean"},"permissionNames":{"type":"array","items":{"type":"string"}}},"required":["name"]},"Role-role.write":{"type":"object","required":["name"],"properties":{"name":{"maxLength":100,"default":"","type":"string"},"description":{"maxLength":255,"type":["string","null"]},"permissionNames":{"type":"array","items":{"type":"string"}}}},"Role-role.write.jsonMergePatch":{"type":"object","properties":{"name":{"maxLength":100,"default":"","type":"string"},"description":{"maxLength":255,"type":["string","null"]},"permissionNames":{"type":"array","items":{"type":"string"}}}},"Role.jsonld-role.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Bewusst int-PK statt ULID (Katalog ohne ULID-Spalte).","type":["integer","null"]},"name":{"maxLength":100,"default":"","type":"string"},"description":{"maxLength":255,"type":["string","null"]},"system":{"default":false,"type":"boolean"},"permissionNames":{"type":"array","items":{"type":"string"}}},"required":["name"]}]},"RuleSuggestion-rule_suggestion.read":{"type":"object","description":"Regel-Vorschläge aus dem Triage-Korrektur-Log (AP-7.2, assistiertes Lernen). Read-only;\njeder Vorschlag trägt eine fertige Regel im {@see \\Octi\\Plugin\\Tickets\\Entity\\MailRule}-Format\n(`rule.conditions`/`rule.actions`) → 1-Klick-Übernahme über `POST /v1/ticket-mail-rules`.","properties":{"id":{"default":"","type":"string"},"kind":{"description":"noise | project","default":"","type":"string"},"reason":{"default":"","type":"string"},"occurrences":{"default":0,"type":"integer"},"rule":{"description":"Fertige Regel (name/conditions[Core-Baum]/actions) zur Übernahme.","type":"object","additionalProperties":{"type":["string","null"]}}}},"RuleSuggestion.jsonld-rule_suggestion.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"default":"","type":"string"},"kind":{"description":"noise | project","default":"","type":"string"},"reason":{"default":"","type":"string"},"occurrences":{"default":0,"type":"integer"},"rule":{"description":"Fertige Regel (name/conditions[Core-Baum]/actions) zur Übernahme.","type":"object","additionalProperties":{"type":["string","null"]}}}}],"description":"Regel-Vorschläge aus dem Triage-Korrektur-Log (AP-7.2, assistiertes Lernen). Read-only;\njeder Vorschlag trägt eine fertige Regel im {@see \\Octi\\Plugin\\Tickets\\Entity\\MailRule}-Format\n(`rule.conditions`/`rule.actions`) → 1-Klick-Übernahme über `POST /v1/ticket-mail-rules`."},"SalesChannel-sales_channel.read":{"type":"object","description":"Ein Verkaufskanal (Doc 25 AP 9.1, Spec 04-48).\n\n**Vollständig über die API — auch das Anstossen.** Eine KI kann damit über MCP einen Kanal\neinrichten, Angebote anlegen, abgleichen und am Connect-Journal nachsehen, was passiert ist.","properties":{"ulid":{"type":["string","null"]},"channelKey":{"maxLength":100,"description":"Stabiler Schlüssel — Kennung in Aufträgen, Flows und Exporten; unveränderlich.","type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"connectorType":{"maxLength":60,"description":"Konnektor-Typ; die verfügbaren nennt `GET /v1/channels/connector-types`.","type":["string","null"]},"config":{"description":"Konnektor-eigene Konfiguration nach dessen Schema. Geheimnisse gehören NICHT hierher.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"integrationProvider":{"description":"Provider-Schlüssel der `Integration`, aus der die Zugangsdaten kommen.","type":["string","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"warehouseId":{"minimum":0,"type":["integer","null"]},"stockPercent":{"minimum":1,"maximum":100,"description":"Anteil des verfügbaren Bestands, den der Kanal sehen darf (1–100).","type":["integer","null"]},"stockBuffer":{"minimum":0,"description":"Sockel, den der Kanal NIE sieht — Schutz gegen Überverkauf.","type":["integer","null"]},"priceCustomerUlid":{"description":"Kunde, unter dessen Preisen der Kanal rechnet (ULID); leer = Listenpreis.","type":["string","null"]},"fallbackCustomerUlid":{"description":"Sammelkunde für Bestellungen ohne Treffer per E-Mail (ULID).","type":["string","null"]},"runAsUserUlid":{"description":"Benutzer, unter dessen Rechten der Kanal Aufträge anlegt (ULID).","type":["string","null"]},"autoConfirmOrders":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"ordersSyncedAt":{"type":["string","null"]},"capabilities":{"description":"Was der Konnektor kann — der Rahmen versucht nur, was gemeldet wurde.","type":"object","additionalProperties":{"type":"boolean"}},"listingCount":{"type":["integer","null"]},"valid":{"description":"Antwort von `test-connection`/`activate`.","type":["boolean","null"]},"errors":{"type":"array","items":{"type":"string"}},"result":{"description":"Antwort von `sync`/`orders` — Zahlen des Laufs.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SalesChannel-sales_channel.write":{"type":"object","description":"Ein Verkaufskanal (Doc 25 AP 9.1, Spec 04-48).\n\n**Vollständig über die API — auch das Anstossen.** Eine KI kann damit über MCP einen Kanal\neinrichten, Angebote anlegen, abgleichen und am Connect-Journal nachsehen, was passiert ist.","properties":{"orders":{"description":"NUR SCHREIBEN (Aktion `orders`): bereits zugeordnete Bestellungen — eine oder eine Liste.","type":["array","null"],"items":{"type":["string","null"]}},"channelKey":{"maxLength":100,"description":"Stabiler Schlüssel — Kennung in Aufträgen, Flows und Exporten; unveränderlich.","type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"connectorType":{"maxLength":60,"description":"Konnektor-Typ; die verfügbaren nennt `GET /v1/channels/connector-types`.","type":["string","null"]},"config":{"description":"Konnektor-eigene Konfiguration nach dessen Schema. Geheimnisse gehören NICHT hierher.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"integrationProvider":{"description":"Provider-Schlüssel der `Integration`, aus der die Zugangsdaten kommen.","type":["string","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"warehouseId":{"minimum":0,"type":["integer","null"]},"stockPercent":{"minimum":1,"maximum":100,"description":"Anteil des verfügbaren Bestands, den der Kanal sehen darf (1–100).","type":["integer","null"]},"stockBuffer":{"minimum":0,"description":"Sockel, den der Kanal NIE sieht — Schutz gegen Überverkauf.","type":["integer","null"]},"priceCustomerUlid":{"description":"Kunde, unter dessen Preisen der Kanal rechnet (ULID); leer = Listenpreis.","type":["string","null"]},"fallbackCustomerUlid":{"description":"Sammelkunde für Bestellungen ohne Treffer per E-Mail (ULID).","type":["string","null"]},"runAsUserUlid":{"description":"Benutzer, unter dessen Rechten der Kanal Aufträge anlegt (ULID).","type":["string","null"]},"autoConfirmOrders":{"type":["boolean","null"]},"operation":{"description":"Nur `sync`: listings|stock|prices|orders.","type":["string","null"]},"force":{"type":["boolean","null"]}}},"SalesChannel-sales_channel.write.jsonMergePatch":{"type":"object","description":"Ein Verkaufskanal (Doc 25 AP 9.1, Spec 04-48).\n\n**Vollständig über die API — auch das Anstossen.** Eine KI kann damit über MCP einen Kanal\neinrichten, Angebote anlegen, abgleichen und am Connect-Journal nachsehen, was passiert ist.","properties":{"orders":{"description":"NUR SCHREIBEN (Aktion `orders`): bereits zugeordnete Bestellungen — eine oder eine Liste.","type":["array","null"],"items":{"type":["string","null"]}},"channelKey":{"maxLength":100,"description":"Stabiler Schlüssel — Kennung in Aufträgen, Flows und Exporten; unveränderlich.","type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"connectorType":{"maxLength":60,"description":"Konnektor-Typ; die verfügbaren nennt `GET /v1/channels/connector-types`.","type":["string","null"]},"config":{"description":"Konnektor-eigene Konfiguration nach dessen Schema. Geheimnisse gehören NICHT hierher.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"integrationProvider":{"description":"Provider-Schlüssel der `Integration`, aus der die Zugangsdaten kommen.","type":["string","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"warehouseId":{"minimum":0,"type":["integer","null"]},"stockPercent":{"minimum":1,"maximum":100,"description":"Anteil des verfügbaren Bestands, den der Kanal sehen darf (1–100).","type":["integer","null"]},"stockBuffer":{"minimum":0,"description":"Sockel, den der Kanal NIE sieht — Schutz gegen Überverkauf.","type":["integer","null"]},"priceCustomerUlid":{"description":"Kunde, unter dessen Preisen der Kanal rechnet (ULID); leer = Listenpreis.","type":["string","null"]},"fallbackCustomerUlid":{"description":"Sammelkunde für Bestellungen ohne Treffer per E-Mail (ULID).","type":["string","null"]},"runAsUserUlid":{"description":"Benutzer, unter dessen Rechten der Kanal Aufträge anlegt (ULID).","type":["string","null"]},"autoConfirmOrders":{"type":["boolean","null"]},"operation":{"description":"Nur `sync`: listings|stock|prices|orders.","type":["string","null"]},"force":{"type":["boolean","null"]}}},"SalesChannel.jsonld-sales_channel.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"channelKey":{"maxLength":100,"description":"Stabiler Schlüssel — Kennung in Aufträgen, Flows und Exporten; unveränderlich.","type":["string","null"]},"name":{"maxLength":160,"type":["string","null"]},"connectorType":{"maxLength":60,"description":"Konnektor-Typ; die verfügbaren nennt `GET /v1/channels/connector-types`.","type":["string","null"]},"config":{"description":"Konnektor-eigene Konfiguration nach dessen Schema. Geheimnisse gehören NICHT hierher.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"integrationProvider":{"description":"Provider-Schlüssel der `Integration`, aus der die Zugangsdaten kommen.","type":["string","null"]},"brandId":{"minimum":0,"type":["integer","null"]},"warehouseId":{"minimum":0,"type":["integer","null"]},"stockPercent":{"minimum":1,"maximum":100,"description":"Anteil des verfügbaren Bestands, den der Kanal sehen darf (1–100).","type":["integer","null"]},"stockBuffer":{"minimum":0,"description":"Sockel, den der Kanal NIE sieht — Schutz gegen Überverkauf.","type":["integer","null"]},"priceCustomerUlid":{"description":"Kunde, unter dessen Preisen der Kanal rechnet (ULID); leer = Listenpreis.","type":["string","null"]},"fallbackCustomerUlid":{"description":"Sammelkunde für Bestellungen ohne Treffer per E-Mail (ULID).","type":["string","null"]},"runAsUserUlid":{"description":"Benutzer, unter dessen Rechten der Kanal Aufträge anlegt (ULID).","type":["string","null"]},"autoConfirmOrders":{"type":["boolean","null"]},"active":{"type":["boolean","null"]},"ordersSyncedAt":{"type":["string","null"]},"capabilities":{"description":"Was der Konnektor kann — der Rahmen versucht nur, was gemeldet wurde.","type":"object","additionalProperties":{"type":"boolean"}},"listingCount":{"type":["integer","null"]},"valid":{"description":"Antwort von `test-connection`/`activate`.","type":["boolean","null"]},"errors":{"type":"array","items":{"type":"string"}},"result":{"description":"Antwort von `sync`/`orders` — Zahlen des Laufs.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"Ein Verkaufskanal (Doc 25 AP 9.1, Spec 04-48).\n\n**Vollständig über die API — auch das Anstossen.** Eine KI kann damit über MCP einen Kanal\neinrichten, Angebote anlegen, abgleichen und am Connect-Journal nachsehen, was passiert ist."},"SalesGoal-sales_goal.read":{"type":"object","description":"Vertriebsziel (Doc 19 Phase 4) — CRUD `/api/v1/sales-goals`.\n{@see $currentAmount}/{@see $progressPercent}: read-only, berechnet bei jedem Read.\nSecurity via Operations-`security`; Marken-Scope/IDOR in Provider/Processor.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"metric":{"enum":["revenue_won","deals_won","deals_added","deals_progressed","activities_logged"],"description":"revenue_won = Umsatz (Cent) · deals_won = Anzahl gewonnener Deals.","default":"revenue_won","type":"string"},"targetAmount":{"minimum":0,"description":"Zielwert: Cent bei revenue_won, Stückzahl bei deals_won.","default":0,"type":"integer"},"periodStart":{"type":["string","null"],"format":"date-time"},"periodEnd":{"type":["string","null"],"format":"date-time"},"ownerId":{"description":"Optionaler Inhaber (User-Id); null = team-/firmenweit.","type":["integer","null"]},"teamId":{"description":"Optionales Team (Team-Id, Doc 26 6.3): aggregiert über alle Team-Mitglieder statt eines Inhabers.","type":["integer","null"]},"recurrence":{"enum":["none","monthly","quarterly"],"description":"Wiederkehrende Periode (none/monthly/quarterly, Doc 26 6.3).","default":"none","type":"string"},"pipelineId":{"description":"Optionale Pipeline-Einschränkung; null = alle Pipelines.","type":["integer","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"currentAmount":{"description":"Read-only: aktueller Ist-Wert (Cent oder Anzahl) im Zielzeitfenster/Scope.","type":["integer","null"]},"progressPercent":{"description":"Read-only: Fortschritt in Prozent (0..100+).","type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name","periodStart","periodEnd"]},"SalesGoal-sales_goal.write":{"type":"object","description":"Vertriebsziel (Doc 19 Phase 4) — CRUD `/api/v1/sales-goals`.\n{@see $currentAmount}/{@see $progressPercent}: read-only, berechnet bei jedem Read.\nSecurity via Operations-`security`; Marken-Scope/IDOR in Provider/Processor.","required":["name","periodStart","periodEnd"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"metric":{"enum":["revenue_won","deals_won","deals_added","deals_progressed","activities_logged"],"description":"revenue_won = Umsatz (Cent) · deals_won = Anzahl gewonnener Deals.","default":"revenue_won","type":"string"},"targetAmount":{"minimum":0,"description":"Zielwert: Cent bei revenue_won, Stückzahl bei deals_won.","default":0,"type":"integer"},"periodStart":{"type":["string","null"],"format":"date-time"},"periodEnd":{"type":["string","null"],"format":"date-time"},"ownerId":{"description":"Optionaler Inhaber (User-Id); null = team-/firmenweit.","type":["integer","null"]},"teamId":{"description":"Optionales Team (Team-Id, Doc 26 6.3): aggregiert über alle Team-Mitglieder statt eines Inhabers.","type":["integer","null"]},"recurrence":{"enum":["none","monthly","quarterly"],"description":"Wiederkehrende Periode (none/monthly/quarterly, Doc 26 6.3).","default":"none","type":"string"},"pipelineId":{"description":"Optionale Pipeline-Einschränkung; null = alle Pipelines.","type":["integer","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"}}},"SalesGoal-sales_goal.write.jsonMergePatch":{"type":"object","description":"Vertriebsziel (Doc 19 Phase 4) — CRUD `/api/v1/sales-goals`.\n{@see $currentAmount}/{@see $progressPercent}: read-only, berechnet bei jedem Read.\nSecurity via Operations-`security`; Marken-Scope/IDOR in Provider/Processor.","properties":{"name":{"maxLength":255,"default":"","type":"string"},"metric":{"enum":["revenue_won","deals_won","deals_added","deals_progressed","activities_logged"],"description":"revenue_won = Umsatz (Cent) · deals_won = Anzahl gewonnener Deals.","default":"revenue_won","type":"string"},"targetAmount":{"minimum":0,"description":"Zielwert: Cent bei revenue_won, Stückzahl bei deals_won.","default":0,"type":"integer"},"periodStart":{"type":["string","null"],"format":"date-time"},"periodEnd":{"type":["string","null"],"format":"date-time"},"ownerId":{"description":"Optionaler Inhaber (User-Id); null = team-/firmenweit.","type":["integer","null"]},"teamId":{"description":"Optionales Team (Team-Id, Doc 26 6.3): aggregiert über alle Team-Mitglieder statt eines Inhabers.","type":["integer","null"]},"recurrence":{"enum":["none","monthly","quarterly"],"description":"Wiederkehrende Periode (none/monthly/quarterly, Doc 26 6.3).","default":"none","type":"string"},"pipelineId":{"description":"Optionale Pipeline-Einschränkung; null = alle Pipelines.","type":["integer","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"}}},"SalesGoal.jsonld-sales_goal.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"metric":{"enum":["revenue_won","deals_won","deals_added","deals_progressed","activities_logged"],"description":"revenue_won = Umsatz (Cent) · deals_won = Anzahl gewonnener Deals.","default":"revenue_won","type":"string"},"targetAmount":{"minimum":0,"description":"Zielwert: Cent bei revenue_won, Stückzahl bei deals_won.","default":0,"type":"integer"},"periodStart":{"type":["string","null"],"format":"date-time"},"periodEnd":{"type":["string","null"],"format":"date-time"},"ownerId":{"description":"Optionaler Inhaber (User-Id); null = team-/firmenweit.","type":["integer","null"]},"teamId":{"description":"Optionales Team (Team-Id, Doc 26 6.3): aggregiert über alle Team-Mitglieder statt eines Inhabers.","type":["integer","null"]},"recurrence":{"enum":["none","monthly","quarterly"],"description":"Wiederkehrende Periode (none/monthly/quarterly, Doc 26 6.3).","default":"none","type":"string"},"pipelineId":{"description":"Optionale Pipeline-Einschränkung; null = alle Pipelines.","type":["integer","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"currentAmount":{"description":"Read-only: aktueller Ist-Wert (Cent oder Anzahl) im Zielzeitfenster/Scope.","type":["integer","null"]},"progressPercent":{"description":"Read-only: Fortschritt in Prozent (0..100+).","type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name","periodStart","periodEnd"]}],"description":"Vertriebsziel (Doc 19 Phase 4) — CRUD `/api/v1/sales-goals`.\n{@see $currentAmount}/{@see $progressPercent}: read-only, berechnet bei jedem Read.\nSecurity via Operations-`security`; Marken-Scope/IDOR in Provider/Processor."},"SalesGoalRoll-sales_goal_roll.read":{"type":"object","description":"Roll-Lauf der wiederkehrenden Vertriebsziele als API-Aktion\n(`POST /v1/sales-goals/roll-recurring` → `{rolled, asOf}`).\n\n- API-Pendant zu `octibiz:sales-goals:roll-recurring` und zum täglichen Zeitplan-Lauf; vorher gab\n  es die Fähigkeit NUR auf der Konsole (Systemaudit R38-22, P-1/P-2)\n- dieselbe Fachlogik unter demselben `default-schedule`-Lock wie Zeitplan/CLI (belegt → 409)\n- die ULID-Routen der Ziel-Resource sind GET/PATCH/DELETE — das POST-Literal `roll-recurring`\n  kollidiert deshalb nicht (Muster {@see \\Octi\\Plugin\\Billing\\ApiResource\\RecurringRunResource}).","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"SalesGoalRoll-sales_goal_roll.write":{"type":"object","description":"Roll-Lauf der wiederkehrenden Vertriebsziele als API-Aktion\n(`POST /v1/sales-goals/roll-recurring` → `{rolled, asOf}`).\n\n- API-Pendant zu `octibiz:sales-goals:roll-recurring` und zum täglichen Zeitplan-Lauf; vorher gab\n  es die Fähigkeit NUR auf der Konsole (Systemaudit R38-22, P-1/P-2)\n- dieselbe Fachlogik unter demselben `default-schedule`-Lock wie Zeitplan/CLI (belegt → 409)\n- die ULID-Routen der Ziel-Resource sind GET/PATCH/DELETE — das POST-Literal `roll-recurring`\n  kollidiert deshalb nicht (Muster {@see \\Octi\\Plugin\\Billing\\ApiResource\\RecurringRunResource}).","properties":{"asOfDate":{"description":"Optionaler Stichtag (YYYY-MM-DD); ohne Angabe heute — wie `--date` des Konsolenbefehls.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]}}},"SalesGoalRoll.jsonld-sales_goal_roll.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"Roll-Lauf der wiederkehrenden Vertriebsziele als API-Aktion\n(`POST /v1/sales-goals/roll-recurring` → `{rolled, asOf}`).\n\n- API-Pendant zu `octibiz:sales-goals:roll-recurring` und zum täglichen Zeitplan-Lauf; vorher gab\n  es die Fähigkeit NUR auf der Konsole (Systemaudit R38-22, P-1/P-2)\n- dieselbe Fachlogik unter demselben `default-schedule`-Lock wie Zeitplan/CLI (belegt → 409)\n- die ULID-Routen der Ziel-Resource sind GET/PATCH/DELETE — das POST-Literal `roll-recurring`\n  kollidiert deshalb nicht (Muster {@see \\Octi\\Plugin\\Billing\\ApiResource\\RecurringRunResource})."},"SalesOrder-sales_order.read":{"type":"object","description":"Auftrags-Resource (04-19 §8).\n- Positionen (`items`) eingebettet, Bepreisung via Kernel-LineCalculator, Summen read-only.\n- PATCH/DELETE nur im Entwurf (sonst 409) — Änderung sonst über Storno/Neuanlage.\n- ULID-Requirement nötig, damit `statuses`/`from-quote` nicht als {ulid} matchen.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"type":["string","null"]},"status":{"description":"Lebenszyklus-Status — read-only für CRUD (Übergänge nur via Aktions-Operationen); schreibbar\n einzig als payment-received-Payload ({status: partial|paid}), sonst ignoriert.","type":["string","null"]},"editable":{"description":"Kopfdaten editierbar? true bis Endzustand (abgeschlossen/storniert) — SSoT fürs Frontend-Gating.","type":["boolean","null"]},"itemsEditable":{"description":"Positionen editierbar? Nur bis zum ersten physischen Schritt (Entwurf, oder bestätigt/on_hold\n ohne Lieferung/Faktura/Dropship).","type":["boolean","null"]},"origin":{"type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"orderedAt":{"type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"requestedDeliveryDate":{"type":["string","null"]},"billingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"paymentMethod":{"maxLength":30,"type":["string","null"]},"paymentTerms":{"maxLength":100,"type":["string","null"]},"depositPercent":{"type":["string","null"]},"depositAmount":{"description":"Anzahlung in Cent.","type":["integer","null"]},"deliveryBlockedUntilPaid":{"description":"Vorkasse: Liefersperre bis Zahlung/Anzahlung (on_hold).","type":["boolean","null"]},"fulfillmentType":{"enum":["stock","dropship"],"description":"stock|dropship (Auftrags-Default; je Position überschreibbar).","type":["string","null"]},"allowConsolidation":{"type":["boolean","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"confirmationSentAt":{"type":["string","null"]},"mailSent":{"description":"send-confirmation-Antwort: AB-Mail erfolgreich an den Mailer übergeben?","type":["boolean","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland, ohne USt).","type":["string","null"]},"currency":{"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieses Belegs stehen in ihr; ohne\naktive Mehrwährung ist alles ausser `EUR` ein 422.","type":["string","null"]},"fxRate":{"description":"Eingefrorener Umrechnungskurs (Fremdwährungseinheiten je 1 EUR); EUR-Beleg → \"1.00000000\".","type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]},"recurringSourceId":{"type":["string","null"]},"deliveryStatus":{"type":["string","null"]},"invoiceStatus":{"type":["string","null"]},"paymentStatus":{"type":["string","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"availableOutputWays":{"description":"Ausgabewege, die dieser Beleg anbieten kann (Doc 40 Stufe 6) — nur an der Einzelansicht\ngefüllt; die Oberfläche schaltet daran ihre Schalter scharf.","type":["array","null"],"items":{"type":"string"}},"standingAttachments":{"description":"Feste Beleg-Beilagen, die an diesem Beleg automatisch mitgehen (Doc 40) — nur an der\nEinzelansicht gefüllt, damit der Abschluss-Dialog sie zeigen kann.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}},"SalesOrder-sales_order.write":{"type":"object","description":"Auftrags-Resource (04-19 §8).\n- Positionen (`items`) eingebettet, Bepreisung via Kernel-LineCalculator, Summen read-only.\n- PATCH/DELETE nur im Entwurf (sonst 409) — Änderung sonst über Storno/Neuanlage.\n- ULID-Requirement nötig, damit `statuses`/`from-quote` nicht als {ulid} matchen.","properties":{"status":{"description":"Lebenszyklus-Status — read-only für CRUD (Übergänge nur via Aktions-Operationen); schreibbar\n einzig als payment-received-Payload ({status: partial|paid}), sonst ignoriert.","type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"requestedDeliveryDate":{"type":["string","null"]},"billingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"paymentMethod":{"maxLength":30,"type":["string","null"]},"paymentTerms":{"maxLength":100,"type":["string","null"]},"depositPercent":{"type":["string","null"]},"depositAmount":{"description":"Anzahlung in Cent.","type":["integer","null"]},"deliveryBlockedUntilPaid":{"description":"Vorkasse: Liefersperre bis Zahlung/Anzahlung (on_hold).","type":["boolean","null"]},"fulfillmentType":{"enum":["stock","dropship"],"description":"stock|dropship (Auftrags-Default; je Position überschreibbar).","type":["string","null"]},"allowConsolidation":{"type":["boolean","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland, ohne USt).","type":["string","null"]},"currency":{"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieses Belegs stehen in ihr; ohne\naktive Mehrwährung ist alles ausser `EUR` ein 422.","type":["string","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"quoteUlid":{"description":"Angebots-ULID für die from-quote-Aktion.","type":["string","null"]},"dispatch":{"description":"Belegausgabe der Auftragsbestätigung (Doc 40 Stufe 5, ENT-BELEG-04) — Form wie bei\n{@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteResource::$dispatch}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SalesOrder-sales_order.write.jsonMergePatch":{"type":"object","description":"Auftrags-Resource (04-19 §8).\n- Positionen (`items`) eingebettet, Bepreisung via Kernel-LineCalculator, Summen read-only.\n- PATCH/DELETE nur im Entwurf (sonst 409) — Änderung sonst über Storno/Neuanlage.\n- ULID-Requirement nötig, damit `statuses`/`from-quote` nicht als {ulid} matchen.","properties":{"status":{"description":"Lebenszyklus-Status — read-only für CRUD (Übergänge nur via Aktions-Operationen); schreibbar\n einzig als payment-received-Payload ({status: partial|paid}), sonst ignoriert.","type":["string","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"requestedDeliveryDate":{"type":["string","null"]},"billingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"paymentMethod":{"maxLength":30,"type":["string","null"]},"paymentTerms":{"maxLength":100,"type":["string","null"]},"depositPercent":{"type":["string","null"]},"depositAmount":{"description":"Anzahlung in Cent.","type":["integer","null"]},"deliveryBlockedUntilPaid":{"description":"Vorkasse: Liefersperre bis Zahlung/Anzahlung (on_hold).","type":["boolean","null"]},"fulfillmentType":{"enum":["stock","dropship"],"description":"stock|dropship (Auftrags-Default; je Position überschreibbar).","type":["string","null"]},"allowConsolidation":{"type":["boolean","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland, ohne USt).","type":["string","null"]},"currency":{"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieses Belegs stehen in ihr; ohne\naktive Mehrwährung ist alles ausser `EUR` ein 422.","type":["string","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"quoteUlid":{"description":"Angebots-ULID für die from-quote-Aktion.","type":["string","null"]},"dispatch":{"description":"Belegausgabe der Auftragsbestätigung (Doc 40 Stufe 5, ENT-BELEG-04) — Form wie bei\n{@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteResource::$dispatch}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SalesOrder.jsonld-sales_order.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"number":{"type":["string","null"]},"status":{"description":"Lebenszyklus-Status — read-only für CRUD (Übergänge nur via Aktions-Operationen); schreibbar\n einzig als payment-received-Payload ({status: partial|paid}), sonst ignoriert.","type":["string","null"]},"editable":{"description":"Kopfdaten editierbar? true bis Endzustand (abgeschlossen/storniert) — SSoT fürs Frontend-Gating.","type":["boolean","null"]},"itemsEditable":{"description":"Positionen editierbar? Nur bis zum ersten physischen Schritt (Entwurf, oder bestätigt/on_hold\n ohne Lieferung/Faktura/Dropship).","type":["boolean","null"]},"origin":{"type":["string","null"]},"externalRefs":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"orderedAt":{"type":["string","null"]},"paymentTermUlid":{"description":"Zahlungsbedingung aus dem Kernel-Stammdatum (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"requestedDeliveryDate":{"type":["string","null"]},"billingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"shippingAddress":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"paymentMethod":{"maxLength":30,"type":["string","null"]},"paymentTerms":{"maxLength":100,"type":["string","null"]},"depositPercent":{"type":["string","null"]},"depositAmount":{"description":"Anzahlung in Cent.","type":["integer","null"]},"deliveryBlockedUntilPaid":{"description":"Vorkasse: Liefersperre bis Zahlung/Anzahlung (on_hold).","type":["boolean","null"]},"fulfillmentType":{"enum":["stock","dropship"],"description":"stock|dropship (Auftrags-Default; je Position überschreibbar).","type":["string","null"]},"allowConsolidation":{"type":["boolean","null"]},"documentTemplateId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"confirmationSentAt":{"type":["string","null"]},"mailSent":{"description":"send-confirmation-Antwort: AB-Mail erfolgreich an den Mailer übergeben?","type":["boolean","null"]},"documentDiscountPercent":{"minimum":0,"maximum":100,"description":"Belegweiter Rabatt in Prozent auf das Positionsnetto (04-17 §6).","type":["number","null"]},"documentDiscountAmount":{"minimum":0,"description":"Belegweiter Absolutrabatt in Cent (zusätzlich zum Prozentsatz).","type":["integer","null"]},"taxDisplayMode":{"enum":["net","gross","tax_free"],"description":"Steuer-Darstellung (KG5): net (B2B) | gross (B2C) | tax_free (Ausland, ohne USt).","type":["string","null"]},"currency":{"description":"Belegwährung (ISO 4217, Doc 25 AP 10.1). Alle Beträge dieses Belegs stehen in ihr; ohne\naktive Mehrwährung ist alles ausser `EUR` ein 422.","type":["string","null"]},"fxRate":{"description":"Eingefrorener Umrechnungskurs (Fremdwährungseinheiten je 1 EUR); EUR-Beleg → \"1.00000000\".","type":["string","null"]},"subtotalAmount":{"type":["integer","null"]},"taxTotalAmount":{"type":["integer","null"]},"totalAmount":{"type":["integer","null"]},"sourceQuoteId":{"type":["integer","null"]},"recurringSourceId":{"type":["string","null"]},"deliveryStatus":{"type":["string","null"]},"invoiceStatus":{"type":["string","null"]},"paymentStatus":{"type":["string","null"]},"items":{"description":"Positionen.","type":["array","null"],"items":{"type":["string","null"]}},"availableOutputWays":{"description":"Ausgabewege, die dieser Beleg anbieten kann (Doc 40 Stufe 6) — nur an der Einzelansicht\ngefüllt; die Oberfläche schaltet daran ihre Schalter scharf.","type":["array","null"],"items":{"type":"string"}},"standingAttachments":{"description":"Feste Beleg-Beilagen, die an diesem Beleg automatisch mitgehen (Doc 40) — nur an der\nEinzelansicht gefüllt, damit der Abschluss-Dialog sie zeigen kann.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}}}}],"description":"Auftrags-Resource (04-19 §8).\n- Positionen (`items`) eingebettet, Bepreisung via Kernel-LineCalculator, Summen read-only.\n- PATCH/DELETE nur im Entwurf (sonst 409) — Änderung sonst über Storno/Neuanlage.\n- ULID-Requirement nötig, damit `statuses`/`from-quote` nicht als {ulid} matchen."},"SalesOrderShippingReadiness-shipping_readiness.read":{"type":"object","description":"Auftragsampel (Doc 25 AP 3.1, B4a) — Versandfreigabe je Auftrag.\n\nDie Antwort nennt **jedes Kriterium einzeln mit Begründung**, nicht nur eine Gesamtfarbe. Ein\nblankes „rot\" ist im Betrieb wertlos: die Frage am Packtisch lautet nicht, ob der Auftrag\nblockiert ist, sondern warum — und wer das abstellen kann.","properties":{"ulid":{"type":["string","null"]},"status":{"description":"`green` · `yellow` · `red` — die Gesamtaussage nach der Freigabe-Regel.","type":["string","null"]},"released":{"description":"Liegt eine manuelle Freigabe vor?","default":false,"type":"boolean"},"releasedAt":{"type":["string","null"]},"releasedBy":{"type":["string","null"]},"releaseReason":{"type":["string","null"]},"checks":{"description":"Ein Eintrag je Kriterium: `key`, `status`, `reasonKey`, `reasonParams`, `reason`, `overridable`.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}},{"type":"boolean"},{"type":"string"},{"type":"null"}]}}},"chargeApplied":{"description":"Antwort von `shipping-charge`: wurde eine Versandzeile geschrieben?","type":["boolean","null"]},"chargeAmount":{"description":"Antwort von `shipping-charge`: Betrag der Versandzeile in Cent.","type":["integer","null"]},"freeShipping":{"description":"Antwort von `shipping-charge`: greift die Versandkostenfrei-Schwelle?","type":["boolean","null"]},"ruleService":{"description":"Antwort von `shipping-charge`: Versandart, die die Regel vorschreibt.","type":["string","null"]}}},"SalesOrderShippingReadiness-shipping_readiness.write":{"type":"object","description":"Auftragsampel (Doc 25 AP 3.1, B4a) — Versandfreigabe je Auftrag.\n\nDie Antwort nennt **jedes Kriterium einzeln mit Begründung**, nicht nur eine Gesamtfarbe. Ein\nblankes „rot\" ist im Betrieb wertlos: die Frage am Packtisch lautet nicht, ob der Auftrag\nblockiert ist, sondern warum — und wer das abstellen kann.","properties":{"reason":{"description":"Pflicht bei `release-shipping` — die Begründung ist der Prüfpfad.","type":["string","null"]},"carrierKey":{"description":"Nur `shipping-charge`: Versanddienstleister, für den gerechnet wird (optional).","type":["string","null"]}}},"SalesOrderShippingReadiness.jsonld-shipping_readiness.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"status":{"description":"`green` · `yellow` · `red` — die Gesamtaussage nach der Freigabe-Regel.","type":["string","null"]},"released":{"description":"Liegt eine manuelle Freigabe vor?","default":false,"type":"boolean"},"releasedAt":{"type":["string","null"]},"releasedBy":{"type":["string","null"]},"releaseReason":{"type":["string","null"]},"checks":{"description":"Ein Eintrag je Kriterium: `key`, `status`, `reasonKey`, `reasonParams`, `reason`, `overridable`.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}},{"type":"boolean"},{"type":"string"},{"type":"null"}]}}},"chargeApplied":{"description":"Antwort von `shipping-charge`: wurde eine Versandzeile geschrieben?","type":["boolean","null"]},"chargeAmount":{"description":"Antwort von `shipping-charge`: Betrag der Versandzeile in Cent.","type":["integer","null"]},"freeShipping":{"description":"Antwort von `shipping-charge`: greift die Versandkostenfrei-Schwelle?","type":["boolean","null"]},"ruleService":{"description":"Antwort von `shipping-charge`: Versandart, die die Regel vorschreibt.","type":["string","null"]}}}],"description":"Auftragsampel (Doc 25 AP 3.1, B4a) — Versandfreigabe je Auftrag.\n\nDie Antwort nennt **jedes Kriterium einzeln mit Begründung**, nicht nur eine Gesamtfarbe. Ein\nblankes „rot\" ist im Betrieb wertlos: die Frage am Packtisch lautet nicht, ob der Auftrag\nblockiert ist, sondern warum — und wer das abstellen kann."},"SalesOrderStatus-sales_order_status.read":{"type":"object","description":"Auftrags-Status als Daten (04-19 §3, Muster QuoteStatusResource) — konfigurierbar ohne Code.\nUnter `sales-orders` geführt (`/v1/sales-orders/statuses`, Modul-Gate ohne Descriptor-Erweiterung);\nULID-Routen matchen `statuses` nicht (Format-Requirement).","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"SalesOrderStatus-sales_order_status.update.jsonMergePatch":{"type":"object","description":"Auftrags-Status als Daten (04-19 §3, Muster QuoteStatusResource) — konfigurierbar ohne Code.\nUnter `sales-orders` geführt (`/v1/sales-orders/statuses`, Modul-Gate ohne Descriptor-Erweiterung);\nULID-Routen matchen `statuses` nicht (Format-Requirement).","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"SalesOrderStatus-sales_order_status.write":{"type":"object","description":"Auftrags-Status als Daten (04-19 §3, Muster QuoteStatusResource) — konfigurierbar ohne Code.\nUnter `sales-orders` geführt (`/v1/sales-orders/statuses`, Modul-Gate ohne Descriptor-Erweiterung);\nULID-Routen matchen `statuses` nicht (Format-Requirement).","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"SalesOrderStatus.jsonld-sales_order_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","active","done","cancelled"],"description":"open|active|done|cancelled.","type":["string","null"]},"color":{"type":["string","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Auftrags-Status als Daten (04-19 §3, Muster QuoteStatusResource) — konfigurierbar ohne Code.\nUnter `sales-orders` geführt (`/v1/sales-orders/statuses`, Modul-Gate ohne Descriptor-Erweiterung);\nULID-Routen matchen `statuses` nicht (Format-Requirement)."},"SalesOrderVoucher-sales_order_voucher.read":{"type":"object","description":"Gutschein-Einlösung am Auftrag (Doc 25 AP 6.3).\n\nDie Einlösung sitzt beim BELEG, nicht beim Gutschein: eingelöst wird immer „auf diesen\nAuftrag\", und wer den Auftrag bearbeiten darf, darf auch den Code eintragen. Der Gutschein\nselbst (Anlage, Restwert, Gültigkeit) wird in `/v1/promotions/vouchers` gepflegt und braucht\nein anderes Recht.","properties":{"ulid":{"type":["string","null"]},"code":{"description":"Einzulösender bzw. zurückzunehmender Code (Gross-/Kleinschreibung egal).","type":["string","null"]},"succeeded":{"description":"Wurde eine Einlösung geschrieben bzw. zurückgenommen?","default":false,"type":"boolean"},"amount":{"description":"Angerechneter Betrag in Cent (netto) — bei der Rücknahme der zurückgegebene Betrag.","default":0,"type":"integer"},"remaining":{"description":"Restwert des Gutscheins in Cent nach dem Vorgang; null bei Prozent-Gutscheinen.","type":["integer","null"]},"orderTotalAmount":{"description":"Belegsumme des Auftrags nach dem Vorgang in Cent.","type":["integer","null"]},"applied":{"description":"Offen eingelöste Gutscheine dieses Auftrags — je Eintrag `code`, `amount`, `redeemedAt`.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}},"SalesOrderVoucher-sales_order_voucher.write":{"type":"object","description":"Gutschein-Einlösung am Auftrag (Doc 25 AP 6.3).\n\nDie Einlösung sitzt beim BELEG, nicht beim Gutschein: eingelöst wird immer „auf diesen\nAuftrag\", und wer den Auftrag bearbeiten darf, darf auch den Code eintragen. Der Gutschein\nselbst (Anlage, Restwert, Gültigkeit) wird in `/v1/promotions/vouchers` gepflegt und braucht\nein anderes Recht.","properties":{"code":{"description":"Einzulösender bzw. zurückzunehmender Code (Gross-/Kleinschreibung egal).","type":["string","null"]}}},"SalesOrderVoucher.jsonld-sales_order_voucher.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"code":{"description":"Einzulösender bzw. zurückzunehmender Code (Gross-/Kleinschreibung egal).","type":["string","null"]},"succeeded":{"description":"Wurde eine Einlösung geschrieben bzw. zurückgenommen?","default":false,"type":"boolean"},"amount":{"description":"Angerechneter Betrag in Cent (netto) — bei der Rücknahme der zurückgegebene Betrag.","default":0,"type":"integer"},"remaining":{"description":"Restwert des Gutscheins in Cent nach dem Vorgang; null bei Prozent-Gutscheinen.","type":["integer","null"]},"orderTotalAmount":{"description":"Belegsumme des Auftrags nach dem Vorgang in Cent.","type":["integer","null"]},"applied":{"description":"Offen eingelöste Gutscheine dieses Auftrags — je Eintrag `code`, `amount`, `redeemedAt`.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}}],"description":"Gutschein-Einlösung am Auftrag (Doc 25 AP 6.3).\n\nDie Einlösung sitzt beim BELEG, nicht beim Gutschein: eingelöst wird immer „auf diesen\nAuftrag\", und wer den Auftrag bearbeiten darf, darf auch den Code eintragen. Der Gutschein\nselbst (Anlage, Restwert, Gültigkeit) wird in `/v1/promotions/vouchers` gepflegt und braucht\nein anderes Recht."},"SalesSequence-sales_sequence.read":{"type":"object","description":"Sales-Sequence-Definition (Doc 26 2.1): Name + geordnete Schritte, in die Deals/Leads eingeschrieben\nwerden. `POST .../{ulid}/enroll` schreibt ein Subjekt ein.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":150,"default":"","type":"string"},"description":{"maxLength":500,"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"exitOnReply":{"default":true,"type":"boolean"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/SalesSequenceStepResource-sales_sequence.read"}},"activeEnrollments":{"default":0,"type":"integer"},"enrollmentUlid":{"type":["string","null"]}},"required":["name"]},"SalesSequence-sales_sequence.write":{"type":"object","description":"Sales-Sequence-Definition (Doc 26 2.1): Name + geordnete Schritte, in die Deals/Leads eingeschrieben\nwerden. `POST .../{ulid}/enroll` schreibt ein Subjekt ein.","required":["name"],"properties":{"name":{"maxLength":150,"default":"","type":"string"},"description":{"maxLength":500,"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"exitOnReply":{"default":true,"type":"boolean"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/SalesSequenceStepResource-sales_sequence.write"}},"enrollSubjectType":{"description":"deal | lead (nur für die enroll-Operation).","type":["string","null"]},"enrollSubjectId":{"type":["string","null"]}}},"SalesSequence-sales_sequence.write.jsonMergePatch":{"type":"object","description":"Sales-Sequence-Definition (Doc 26 2.1): Name + geordnete Schritte, in die Deals/Leads eingeschrieben\nwerden. `POST .../{ulid}/enroll` schreibt ein Subjekt ein.","properties":{"name":{"maxLength":150,"default":"","type":"string"},"description":{"maxLength":500,"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"exitOnReply":{"default":true,"type":"boolean"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/SalesSequenceStepResource-sales_sequence.write"}},"enrollSubjectType":{"description":"deal | lead (nur für die enroll-Operation).","type":["string","null"]},"enrollSubjectId":{"type":["string","null"]}}},"SalesSequence.jsonld-sales_sequence.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":150,"default":"","type":"string"},"description":{"maxLength":500,"type":["string","null"]},"brandId":{"type":["integer","null"]},"active":{"default":true,"type":"boolean"},"exitOnReply":{"default":true,"type":"boolean"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/SalesSequenceStepResource.jsonld-sales_sequence.read"}},"activeEnrollments":{"default":0,"type":"integer"},"enrollmentUlid":{"type":["string","null"]}},"required":["name"]}],"description":"Sales-Sequence-Definition (Doc 26 2.1): Name + geordnete Schritte, in die Deals/Leads eingeschrieben\nwerden. `POST .../{ulid}/enroll` schreibt ein Subjekt ein."},"SalesSequenceStepResource-sales_sequence.read":{"type":"object","properties":{"type":{"enum":["email","task","wait"],"default":"email","type":"string"},"delayMinutes":{"minimum":0,"default":0,"type":"integer"},"config":{"description":"email → {subject, body, autoSend}; task → {title, description}; wait → }","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SalesSequenceStepResource-sales_sequence.write":{"type":"object","properties":{"type":{"enum":["email","task","wait"],"default":"email","type":"string"},"delayMinutes":{"minimum":0,"default":0,"type":"integer"},"config":{"description":"email → {subject, body, autoSend}; task → {title, description}; wait → }","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SalesSequenceStepResource.jsonld-sales_sequence.read":{"type":"object","properties":{"type":{"enum":["email","task","wait"],"default":"email","type":"string"},"delayMinutes":{"minimum":0,"default":0,"type":"integer"},"config":{"description":"email → {subject, body, autoSend}; task → {title, description}; wait → }","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SavedView-saved_view.read":{"type":"object","description":"Gespeicherte Ansicht / Queue (04-04 §4.7/§5): persönlich oder geteilt; Filter/Sortierung/\nSpalten als Sicht auf die Ticket-Work-Items.","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"scope":{"enum":["personal","shared"],"description":"personal|shared (shared erfordert tickets.savedview.share).","type":["string","null"]},"ownerId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sort":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"columns":{"type":["array","null"],"items":{"type":"string"}},"sortOrder":{"type":["integer","null"]}},"required":["name"]},"SavedView-saved_view.write":{"type":"object","description":"Gespeicherte Ansicht / Queue (04-04 §4.7/§5): persönlich oder geteilt; Filter/Sortierung/\nSpalten als Sicht auf die Ticket-Work-Items.","required":["name"],"properties":{"name":{"type":["string","null"]},"scope":{"enum":["personal","shared"],"description":"personal|shared (shared erfordert tickets.savedview.share).","type":["string","null"]},"brandId":{"type":["integer","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sort":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"columns":{"type":["array","null"],"items":{"type":"string"}},"sortOrder":{"type":["integer","null"]}}},"SavedView-saved_view.write.jsonMergePatch":{"type":"object","description":"Gespeicherte Ansicht / Queue (04-04 §4.7/§5): persönlich oder geteilt; Filter/Sortierung/\nSpalten als Sicht auf die Ticket-Work-Items.","properties":{"name":{"type":["string","null"]},"scope":{"enum":["personal","shared"],"description":"personal|shared (shared erfordert tickets.savedview.share).","type":["string","null"]},"brandId":{"type":["integer","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sort":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"columns":{"type":["array","null"],"items":{"type":"string"}},"sortOrder":{"type":["integer","null"]}}},"SavedView.jsonld-saved_view.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"scope":{"enum":["personal","shared"],"description":"personal|shared (shared erfordert tickets.savedview.share).","type":["string","null"]},"ownerId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sort":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"columns":{"type":["array","null"],"items":{"type":"string"}},"sortOrder":{"type":["integer","null"]}},"required":["name"]}],"description":"Gespeicherte Ansicht / Queue (04-04 §4.7/§5): persönlich oder geteilt; Filter/Sortierung/\nSpalten als Sicht auf die Ticket-Work-Items."},"Scenario-scenario.action":{"type":"object","description":"Szenario-Resource (04-09 §4.6, R7): Was-wäre-wenn-Planung mit isolierten Allocations.\nVergleich Szenario ↔ produktiv + transaktionale Übernahme; Produktivplanung bis Apply unberührt.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"description":"add-allocation.","type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"hypotheticalLabel":{"maxLength":255,"type":["string","null"]},"periodStart":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"plannedHours":{"minimum":0,"type":["number","null"]},"distribution":{"enum":["even","weekly"],"description":"even | weekly.","default":"even","type":["string","null"]},"confidence":{"enum":["planned","committed","tentative"],"description":"planned | committed | tentative.","default":"tentative","type":["string","null"]},"roleHint":{"maxLength":50,"type":["string","null"]},"allocationNote":{"maxLength":1000,"type":["string","null"]},"scenarioAllocationUlid":{"maxLength":26,"description":"remove-allocation.","type":["string","null"]}}},"Scenario-scenario.read":{"type":"object","description":"Szenario-Resource (04-09 §4.6, R7): Was-wäre-wenn-Planung mit isolierten Allocations.\nVergleich Szenario ↔ produktiv + transaktionale Übernahme; Produktivplanung bis Apply unberührt.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":255,"type":["string","null"]},"baseAsOf":{"description":"Tag (Y-m-d); Default heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"status":{"type":["string","null"]},"ownerId":{"type":["string","null"]},"note":{"maxLength":1000,"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"appliedAt":{"type":["string","null"]},"allocations":{"description":"Szenario-Allocations (Item-Detail).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"comparison":{"description":"Vergleich Szenario ↔ produktiv (Compare-Endpoint).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"appliedCreated":{"description":"Ergebnis der Übernahme.","type":["integer","null"]},"appliedSkipped":{"type":["integer","null"]}}},"Scenario-scenario.write":{"type":"object","description":"Szenario-Resource (04-09 §4.6, R7): Was-wäre-wenn-Planung mit isolierten Allocations.\nVergleich Szenario ↔ produktiv + transaktionale Übernahme; Produktivplanung bis Apply unberührt.","properties":{"name":{"maxLength":255,"type":["string","null"]},"baseAsOf":{"description":"Tag (Y-m-d); Default heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"note":{"maxLength":1000,"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"Scenario-scenario.write.jsonMergePatch":{"type":"object","description":"Szenario-Resource (04-09 §4.6, R7): Was-wäre-wenn-Planung mit isolierten Allocations.\nVergleich Szenario ↔ produktiv + transaktionale Übernahme; Produktivplanung bis Apply unberührt.","properties":{"name":{"maxLength":255,"type":["string","null"]},"baseAsOf":{"description":"Tag (Y-m-d); Default heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"note":{"maxLength":1000,"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"Scenario.jsonld-scenario.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":255,"type":["string","null"]},"baseAsOf":{"description":"Tag (Y-m-d); Default heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"status":{"type":["string","null"]},"ownerId":{"type":["string","null"]},"note":{"maxLength":1000,"type":["string","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"appliedAt":{"type":["string","null"]},"allocations":{"description":"Szenario-Allocations (Item-Detail).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"comparison":{"description":"Vergleich Szenario ↔ produktiv (Compare-Endpoint).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"appliedCreated":{"description":"Ergebnis der Übernahme.","type":["integer","null"]},"appliedSkipped":{"type":["integer","null"]}}}],"description":"Szenario-Resource (04-09 §4.6, R7): Was-wäre-wenn-Planung mit isolierten Allocations.\nVergleich Szenario ↔ produktiv + transaktionale Übernahme; Produktivplanung bis Apply unberührt."},"SchedulingAppointment":{"type":"object","description":"Admin-Sicht gebuchter Termine (04-33 §7/§8) — read-only + Cancel/Reschedule.\nDelegiert an {@see \\Octi\\Plugin\\Scheduling\\Service\\AppointmentManager} (keine eigene Fachlogik).\nview_any/manage: alle Termine der Marke; view_own: nur Termine mit sich selbst als Host (404 sonst).\nBuchen läuft ausschließlich über die öffentliche Buchungsstrecke.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenzziel für polymorphe ERP-Verweise.","type":["integer","null"]},"eventTypeUlid":{"type":["string","null"]},"eventTypeName":{"type":["string","null"]},"eventTypeSlug":{"description":"Slug des Termintyps — für die Slot-Suche beim Verschieben (öffentliche Slots-API).","type":["string","null"]},"hostEmployeeIds":{"type":"array","items":{"type":"integer"}},"hostNames":{"type":"array","items":{"type":"string"}},"startAt":{"type":["string","null"],"format":"date-time"},"endAt":{"type":["string","null"],"format":"date-time"},"inviteeTimezone":{"type":["string","null"]},"status":{"type":["string","null"]},"meetingUrl":{"type":["string","null"]},"locationResolved":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"answers":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"cancelReason":{"type":["string","null"]},"source":{"type":["string","null"]},"seriesId":{"description":"Serien-Kennung (Doc 18 Stufe 4c) — gesetzt bei wiederkehrenden Terminen; sonst null.","type":["string","null"]},"paymentStatus":{"type":["string","null"]},"invitees":{"description":"name/email/role/status je Teilnehmer + dessen eigene Formular-Antworten (answers, R21 SCHED-3)","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"hasExternalCalendarRefs":{"description":"Existenz externer Kalender-Referenzen (Google/Microsoft/CalDAV-Outbound) — ohne Detail-Leak.","default":false,"type":"boolean"},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"reason":{"description":"Aktions-Feld für POST …/cancel: optionaler Absage-Grund.","type":["string","null"]},"cancelSeries":{"description":"Aktions-Feld für POST …/cancel: `true` storniert die GANZE Serie (Doc 18 Stufe 4c).","type":["boolean","null"]},"newStartAt":{"description":"Aktions-Feld für POST …/reschedule: neuer Start (ISO 8601, wird nach UTC normalisiert).","type":["string","null"]}}},"SchedulingAppointment-sched_appointment.cancel":{"type":"object","description":"Admin-Sicht gebuchter Termine (04-33 §7/§8) — read-only + Cancel/Reschedule.\nDelegiert an {@see \\Octi\\Plugin\\Scheduling\\Service\\AppointmentManager} (keine eigene Fachlogik).\nview_any/manage: alle Termine der Marke; view_own: nur Termine mit sich selbst als Host (404 sonst).\nBuchen läuft ausschließlich über die öffentliche Buchungsstrecke.","properties":{"reason":{"maxLength":500,"description":"Aktions-Feld für POST …/cancel: optionaler Absage-Grund.","type":["string","null"]},"cancelSeries":{"description":"Aktions-Feld für POST …/cancel: `true` storniert die GANZE Serie (Doc 18 Stufe 4c).","type":["boolean","null"]}}},"SchedulingAppointment-sched_appointment.read":{"type":"object","description":"Admin-Sicht gebuchter Termine (04-33 §7/§8) — read-only + Cancel/Reschedule.\nDelegiert an {@see \\Octi\\Plugin\\Scheduling\\Service\\AppointmentManager} (keine eigene Fachlogik).\nview_any/manage: alle Termine der Marke; view_own: nur Termine mit sich selbst als Host (404 sonst).\nBuchen läuft ausschließlich über die öffentliche Buchungsstrecke.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenzziel für polymorphe ERP-Verweise.","type":["integer","null"]},"eventTypeUlid":{"type":["string","null"]},"eventTypeName":{"type":["string","null"]},"eventTypeSlug":{"description":"Slug des Termintyps — für die Slot-Suche beim Verschieben (öffentliche Slots-API).","type":["string","null"]},"hostEmployeeIds":{"type":"array","items":{"type":"integer"}},"hostNames":{"type":"array","items":{"type":"string"}},"startAt":{"type":["string","null"],"format":"date-time"},"endAt":{"type":["string","null"],"format":"date-time"},"inviteeTimezone":{"type":["string","null"]},"status":{"type":["string","null"]},"meetingUrl":{"type":["string","null"]},"locationResolved":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"answers":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"cancelReason":{"type":["string","null"]},"source":{"type":["string","null"]},"seriesId":{"description":"Serien-Kennung (Doc 18 Stufe 4c) — gesetzt bei wiederkehrenden Terminen; sonst null.","type":["string","null"]},"paymentStatus":{"type":["string","null"]},"invitees":{"description":"name/email/role/status je Teilnehmer + dessen eigene Formular-Antworten (answers, R21 SCHED-3)","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"hasExternalCalendarRefs":{"description":"Existenz externer Kalender-Referenzen (Google/Microsoft/CalDAV-Outbound) — ohne Detail-Leak.","default":false,"type":"boolean"},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}},"SchedulingAppointment-sched_appointment.reschedule":{"type":"object","description":"Admin-Sicht gebuchter Termine (04-33 §7/§8) — read-only + Cancel/Reschedule.\nDelegiert an {@see \\Octi\\Plugin\\Scheduling\\Service\\AppointmentManager} (keine eigene Fachlogik).\nview_any/manage: alle Termine der Marke; view_own: nur Termine mit sich selbst als Host (404 sonst).\nBuchen läuft ausschließlich über die öffentliche Buchungsstrecke.","required":["newStartAt"],"properties":{"newStartAt":{"description":"Aktions-Feld für POST …/reschedule: neuer Start (ISO 8601, wird nach UTC normalisiert).","type":["string","null"]}}},"SchedulingAppointment.jsonld-sched_appointment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenzziel für polymorphe ERP-Verweise.","type":["integer","null"]},"eventTypeUlid":{"type":["string","null"]},"eventTypeName":{"type":["string","null"]},"eventTypeSlug":{"description":"Slug des Termintyps — für die Slot-Suche beim Verschieben (öffentliche Slots-API).","type":["string","null"]},"hostEmployeeIds":{"type":"array","items":{"type":"integer"}},"hostNames":{"type":"array","items":{"type":"string"}},"startAt":{"type":["string","null"],"format":"date-time"},"endAt":{"type":["string","null"],"format":"date-time"},"inviteeTimezone":{"type":["string","null"]},"status":{"type":["string","null"]},"meetingUrl":{"type":["string","null"]},"locationResolved":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"answers":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"cancelReason":{"type":["string","null"]},"source":{"type":["string","null"]},"seriesId":{"description":"Serien-Kennung (Doc 18 Stufe 4c) — gesetzt bei wiederkehrenden Terminen; sonst null.","type":["string","null"]},"paymentStatus":{"type":["string","null"]},"invitees":{"description":"name/email/role/status je Teilnehmer + dessen eigene Formular-Antworten (answers, R21 SCHED-3)","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"hasExternalCalendarRefs":{"description":"Existenz externer Kalender-Referenzen (Google/Microsoft/CalDAV-Outbound) — ohne Detail-Leak.","default":false,"type":"boolean"},"brandId":{"type":["integer","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}}],"description":"Admin-Sicht gebuchter Termine (04-33 §7/§8) — read-only + Cancel/Reschedule.\nDelegiert an {@see \\Octi\\Plugin\\Scheduling\\Service\\AppointmentManager} (keine eigene Fachlogik).\nview_any/manage: alle Termine der Marke; view_own: nur Termine mit sich selbst als Host (404 sonst).\nBuchen läuft ausschließlich über die öffentliche Buchungsstrecke."},"SchedulingAvailableCalendar-sched_available_calendar.read":{"type":"object","description":"Wählbare Kalender einer Verbindung (Doc 18 §3) — für Ziel-/Konflikt-Kalender-Auswahl im\nVerbindungs-Editor. Nur Google/Microsoft liefern eine Liste; CalDAV/ICS geben eine leere zurück\n(genau ein Kalender). Read-only, owner-gebunden über die Eltern-Verbindung.","properties":{"id":{"type":["string","null"]},"summary":{"type":["string","null"]},"primary":{"type":["boolean","null"]}}},"SchedulingAvailableCalendar.jsonld-sched_available_calendar.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"summary":{"type":["string","null"]},"primary":{"type":["boolean","null"]}}}],"description":"Wählbare Kalender einer Verbindung (Doc 18 §3) — für Ziel-/Konflikt-Kalender-Auswahl im\nVerbindungs-Editor. Nur Google/Microsoft liefern eine Liste; CalDAV/ICS geben eine leere zurück\n(genau ein Kalender). Read-only, owner-gebunden über die Eltern-Verbindung."},"SchedulingBookingPage-sched_booking_page.read":{"type":"object","description":"Admin-CRUD der Buchungsseiten (04-33 §5) über die öffentlichen Landingpages mit mehreren Termintypen.\nRechte: `scheduling.booking_page.view`/`.manage`; marken-scoped/IDOR über\n{@see BookingPageProvider}/{@see BookingPageProcessor}; Slug-Konflikt → 409.","properties":{"ulid":{"type":["string","null"]},"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"title":{"type":["string","null"]},"ownerType":{"enum":["employee","resource"],"type":["string","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"welcomeText":{"type":["string","null"]},"avatarFileId":{"type":["integer","null"]},"branding":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customDomain":{"description":"Eigene Domain je Marke (White-Label, Doc 18 Stufe 5) — Host-Routing/DNS = Betriebsschritt.","type":["string","null"]},"eventTypeIds":{"type":["array","null"],"items":{"type":"integer"}},"visibility":{"enum":["public","secret"],"type":["string","null"]},"brandId":{"type":["integer","null"]}},"required":["slug","title"]},"SchedulingBookingPage-sched_booking_page.write":{"type":"object","description":"Admin-CRUD der Buchungsseiten (04-33 §5) über die öffentlichen Landingpages mit mehreren Termintypen.\nRechte: `scheduling.booking_page.view`/`.manage`; marken-scoped/IDOR über\n{@see BookingPageProvider}/{@see BookingPageProcessor}; Slug-Konflikt → 409.","required":["slug","title"],"properties":{"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"title":{"type":["string","null"]},"ownerType":{"enum":["employee","resource"],"type":["string","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"welcomeText":{"type":["string","null"]},"avatarFileId":{"type":["integer","null"]},"branding":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customDomain":{"description":"Eigene Domain je Marke (White-Label, Doc 18 Stufe 5) — Host-Routing/DNS = Betriebsschritt.","type":["string","null"]},"eventTypeIds":{"type":["array","null"],"items":{"type":"integer"}},"visibility":{"enum":["public","secret"],"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingBookingPage-sched_booking_page.write.jsonMergePatch":{"type":"object","description":"Admin-CRUD der Buchungsseiten (04-33 §5) über die öffentlichen Landingpages mit mehreren Termintypen.\nRechte: `scheduling.booking_page.view`/`.manage`; marken-scoped/IDOR über\n{@see BookingPageProvider}/{@see BookingPageProcessor}; Slug-Konflikt → 409.","properties":{"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"title":{"type":["string","null"]},"ownerType":{"enum":["employee","resource"],"type":["string","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"welcomeText":{"type":["string","null"]},"avatarFileId":{"type":["integer","null"]},"branding":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customDomain":{"description":"Eigene Domain je Marke (White-Label, Doc 18 Stufe 5) — Host-Routing/DNS = Betriebsschritt.","type":["string","null"]},"eventTypeIds":{"type":["array","null"],"items":{"type":"integer"}},"visibility":{"enum":["public","secret"],"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingBookingPage.jsonld-sched_booking_page.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"title":{"type":["string","null"]},"ownerType":{"enum":["employee","resource"],"type":["string","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"welcomeText":{"type":["string","null"]},"avatarFileId":{"type":["integer","null"]},"branding":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"customDomain":{"description":"Eigene Domain je Marke (White-Label, Doc 18 Stufe 5) — Host-Routing/DNS = Betriebsschritt.","type":["string","null"]},"eventTypeIds":{"type":["array","null"],"items":{"type":"integer"}},"visibility":{"enum":["public","secret"],"type":["string","null"]},"brandId":{"type":["integer","null"]}},"required":["slug","title"]}],"description":"Admin-CRUD der Buchungsseiten (04-33 §5) über die öffentlichen Landingpages mit mehreren Termintypen.\nRechte: `scheduling.booking_page.view`/`.manage`; marken-scoped/IDOR über\n{@see BookingPageProvider}/{@see BookingPageProcessor}; Slug-Konflikt → 409."},"SchedulingCalDavDiscovery-sched_caldav_discovery.read":{"type":"object","description":"CalDAV-Autodiscovery (04-33 §8, Doc 18 §3): löst aus Server-URL + Basic-Auth die Kollektions-URL\ndes Standard-Kalenders auf (RFC 6764) — Komfort vor Verbindungsanlage ({@see CalendarConnectionResource}).\nURL läuft durch den SSRF-Guard; nicht erreichbar/kein Kalender gefunden ⇒ 422. Kein Persistenz-RPC.","properties":{"id":{"description":"Pseudo-Identifier der RPC-Antwort (keine Persistenz).","type":["string","null"]},"collectionUrl":{"description":"Ergebnis: die aufgelöste Kalender-Kollektions-URL.","type":["string","null"]}}},"SchedulingCalDavDiscovery-sched_caldav_discovery.write":{"type":"object","description":"CalDAV-Autodiscovery (04-33 §8, Doc 18 §3): löst aus Server-URL + Basic-Auth die Kollektions-URL\ndes Standard-Kalenders auf (RFC 6764) — Komfort vor Verbindungsanlage ({@see CalendarConnectionResource}).\nURL läuft durch den SSRF-Guard; nicht erreichbar/kein Kalender gefunden ⇒ 422. Kein Persistenz-RPC.","required":["url","username","password"],"properties":{"url":{"description":"Server-/Basis-URL des CalDAV-Servers (auch webcal:// wird akzeptiert und normalisiert).","type":["string","null"]},"username":{"type":["string","null"]},"password":{"description":"Write-only: App-Passwort — wird nur für die Discovery-Anfrage genutzt, nie gespeichert.","type":["string","null"]}}},"SchedulingCalDavDiscovery.jsonld-sched_caldav_discovery.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier der RPC-Antwort (keine Persistenz).","type":["string","null"]},"collectionUrl":{"description":"Ergebnis: die aufgelöste Kalender-Kollektions-URL.","type":["string","null"]}}}],"description":"CalDAV-Autodiscovery (04-33 §8, Doc 18 §3): löst aus Server-URL + Basic-Auth die Kollektions-URL\ndes Standard-Kalenders auf (RFC 6764) — Komfort vor Verbindungsanlage ({@see CalendarConnectionResource}).\nURL läuft durch den SSRF-Guard; nicht erreichbar/kein Kalender gefunden ⇒ 422. Kein Persistenz-RPC."},"SchedulingCalendarConnection-sched_connection.read":{"type":"object","description":"Kalender-Verbindungen des angemeldeten Mitarbeiters (04-33 §8, Doc 18 §3): ICS-Feed/CalDAV.\nNicht-destruktiv: Status → revoked, Reconnect reaktiviert die Zeile.\nStrikt \"manage_own\" — fremde ULIDs liefern 404; Nutzer-URLs durch den SSRF-Guard.\nOAuth (Google/Microsoft) nicht hier, sondern über Consent-Flow in\n{@see \\Octi\\Plugin\\Scheduling\\Controller\\CalendarConnectionController}.","properties":{"ulid":{"type":["string","null"]},"provider":{"description":"google | microsoft | caldav | ics.","type":["string","null"]},"accountEmail":{"description":"Konto-Schlüssel (OAuth-E-Mail, CalDAV-Benutzername bzw. deterministischer ICS-Feed-Schlüssel).","type":["string","null"]},"displayName":{"type":["string","null"]},"status":{"description":"active | error | revoked.","type":["string","null"]},"syncInbound":{"type":["boolean","null"]},"syncOutbound":{"type":["boolean","null"]},"targetCalendarId":{"description":"Ziel-Kalender (wohin ausgehende Termine geschrieben werden); null = Standardkalender.","type":["string","null"]},"conflictCalendarIds":{"description":"Zusätzliche Kalender-IDs, deren Belegtzeiten die Slot-Prüfung sperren (leer = nur Ziel-Kalender).","type":["array","null"],"items":{"type":"string"}},"lastSyncedAt":{"description":"Letzter erfolgreicher Busy-Sync (ATOM) oder null.","type":["string","null"]}}},"SchedulingCalendarConnection-sched_connection.update.jsonMergePatch":{"type":"object","description":"Kalender-Verbindungen des angemeldeten Mitarbeiters (04-33 §8, Doc 18 §3): ICS-Feed/CalDAV.\nNicht-destruktiv: Status → revoked, Reconnect reaktiviert die Zeile.\nStrikt \"manage_own\" — fremde ULIDs liefern 404; Nutzer-URLs durch den SSRF-Guard.\nOAuth (Google/Microsoft) nicht hier, sondern über Consent-Flow in\n{@see \\Octi\\Plugin\\Scheduling\\Controller\\CalendarConnectionController}.","properties":{"syncInbound":{"type":["boolean","null"]},"syncOutbound":{"type":["boolean","null"]},"targetCalendarId":{"description":"Ziel-Kalender (wohin ausgehende Termine geschrieben werden); null = Standardkalender.","type":["string","null"]},"conflictCalendarIds":{"description":"Zusätzliche Kalender-IDs, deren Belegtzeiten die Slot-Prüfung sperren (leer = nur Ziel-Kalender).","type":["array","null"],"items":{"type":"string"}}}},"SchedulingCalendarConnection-sched_connection.write":{"type":"object","description":"Kalender-Verbindungen des angemeldeten Mitarbeiters (04-33 §8, Doc 18 §3): ICS-Feed/CalDAV.\nNicht-destruktiv: Status → revoked, Reconnect reaktiviert die Zeile.\nStrikt \"manage_own\" — fremde ULIDs liefern 404; Nutzer-URLs durch den SSRF-Guard.\nOAuth (Google/Microsoft) nicht hier, sondern über Consent-Flow in\n{@see \\Octi\\Plugin\\Scheduling\\Controller\\CalendarConnectionController}.","required":["url"],"properties":{"url":{"description":"ICS: Feed-URL (webcal:// wird normalisiert) · CalDAV: Server-/Kollektions-URL.","type":["string","null"]},"username":{"description":"Nur CalDAV: Benutzername der Basic-Auth.","type":["string","null"]},"password":{"description":"Nur CalDAV: App-Passwort — write-only, landet verschlüsselt im Credential-Store.","type":["string","null"]},"label":{"description":"Optionaler Anzeigename der Verbindung.","type":["string","null"]}}},"SchedulingCalendarConnection.jsonld-sched_connection.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"provider":{"description":"google | microsoft | caldav | ics.","type":["string","null"]},"accountEmail":{"description":"Konto-Schlüssel (OAuth-E-Mail, CalDAV-Benutzername bzw. deterministischer ICS-Feed-Schlüssel).","type":["string","null"]},"displayName":{"type":["string","null"]},"status":{"description":"active | error | revoked.","type":["string","null"]},"syncInbound":{"type":["boolean","null"]},"syncOutbound":{"type":["boolean","null"]},"targetCalendarId":{"description":"Ziel-Kalender (wohin ausgehende Termine geschrieben werden); null = Standardkalender.","type":["string","null"]},"conflictCalendarIds":{"description":"Zusätzliche Kalender-IDs, deren Belegtzeiten die Slot-Prüfung sperren (leer = nur Ziel-Kalender).","type":["array","null"],"items":{"type":"string"}},"lastSyncedAt":{"description":"Letzter erfolgreicher Busy-Sync (ATOM) oder null.","type":["string","null"]}}}],"description":"Kalender-Verbindungen des angemeldeten Mitarbeiters (04-33 §8, Doc 18 §3): ICS-Feed/CalDAV.\nNicht-destruktiv: Status → revoked, Reconnect reaktiviert die Zeile.\nStrikt \"manage_own\" — fremde ULIDs liefern 404; Nutzer-URLs durch den SSRF-Guard.\nOAuth (Google/Microsoft) nicht hier, sondern über Consent-Flow in\n{@see \\Octi\\Plugin\\Scheduling\\Controller\\CalendarConnectionController}."},"SchedulingDateOverride-sched_override.read":{"type":"object","description":"Admin-API der Datums-Overrides (04-33 §6): tagesspezifische Abweichung eines Schedules\n(Sonderöffnungszeiten oder ganztägige Sperre bei leeren Intervallen). Gehört zu `scheduleUlid`;\nRechte/Marke über den Eltern-Schedule. Collection erwartet den `schedule`-Filter.","properties":{"ulid":{"type":["string","null"]},"scheduleUlid":{"type":["string","null"]},"date":{"pattern":"^(\\d{4}-\\d{2}-\\d{2})$","type":["string","null"]},"intervals":{"description":"Zeitintervalle „HH:MM\"-Paare; leer = ganztägige Sperre.","type":["array","null"],"items":{"type":"array","items":{"type":"string"}}},"reason":{"type":["string","null"]},"blocked":{"type":["boolean","null"]}},"required":["scheduleUlid","date"]},"SchedulingDateOverride-sched_override.write":{"type":"object","description":"Admin-API der Datums-Overrides (04-33 §6): tagesspezifische Abweichung eines Schedules\n(Sonderöffnungszeiten oder ganztägige Sperre bei leeren Intervallen). Gehört zu `scheduleUlid`;\nRechte/Marke über den Eltern-Schedule. Collection erwartet den `schedule`-Filter.","required":["scheduleUlid","date"],"properties":{"scheduleUlid":{"type":["string","null"]},"date":{"pattern":"^(\\d{4}-\\d{2}-\\d{2})$","type":["string","null"]},"intervals":{"description":"Zeitintervalle „HH:MM\"-Paare; leer = ganztägige Sperre.","type":["array","null"],"items":{"type":"array","items":{"type":"string"}}},"reason":{"type":["string","null"]}}},"SchedulingDateOverride-sched_override.write.jsonMergePatch":{"type":"object","description":"Admin-API der Datums-Overrides (04-33 §6): tagesspezifische Abweichung eines Schedules\n(Sonderöffnungszeiten oder ganztägige Sperre bei leeren Intervallen). Gehört zu `scheduleUlid`;\nRechte/Marke über den Eltern-Schedule. Collection erwartet den `schedule`-Filter.","properties":{"scheduleUlid":{"type":["string","null"]},"date":{"pattern":"^(\\d{4}-\\d{2}-\\d{2})$","type":["string","null"]},"intervals":{"description":"Zeitintervalle „HH:MM\"-Paare; leer = ganztägige Sperre.","type":["array","null"],"items":{"type":"array","items":{"type":"string"}}},"reason":{"type":["string","null"]}}},"SchedulingDateOverride.jsonld-sched_override.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"scheduleUlid":{"type":["string","null"]},"date":{"pattern":"^(\\d{4}-\\d{2}-\\d{2})$","type":["string","null"]},"intervals":{"description":"Zeitintervalle „HH:MM\"-Paare; leer = ganztägige Sperre.","type":["array","null"],"items":{"type":"array","items":{"type":"string"}}},"reason":{"type":["string","null"]},"blocked":{"type":["boolean","null"]}},"required":["scheduleUlid","date"]}],"description":"Admin-API der Datums-Overrides (04-33 §6): tagesspezifische Abweichung eines Schedules\n(Sonderöffnungszeiten oder ganztägige Sperre bei leeren Intervallen). Gehört zu `scheduleUlid`;\nRechte/Marke über den Eltern-Schedule. Collection erwartet den `schedule`-Filter."},"SchedulingEventType-sched_event_type.read":{"type":"object","description":"Termintyp-Verwaltung (04-33 §3/§8) — Admin-CRUD der öffentlichen Buchungs-Termintypen.\nRechte: Lesen `scheduling.event_type.view`, Schreiben `.manage`. Marken-IDOR in\nProvider/Processor (SchedulingAccessResolver).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Alt-Referenzziel (ehem. Workflow-Dialog); bleibt lesbar für Bestandsclients.","type":["integer","null"]},"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"color":{"type":["string","null"]},"durationMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"kind":{"enum":["one_on_one","group","collective","round_robin","managed"],"type":["string","null"]},"capacity":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"locationKind":{"enum":["video_meet","video_teams","video_zoom","video_custom","in_person","phone","ask_invitee","custom"],"type":["string","null"]},"locationConfig":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"bufferBeforeMinutes":{"minimum":0,"type":["integer","null"]},"bufferAfterMinutes":{"minimum":0,"type":["integer","null"]},"minNoticeMinutes":{"minimum":0,"type":["integer","null"]},"horizonDays":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"slotIncrementMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"dailyLimit":{"type":["integer","null"]},"visibility":{"enum":["public","secret"],"type":["string","null"]},"requiresPayment":{"type":["boolean","null"]},"priceAmount":{"minimum":0,"type":["integer","null"]},"questions":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"scheduleId":{"type":["integer","null"]},"hostEmployeeIds":{"type":["array","null"],"items":{"type":"integer"}},"resourceIds":{"description":"Pflicht-Ressourcen (interne Resource-IDs; Doc 18 Stufe 3).","type":["array","null"],"items":{"type":"integer"}},"recurrenceRule":{"description":"Wiederholungsregel (Doc 18 Stufe 4c): `{freq: daily|weekly|monthly, interval, count}` oder null\n(Einzeltermin). Der Bucher bucht dann die ganze Serie.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}},"required":["slug","name"]},"SchedulingEventType-sched_event_type.write":{"type":"object","description":"Termintyp-Verwaltung (04-33 §3/§8) — Admin-CRUD der öffentlichen Buchungs-Termintypen.\nRechte: Lesen `scheduling.event_type.view`, Schreiben `.manage`. Marken-IDOR in\nProvider/Processor (SchedulingAccessResolver).","required":["slug","name"],"properties":{"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"color":{"type":["string","null"]},"durationMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"kind":{"enum":["one_on_one","group","collective","round_robin","managed"],"type":["string","null"]},"capacity":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"locationKind":{"enum":["video_meet","video_teams","video_zoom","video_custom","in_person","phone","ask_invitee","custom"],"type":["string","null"]},"locationConfig":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"bufferBeforeMinutes":{"minimum":0,"type":["integer","null"]},"bufferAfterMinutes":{"minimum":0,"type":["integer","null"]},"minNoticeMinutes":{"minimum":0,"type":["integer","null"]},"horizonDays":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"slotIncrementMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"dailyLimit":{"type":["integer","null"]},"visibility":{"enum":["public","secret"],"type":["string","null"]},"requiresPayment":{"type":["boolean","null"]},"priceAmount":{"minimum":0,"type":["integer","null"]},"questions":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"scheduleId":{"type":["integer","null"]},"hostEmployeeIds":{"type":["array","null"],"items":{"type":"integer"}},"resourceIds":{"description":"Pflicht-Ressourcen (interne Resource-IDs; Doc 18 Stufe 3).","type":["array","null"],"items":{"type":"integer"}},"recurrenceRule":{"description":"Wiederholungsregel (Doc 18 Stufe 4c): `{freq: daily|weekly|monthly, interval, count}` oder null\n(Einzeltermin). Der Bucher bucht dann die ganze Serie.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingEventType-sched_event_type.write.jsonMergePatch":{"type":"object","description":"Termintyp-Verwaltung (04-33 §3/§8) — Admin-CRUD der öffentlichen Buchungs-Termintypen.\nRechte: Lesen `scheduling.event_type.view`, Schreiben `.manage`. Marken-IDOR in\nProvider/Processor (SchedulingAccessResolver).","properties":{"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"color":{"type":["string","null"]},"durationMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"kind":{"enum":["one_on_one","group","collective","round_robin","managed"],"type":["string","null"]},"capacity":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"locationKind":{"enum":["video_meet","video_teams","video_zoom","video_custom","in_person","phone","ask_invitee","custom"],"type":["string","null"]},"locationConfig":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"bufferBeforeMinutes":{"minimum":0,"type":["integer","null"]},"bufferAfterMinutes":{"minimum":0,"type":["integer","null"]},"minNoticeMinutes":{"minimum":0,"type":["integer","null"]},"horizonDays":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"slotIncrementMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"dailyLimit":{"type":["integer","null"]},"visibility":{"enum":["public","secret"],"type":["string","null"]},"requiresPayment":{"type":["boolean","null"]},"priceAmount":{"minimum":0,"type":["integer","null"]},"questions":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"scheduleId":{"type":["integer","null"]},"hostEmployeeIds":{"type":["array","null"],"items":{"type":"integer"}},"resourceIds":{"description":"Pflicht-Ressourcen (interne Resource-IDs; Doc 18 Stufe 3).","type":["array","null"],"items":{"type":"integer"}},"recurrenceRule":{"description":"Wiederholungsregel (Doc 18 Stufe 4c): `{freq: daily|weekly|monthly, interval, count}` oder null\n(Einzeltermin). Der Bucher bucht dann die ganze Serie.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingEventType.jsonld-sched_event_type.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Alt-Referenzziel (ehem. Workflow-Dialog); bleibt lesbar für Bestandsclients.","type":["integer","null"]},"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"color":{"type":["string","null"]},"durationMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"kind":{"enum":["one_on_one","group","collective","round_robin","managed"],"type":["string","null"]},"capacity":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"locationKind":{"enum":["video_meet","video_teams","video_zoom","video_custom","in_person","phone","ask_invitee","custom"],"type":["string","null"]},"locationConfig":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"bufferBeforeMinutes":{"minimum":0,"type":["integer","null"]},"bufferAfterMinutes":{"minimum":0,"type":["integer","null"]},"minNoticeMinutes":{"minimum":0,"type":["integer","null"]},"horizonDays":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"slotIncrementMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"dailyLimit":{"type":["integer","null"]},"visibility":{"enum":["public","secret"],"type":["string","null"]},"requiresPayment":{"type":["boolean","null"]},"priceAmount":{"minimum":0,"type":["integer","null"]},"questions":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"scheduleId":{"type":["integer","null"]},"hostEmployeeIds":{"type":["array","null"],"items":{"type":"integer"}},"resourceIds":{"description":"Pflicht-Ressourcen (interne Resource-IDs; Doc 18 Stufe 3).","type":["array","null"],"items":{"type":"integer"}},"recurrenceRule":{"description":"Wiederholungsregel (Doc 18 Stufe 4c): `{freq: daily|weekly|monthly, interval, count}` oder null\n(Einzeltermin). Der Bucher bucht dann die ganze Serie.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}},"required":["slug","name"]}],"description":"Termintyp-Verwaltung (04-33 §3/§8) — Admin-CRUD der öffentlichen Buchungs-Termintypen.\nRechte: Lesen `scheduling.event_type.view`, Schreiben `.manage`. Marken-IDOR in\nProvider/Processor (SchedulingAccessResolver)."},"SchedulingResource-sched_resource.read":{"type":"object","description":"Admin-CRUD der buchbaren Ressourcen (Räume/Geräte, 04-33 §3 · Doc 18 Stufe 3). Rechte\n`scheduling.resource.view`/`.manage`; marken-scoped/IDOR über {@see ResourceProvider}/\n{@see ResourceProcessor}. Automatisch MCP-sichtbar (OpenAPI-Export).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenzziel für `EventType.resourceIds`.","type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"enum":["room","equipment","other"],"description":"room | equipment | other.","type":["string","null"]},"capacity":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"scheduleUlid":{"description":"ULID des Verfügbarkeits-Schedules (ownerType=resource); null = rund um die Uhr.","type":["string","null"]},"location":{"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}},"required":["name"]},"SchedulingResource-sched_resource.write":{"type":"object","description":"Admin-CRUD der buchbaren Ressourcen (Räume/Geräte, 04-33 §3 · Doc 18 Stufe 3). Rechte\n`scheduling.resource.view`/`.manage`; marken-scoped/IDOR über {@see ResourceProvider}/\n{@see ResourceProcessor}. Automatisch MCP-sichtbar (OpenAPI-Export).","required":["name"],"properties":{"name":{"type":["string","null"]},"kind":{"enum":["room","equipment","other"],"description":"room | equipment | other.","type":["string","null"]},"capacity":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"scheduleUlid":{"description":"ULID des Verfügbarkeits-Schedules (ownerType=resource); null = rund um die Uhr.","type":["string","null"]},"location":{"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingResource-sched_resource.write.jsonMergePatch":{"type":"object","description":"Admin-CRUD der buchbaren Ressourcen (Räume/Geräte, 04-33 §3 · Doc 18 Stufe 3). Rechte\n`scheduling.resource.view`/`.manage`; marken-scoped/IDOR über {@see ResourceProvider}/\n{@see ResourceProcessor}. Automatisch MCP-sichtbar (OpenAPI-Export).","properties":{"name":{"type":["string","null"]},"kind":{"enum":["room","equipment","other"],"description":"room | equipment | other.","type":["string","null"]},"capacity":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"scheduleUlid":{"description":"ULID des Verfügbarkeits-Schedules (ownerType=resource); null = rund um die Uhr.","type":["string","null"]},"location":{"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingResource.jsonld-sched_resource.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenzziel für `EventType.resourceIds`.","type":["integer","null"]},"name":{"type":["string","null"]},"kind":{"enum":["room","equipment","other"],"description":"room | equipment | other.","type":["string","null"]},"capacity":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"scheduleUlid":{"description":"ULID des Verfügbarkeits-Schedules (ownerType=resource); null = rund um die Uhr.","type":["string","null"]},"location":{"type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}},"required":["name"]}],"description":"Admin-CRUD der buchbaren Ressourcen (Räume/Geräte, 04-33 §3 · Doc 18 Stufe 3). Rechte\n`scheduling.resource.view`/`.manage`; marken-scoped/IDOR über {@see ResourceProvider}/\n{@see ResourceProcessor}. Automatisch MCP-sichtbar (OpenAPI-Export)."},"SchedulingRoutingForm-sched_routing_form.read":{"type":"object","description":"Admin-CRUD der Routing-Formulare (04-33 §4): öffentliche Frageseite + Weiterleitungs-Regeln.\nRechte: `scheduling.routing_form.view`/`.manage`; marken-scoped/IDOR über\n{@see RoutingFormProvider}/{@see RoutingFormProcessor}.","properties":{"ulid":{"type":["string","null"]},"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"active":{"type":["boolean","null"]},"fields":{"type":["array","null"],"items":{"type":["string","null"]}},"rules":{"type":["array","null"],"items":{"type":["string","null"]}},"fallbackEventTypeSlug":{"type":["string","null"]},"brandId":{"type":["integer","null"]}},"required":["slug","name"]},"SchedulingRoutingForm-sched_routing_form.write":{"type":"object","description":"Admin-CRUD der Routing-Formulare (04-33 §4): öffentliche Frageseite + Weiterleitungs-Regeln.\nRechte: `scheduling.routing_form.view`/`.manage`; marken-scoped/IDOR über\n{@see RoutingFormProvider}/{@see RoutingFormProcessor}.","required":["slug","name"],"properties":{"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"active":{"type":["boolean","null"]},"fields":{"type":["array","null"],"items":{"type":["string","null"]}},"rules":{"type":["array","null"],"items":{"type":["string","null"]}},"fallbackEventTypeSlug":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingRoutingForm-sched_routing_form.write.jsonMergePatch":{"type":"object","description":"Admin-CRUD der Routing-Formulare (04-33 §4): öffentliche Frageseite + Weiterleitungs-Regeln.\nRechte: `scheduling.routing_form.view`/`.manage`; marken-scoped/IDOR über\n{@see RoutingFormProvider}/{@see RoutingFormProcessor}.","properties":{"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"active":{"type":["boolean","null"]},"fields":{"type":["array","null"],"items":{"type":["string","null"]}},"rules":{"type":["array","null"],"items":{"type":["string","null"]}},"fallbackEventTypeSlug":{"type":["string","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingRoutingForm.jsonld-sched_routing_form.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"slug":{"pattern":"^([a-z0-9]+(?:-[a-z0-9]+)*)$","type":["string","null"]},"name":{"type":["string","null"]},"description":{"type":["string","null"]},"active":{"type":["boolean","null"]},"fields":{"type":["array","null"],"items":{"type":["string","null"]}},"rules":{"type":["array","null"],"items":{"type":["string","null"]}},"fallbackEventTypeSlug":{"type":["string","null"]},"brandId":{"type":["integer","null"]}},"required":["slug","name"]}],"description":"Admin-CRUD der Routing-Formulare (04-33 §4): öffentliche Frageseite + Weiterleitungs-Regeln.\nRechte: `scheduling.routing_form.view`/`.manage`; marken-scoped/IDOR über\n{@see RoutingFormProvider}/{@see RoutingFormProcessor}."},"SchedulingSchedule-sched_schedule.read":{"type":"object","description":"Verfügbarkeits-Schedules (04-33 §3): benannte Wochenpläne pro Owner (Mitarbeiter/Ressource).\n`weekly` = Map \"mon\"..\"sun\" → Liste [start,end] als \"HH:MM\".\nRechte: Lesen `scheduling.schedule.view`, Schreiben `scheduling.schedule.manage`.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenzziel für `EventTypeResource::scheduleId`.","type":["integer","null"]},"ownerType":{"enum":["employee","resource"],"type":["string","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"name":{"type":["string","null"]},"timezone":{"type":["string","null"]},"weekly":{"description":"Wochenplan: Map \"mon\"..\"sun\" → Liste von [start, end] als \"HH:MM\".","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"isDefault":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}},"required":["name"]},"SchedulingSchedule-sched_schedule.write":{"type":"object","description":"Verfügbarkeits-Schedules (04-33 §3): benannte Wochenpläne pro Owner (Mitarbeiter/Ressource).\n`weekly` = Map \"mon\"..\"sun\" → Liste [start,end] als \"HH:MM\".\nRechte: Lesen `scheduling.schedule.view`, Schreiben `scheduling.schedule.manage`.","properties":{"ownerType":{"enum":["employee","resource"],"type":["string","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"name":{"type":["string","null"]},"timezone":{"type":["string","null"]},"weekly":{"description":"Wochenplan: Map \"mon\"..\"sun\" → Liste von [start, end] als \"HH:MM\".","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"isDefault":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}},"required":["name"]},"SchedulingSchedule-sched_schedule.write.jsonMergePatch":{"type":"object","description":"Verfügbarkeits-Schedules (04-33 §3): benannte Wochenpläne pro Owner (Mitarbeiter/Ressource).\n`weekly` = Map \"mon\"..\"sun\" → Liste [start,end] als \"HH:MM\".\nRechte: Lesen `scheduling.schedule.view`, Schreiben `scheduling.schedule.manage`.","properties":{"ownerType":{"enum":["employee","resource"],"type":["string","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"name":{"type":["string","null"]},"timezone":{"type":["string","null"]},"weekly":{"description":"Wochenplan: Map \"mon\"..\"sun\" → Liste von [start, end] als \"HH:MM\".","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"isDefault":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"SchedulingSchedule.jsonld-sched_schedule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — Referenzziel für `EventTypeResource::scheduleId`.","type":["integer","null"]},"ownerType":{"enum":["employee","resource"],"type":["string","null"]},"ownerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"name":{"type":["string","null"]},"timezone":{"type":["string","null"]},"weekly":{"description":"Wochenplan: Map \"mon\"..\"sun\" → Liste von [start, end] als \"HH:MM\".","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"isDefault":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}},"required":["name"]}],"description":"Verfügbarkeits-Schedules (04-33 §3): benannte Wochenpläne pro Owner (Mitarbeiter/Ressource).\n`weekly` = Map \"mon\"..\"sun\" → Liste [start,end] als \"HH:MM\".\nRechte: Lesen `scheduling.schedule.view`, Schreiben `scheduling.schedule.manage`."},"Search-search.read":{"type":"object","description":"Zentrale, marken-/rechtegefilterte Volltextsuche (P-1; CLAUDE.md „Suche\").\n- `?q=` Pflicht, optional `?limit=`; IDOR-sicher über Berechtigungs-Tags + Marken-Sichtbarkeit.\n- Adapter-neutrale Trefferliste; Objektauflösung clientseitig über `entityType`/`entityId`/`metadata`.","properties":{"id":{"type":["string","null"]},"entityClass":{"description":"Voll qualifizierter Entity-Klassenname (z.B. Octi\\Plugin\\Knowledge\\Entity\\Article).","type":["string","null"]},"entityType":{"description":"Kurzer Typname (z.B. Article) für die clientseitige Darstellung/Routing.","type":["string","null"]},"entityId":{"description":"Öffentliche ULID des Treffers.","type":["string","null"]},"title":{"type":["string","null"]},"snippet":{"type":["string","null"]},"score":{"default":0,"type":"number"},"brandId":{"type":["integer","null"]},"metadata":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"Search.jsonld-search.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"entityClass":{"description":"Voll qualifizierter Entity-Klassenname (z.B. Octi\\Plugin\\Knowledge\\Entity\\Article).","type":["string","null"]},"entityType":{"description":"Kurzer Typname (z.B. Article) für die clientseitige Darstellung/Routing.","type":["string","null"]},"entityId":{"description":"Öffentliche ULID des Treffers.","type":["string","null"]},"title":{"type":["string","null"]},"snippet":{"type":["string","null"]},"score":{"default":0,"type":"number"},"brandId":{"type":["integer","null"]},"metadata":{"type":"object","additionalProperties":{"type":["string","null"]}}}}],"description":"Zentrale, marken-/rechtegefilterte Volltextsuche (P-1; CLAUDE.md „Suche\").\n- `?q=` Pflicht, optional `?limit=`; IDOR-sicher über Berechtigungs-Tags + Marken-Sichtbarkeit.\n- Adapter-neutrale Trefferliste; Objektauflösung clientseitig über `entityType`/`entityId`/`metadata`."},"SearchReindex-search_reindex.read":{"type":"object","description":"Neuaufbau des Such-Index — API-/MCP-Pendant zu `search:reindex` (Audit R19, P-1/P-2).\n- Lauf asynchron im Worker ({@see \\App\\Platform\\Search\\Message\\ReindexSearchMessage}); POST bestätigt nur Einreihung.\n- `types` begrenzt auf Kurzname/FQCN; leer/fehlend = alle.","properties":{"id":{"type":["string","null"]},"types":{"description":"Auf diese Typen begrenzen (Kurzname wie `Customer` oder FQCN); leer = alle.","type":"array","items":{"type":"string"}},"queued":{"description":"Bestätigt Einreihung in Worker-Queue.","default":false,"type":"boolean"}}},"SearchReindex-search_reindex.write":{"type":"object","description":"Neuaufbau des Such-Index — API-/MCP-Pendant zu `search:reindex` (Audit R19, P-1/P-2).\n- Lauf asynchron im Worker ({@see \\App\\Platform\\Search\\Message\\ReindexSearchMessage}); POST bestätigt nur Einreihung.\n- `types` begrenzt auf Kurzname/FQCN; leer/fehlend = alle.","properties":{"types":{"description":"Auf diese Typen begrenzen (Kurzname wie `Customer` oder FQCN); leer = alle.","type":"array","items":{"type":"string"}}}},"SearchReindex.jsonld-search_reindex.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"types":{"description":"Auf diese Typen begrenzen (Kurzname wie `Customer` oder FQCN); leer = alle.","type":"array","items":{"type":"string"}},"queued":{"description":"Bestätigt Einreihung in Worker-Queue.","default":false,"type":"boolean"}}}],"description":"Neuaufbau des Such-Index — API-/MCP-Pendant zu `search:reindex` (Audit R19, P-1/P-2).\n- Lauf asynchron im Worker ({@see \\App\\Platform\\Search\\Message\\ReindexSearchMessage}); POST bestätigt nur Einreihung.\n- `types` begrenzt auf Kurzname/FQCN; leer/fehlend = alle."},"Setting-setting.read":{"type":"object","properties":{"id":{"type":["integer","null"]},"key":{"maxLength":255,"default":"","type":"string"},"value":{"description":"Schreibbarer Wert. Bei 'encrypted'-Settings beim Lesen nur die Maske\n{@see \\App\\Platform\\Integration\\Service\\IntegrationConfigSecrets::MASK} (write-only, intg-04,\nanalog Webhook-/Integration-Secrets); Vorhandensein zeigt {@see $hasValue}.","type":["string","null"]},"hasValue":{"description":"true = verschlüsselter Wert hinterlegt (Klartext nie zurückgegeben). Nur für 'encrypted' relevant.","default":false,"type":"boolean"},"type":{"enum":["bool","int","string","json","encrypted"],"default":"string","type":"string"},"scope":{"enum":["system","brand"],"default":"system","type":"string"},"brandId":{"type":["integer","null"]},"category":{"maxLength":100,"type":["string","null"]},"typedValue":{"type":["string","null"]},"decryptError":{"description":"true = Entschlüsselung fehlgeschlagen (z. B. Schlüsselrotation/Korruption); value/typedValue\ndann null. Isoliert defekte Zeilen, statt die ganze Collection zu brechen.","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["key","type","scope"]},"Setting-setting.write.jsonMergePatch":{"type":"object","properties":{"value":{"description":"Schreibbarer Wert. Bei 'encrypted'-Settings beim Lesen nur die Maske\n{@see \\App\\Platform\\Integration\\Service\\IntegrationConfigSecrets::MASK} (write-only, intg-04,\nanalog Webhook-/Integration-Secrets); Vorhandensein zeigt {@see $hasValue}.","type":["string","null"]},"type":{"enum":["bool","int","string","json","encrypted"],"default":"string","type":"string"},"category":{"maxLength":100,"type":["string","null"]}}},"Setting-setting.write_setting.create":{"type":"object","required":["key","type","scope"],"properties":{"key":{"maxLength":255,"default":"","type":"string"},"value":{"description":"Schreibbarer Wert. Bei 'encrypted'-Settings beim Lesen nur die Maske\n{@see \\App\\Platform\\Integration\\Service\\IntegrationConfigSecrets::MASK} (write-only, intg-04,\nanalog Webhook-/Integration-Secrets); Vorhandensein zeigt {@see $hasValue}.","type":["string","null"]},"type":{"enum":["bool","int","string","json","encrypted"],"default":"string","type":"string"},"scope":{"enum":["system","brand"],"default":"system","type":"string"},"brandId":{"type":["integer","null"]},"category":{"maxLength":100,"type":["string","null"]}}},"Setting.jsonld-setting.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["integer","null"]},"key":{"maxLength":255,"default":"","type":"string"},"value":{"description":"Schreibbarer Wert. Bei 'encrypted'-Settings beim Lesen nur die Maske\n{@see \\App\\Platform\\Integration\\Service\\IntegrationConfigSecrets::MASK} (write-only, intg-04,\nanalog Webhook-/Integration-Secrets); Vorhandensein zeigt {@see $hasValue}.","type":["string","null"]},"hasValue":{"description":"true = verschlüsselter Wert hinterlegt (Klartext nie zurückgegeben). Nur für 'encrypted' relevant.","default":false,"type":"boolean"},"type":{"enum":["bool","int","string","json","encrypted"],"default":"string","type":"string"},"scope":{"enum":["system","brand"],"default":"system","type":"string"},"brandId":{"type":["integer","null"]},"category":{"maxLength":100,"type":["string","null"]},"typedValue":{"type":["string","null"]},"decryptError":{"description":"true = Entschlüsselung fehlgeschlagen (z. B. Schlüsselrotation/Korruption); value/typedValue\ndann null. Isoliert defekte Zeilen, statt die ganze Collection zu brechen.","default":false,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["key","type","scope"]}]},"Shipment":{"type":"object","description":"Sendungs-Resource (04-22 §8) — Lese-Sicht auf physische Sendungen.\n- Entstehen über ship-Aktion des Lieferscheins; Fortschritt via delivered-Aktion / Tracking-Sync\n- Einzige Schreib-Aktion: retry-label (Label-Nachkauf nach fehlgeschlagenem Carrier-Call, Audit R18 #17)\n- Marken-Scope über den Lieferschein.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"deliveryNoteId":{"type":["integer","null"]},"deliveryNoteNumber":{"description":"Nummer des zugehörigen Lieferscheins (read-only, je Seite gebatcht statt Client-Katalog — Audit R20 PERF-2).","type":["string","null"]},"carrierPluginKey":{"type":["string","null"]},"service":{"type":["string","null"]},"fulfillmentType":{"description":"own|dropship.","type":["string","null"]},"trackingNumber":{"type":["string","null"]},"labelFileId":{"type":["integer","null"]},"labelFileUlid":{"description":"ULID des Carrier-Labels (Platform-File) — Download via `/v1/platform/files/{ulid}/download`.","type":["string","null"]},"customsDocFileId":{"type":["integer","null"]},"customsDocFileUlid":{"description":"ULID des Zoll-/Exportdokuments (Platform-File) — Download via `/v1/platform/files/{ulid}/download`.","type":["string","null"]},"shippingCostAmount":{"description":"Versandkosten in Cent.","type":["integer","null"]},"status":{"description":"created/handed_over/in_transit/delivered/failed.","type":["string","null"]},"weightGrams":{"type":["integer","null"]},"shippedAt":{"type":["string","null"]},"packages":{"description":"Packstücke (nur im Detail): Liste von {ulid, weightGrams, lengthMm, widthMm,\nheightMm, content, trackingNumber}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Shipment-shipment.read":{"type":"object","description":"Sendungs-Resource (04-22 §8) — Lese-Sicht auf physische Sendungen.\n- Entstehen über ship-Aktion des Lieferscheins; Fortschritt via delivered-Aktion / Tracking-Sync\n- Einzige Schreib-Aktion: retry-label (Label-Nachkauf nach fehlgeschlagenem Carrier-Call, Audit R18 #17)\n- Marken-Scope über den Lieferschein.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"deliveryNoteId":{"type":["integer","null"]},"deliveryNoteNumber":{"description":"Nummer des zugehörigen Lieferscheins (read-only, je Seite gebatcht statt Client-Katalog — Audit R20 PERF-2).","type":["string","null"]},"carrierPluginKey":{"type":["string","null"]},"service":{"type":["string","null"]},"fulfillmentType":{"description":"own|dropship.","type":["string","null"]},"trackingNumber":{"type":["string","null"]},"labelFileId":{"type":["integer","null"]},"labelFileUlid":{"description":"ULID des Carrier-Labels (Platform-File) — Download via `/v1/platform/files/{ulid}/download`.","type":["string","null"]},"customsDocFileId":{"type":["integer","null"]},"customsDocFileUlid":{"description":"ULID des Zoll-/Exportdokuments (Platform-File) — Download via `/v1/platform/files/{ulid}/download`.","type":["string","null"]},"shippingCostAmount":{"description":"Versandkosten in Cent.","type":["integer","null"]},"status":{"description":"created/handed_over/in_transit/delivered/failed.","type":["string","null"]},"weightGrams":{"type":["integer","null"]},"shippedAt":{"type":["string","null"]},"packages":{"description":"Packstücke (nur im Detail): Liste von {ulid, weightGrams, lengthMm, widthMm,\nheightMm, content, trackingNumber}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Shipment.jsonld-shipment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"deliveryNoteId":{"type":["integer","null"]},"deliveryNoteNumber":{"description":"Nummer des zugehörigen Lieferscheins (read-only, je Seite gebatcht statt Client-Katalog — Audit R20 PERF-2).","type":["string","null"]},"carrierPluginKey":{"type":["string","null"]},"service":{"type":["string","null"]},"fulfillmentType":{"description":"own|dropship.","type":["string","null"]},"trackingNumber":{"type":["string","null"]},"labelFileId":{"type":["integer","null"]},"labelFileUlid":{"description":"ULID des Carrier-Labels (Platform-File) — Download via `/v1/platform/files/{ulid}/download`.","type":["string","null"]},"customsDocFileId":{"type":["integer","null"]},"customsDocFileUlid":{"description":"ULID des Zoll-/Exportdokuments (Platform-File) — Download via `/v1/platform/files/{ulid}/download`.","type":["string","null"]},"shippingCostAmount":{"description":"Versandkosten in Cent.","type":["integer","null"]},"status":{"description":"created/handed_over/in_transit/delivered/failed.","type":["string","null"]},"weightGrams":{"type":["integer","null"]},"shippedAt":{"type":["string","null"]},"packages":{"description":"Packstücke (nur im Detail): Liste von {ulid, weightGrams, lengthMm, widthMm,\nheightMm, content, trackingNumber}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Sendungs-Resource (04-22 §8) — Lese-Sicht auf physische Sendungen.\n- Entstehen über ship-Aktion des Lieferscheins; Fortschritt via delivered-Aktion / Tracking-Sync\n- Einzige Schreib-Aktion: retry-label (Label-Nachkauf nach fehlgeschlagenem Carrier-Call, Audit R18 #17)\n- Marken-Scope über den Lieferschein."},"ShippingAutoShipRun-shipping_auto_ship_run.read":{"type":"object","description":"`POST /v1/delivery-notes/auto-ship-run` — API-Pendant zu `shipping:auto-ship` (Befund R38-21:\nder Lauf war zuvor NUR auf der Konsole anstoßbar).\n\nNutzt denselben {@see \\Octi\\Plugin\\Shipping\\Service\\AutoShippingService} wie Kommando und\nZeitplan, unter demselben `default-schedule`-Lock (belegt → 409). Der Lauf legt Lieferscheine an\nund kauft KEINE Labels. Literal `auto-ship-run` kollidiert nicht mit der `{ulid}`-Route.","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"ShippingAutoShipRun-shipping_auto_ship_run.write":{"type":"object","description":"`POST /v1/delivery-notes/auto-ship-run` — API-Pendant zu `shipping:auto-ship` (Befund R38-21:\nder Lauf war zuvor NUR auf der Konsole anstoßbar).\n\nNutzt denselben {@see \\Octi\\Plugin\\Shipping\\Service\\AutoShippingService} wie Kommando und\nZeitplan, unter demselben `default-schedule`-Lock (belegt → 409). Der Lauf legt Lieferscheine an\nund kauft KEINE Labels. Literal `auto-ship-run` kollidiert nicht mit der `{ulid}`-Route.","properties":{"dryRun":{"description":"true = nur urteilen, nichts anlegen (wie `--dry-run`).","default":false,"type":"boolean"},"limit":{"minimum":1,"maximum":1000,"description":"Obergrenze der geprüften Aufträge je Lauf (Default 200, wie `--limit`).","type":["integer","null"]}}},"ShippingAutoShipRun.jsonld-shipping_auto_ship_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"`POST /v1/delivery-notes/auto-ship-run` — API-Pendant zu `shipping:auto-ship` (Befund R38-21:\nder Lauf war zuvor NUR auf der Konsole anstoßbar).\n\nNutzt denselben {@see \\Octi\\Plugin\\Shipping\\Service\\AutoShippingService} wie Kommando und\nZeitplan, unter demselben `default-schedule`-Lock (belegt → 409). Der Lauf legt Lieferscheine an\nund kauft KEINE Labels. Literal `auto-ship-run` kollidiert nicht mit der `{ulid}`-Route."},"ShippingCenterStats-shipping_center_stats.read":{"type":"object","description":"Versandzentrum-Kennzahlen (04-35 §3/§4): aggregierte Arbeitsvorräte des Versand-Dashboards.\n- Read-only, markenscope-gefiltert (Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}), Ein-Element-Collection\n- ordersReadyToShip/readyOrders fail-closed 0/leer wenn module.sales inaktiv (ENT-ERP-OPTDEP-01).","properties":{"id":{"type":["string","null"]},"ordersReadyToShip":{"description":"Versandfertige Aufträge: confirmed/partially_delivered, nicht deliveryBlockedUntilPaid,\nmind. 1 Position mit offener Menge > 0 — Vorbedingung von POST /v1/delivery-notes (createFromOrder).","type":["integer","null"]},"deliveryNotesToPick":{"description":"Lieferscheine im Status `draft` (zu kommissionieren).","type":["integer","null"]},"deliveryNotesReadyToShip":{"description":"Lieferscheine im Status `picked` (versandbereit).","type":["integer","null"]},"shipmentsInTransit":{"description":"Sendungen unterwegs (Status created/handed_over/in_transit).","type":["integer","null"]},"shipmentsShippedToday":{"description":"Heute versendete Sendungen (`shippedAt` am heutigen Geschäftstag, Europe/Berlin).","type":["integer","null"]},"returnsOpen":{"description":"Offene Retouren (Status requested/approved/received).","type":["integer","null"]},"salesOrdersAvailable":{"description":"Auftrags-Modul (OctiSalesOrder, module.sales) aktiv? false ⇒ ordersReadyToShip/readyOrders fail-closed 0/leer, UI blendet Arbeitsvorrat aus.","type":["boolean","null"]},"readyOrders":{"description":"Bis zu 50 älteste versandfertige Aufträge: Liste {ulid, number, customerId, customerName,\nopenItems, orderedAt}. openItems = Positionen mit offener Liefermenge; customerName null\nwenn kein Kunde. Leer wenn Auftrags-Modul inaktiv.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"ShippingCenterStats.jsonld-shipping_center_stats.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"ordersReadyToShip":{"description":"Versandfertige Aufträge: confirmed/partially_delivered, nicht deliveryBlockedUntilPaid,\nmind. 1 Position mit offener Menge > 0 — Vorbedingung von POST /v1/delivery-notes (createFromOrder).","type":["integer","null"]},"deliveryNotesToPick":{"description":"Lieferscheine im Status `draft` (zu kommissionieren).","type":["integer","null"]},"deliveryNotesReadyToShip":{"description":"Lieferscheine im Status `picked` (versandbereit).","type":["integer","null"]},"shipmentsInTransit":{"description":"Sendungen unterwegs (Status created/handed_over/in_transit).","type":["integer","null"]},"shipmentsShippedToday":{"description":"Heute versendete Sendungen (`shippedAt` am heutigen Geschäftstag, Europe/Berlin).","type":["integer","null"]},"returnsOpen":{"description":"Offene Retouren (Status requested/approved/received).","type":["integer","null"]},"salesOrdersAvailable":{"description":"Auftrags-Modul (OctiSalesOrder, module.sales) aktiv? false ⇒ ordersReadyToShip/readyOrders fail-closed 0/leer, UI blendet Arbeitsvorrat aus.","type":["boolean","null"]},"readyOrders":{"description":"Bis zu 50 älteste versandfertige Aufträge: Liste {ulid, number, customerId, customerName,\nopenItems, orderedAt}. openItems = Positionen mit offener Liefermenge; customerName null\nwenn kein Kunde. Leer wenn Auftrags-Modul inaktiv.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Versandzentrum-Kennzahlen (04-35 §3/§4): aggregierte Arbeitsvorräte des Versand-Dashboards.\n- Read-only, markenscope-gefiltert (Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}), Ein-Element-Collection\n- ordersReadyToShip/readyOrders fail-closed 0/leer wenn module.sales inaktiv (ENT-ERP-OPTDEP-01)."},"ShippingCostRule-shipping_cost_rule.read":{"type":"object","description":"Versandkosten-Regel-Resource (04-22 §6/§8, Entscheidung S5).\n- CRUD regelbasierter Versandkosten (Gewicht/Wert/fix je Zone/Carrier/Marke, Free-Shipping-Schwelle)\n- Versand-Konfiguration ⇒ durchgängig shipping.config.manage.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"carrierPluginKey":{"maxLength":50,"description":"Carrier-Schlüssel; null = alle Carrier.","type":["string","null"]},"zone":{"maxLength":20,"description":"Versandzone (z. B. de/eu/world); Default de.","type":["string","null"]},"basis":{"enum":["weight","value","fixed"],"description":"weight|value|fixed.","type":["string","null"]},"fromValue":{"description":"Staffel-Untergrenze (Gramm bei weight, Cent bei value); null = offen.","type":["integer","null"]},"toValue":{"description":"Staffel-Obergrenze (Gramm bei weight, Cent bei value); null = offen.","type":["integer","null"]},"costAmount":{"description":"Versandkosten in Cent.","type":["integer","null"]},"freeThresholdAmount":{"description":"Free-Shipping-Schwelle in Cent; null = keine.","type":["integer","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"ShippingCostRule-shipping_cost_rule.write":{"type":"object","description":"Versandkosten-Regel-Resource (04-22 §6/§8, Entscheidung S5).\n- CRUD regelbasierter Versandkosten (Gewicht/Wert/fix je Zone/Carrier/Marke, Free-Shipping-Schwelle)\n- Versand-Konfiguration ⇒ durchgängig shipping.config.manage.","properties":{"carrierPluginKey":{"maxLength":50,"description":"Carrier-Schlüssel; null = alle Carrier.","type":["string","null"]},"zone":{"maxLength":20,"description":"Versandzone (z. B. de/eu/world); Default de.","type":["string","null"]},"basis":{"enum":["weight","value","fixed"],"description":"weight|value|fixed.","type":["string","null"]},"fromValue":{"description":"Staffel-Untergrenze (Gramm bei weight, Cent bei value); null = offen.","type":["integer","null"]},"toValue":{"description":"Staffel-Obergrenze (Gramm bei weight, Cent bei value); null = offen.","type":["integer","null"]},"costAmount":{"description":"Versandkosten in Cent.","type":["integer","null"]},"freeThresholdAmount":{"description":"Free-Shipping-Schwelle in Cent; null = keine.","type":["integer","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"ShippingCostRule-shipping_cost_rule.write.jsonMergePatch":{"type":"object","description":"Versandkosten-Regel-Resource (04-22 §6/§8, Entscheidung S5).\n- CRUD regelbasierter Versandkosten (Gewicht/Wert/fix je Zone/Carrier/Marke, Free-Shipping-Schwelle)\n- Versand-Konfiguration ⇒ durchgängig shipping.config.manage.","properties":{"carrierPluginKey":{"maxLength":50,"description":"Carrier-Schlüssel; null = alle Carrier.","type":["string","null"]},"zone":{"maxLength":20,"description":"Versandzone (z. B. de/eu/world); Default de.","type":["string","null"]},"basis":{"enum":["weight","value","fixed"],"description":"weight|value|fixed.","type":["string","null"]},"fromValue":{"description":"Staffel-Untergrenze (Gramm bei weight, Cent bei value); null = offen.","type":["integer","null"]},"toValue":{"description":"Staffel-Obergrenze (Gramm bei weight, Cent bei value); null = offen.","type":["integer","null"]},"costAmount":{"description":"Versandkosten in Cent.","type":["integer","null"]},"freeThresholdAmount":{"description":"Free-Shipping-Schwelle in Cent; null = keine.","type":["integer","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}},"ShippingCostRule.jsonld-shipping_cost_rule.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"carrierPluginKey":{"maxLength":50,"description":"Carrier-Schlüssel; null = alle Carrier.","type":["string","null"]},"zone":{"maxLength":20,"description":"Versandzone (z. B. de/eu/world); Default de.","type":["string","null"]},"basis":{"enum":["weight","value","fixed"],"description":"weight|value|fixed.","type":["string","null"]},"fromValue":{"description":"Staffel-Untergrenze (Gramm bei weight, Cent bei value); null = offen.","type":["integer","null"]},"toValue":{"description":"Staffel-Obergrenze (Gramm bei weight, Cent bei value); null = offen.","type":["integer","null"]},"costAmount":{"description":"Versandkosten in Cent.","type":["integer","null"]},"freeThresholdAmount":{"description":"Free-Shipping-Schwelle in Cent; null = keine.","type":["integer","null"]},"active":{"type":["boolean","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]}}}],"description":"Versandkosten-Regel-Resource (04-22 §6/§8, Entscheidung S5).\n- CRUD regelbasierter Versandkosten (Gewicht/Wert/fix je Zone/Carrier/Marke, Free-Shipping-Schwelle)\n- Versand-Konfiguration ⇒ durchgängig shipping.config.manage."},"ShippingReturnQuota-return_quota.read":{"type":"object","description":"Retourenquote je Grund (Doc 25 AP 3.7, B7).\n\nDie wichtigste Zahl ist `ourFaultQty`: eine Quote von 30 % ist harmlos, wenn Kunden Größen\nbestellen und aussuchen — und ein Alarm, wenn wir falsch liefern. Ohne diese Trennung sagt die\nQuote nichts darüber, ob etwas zu tun ist.","properties":{"ulid":{"default":"return-quota","type":"string"},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"returnedQty":{"description":"Zurückgekommene Menge im Zeitraum.","default":0,"type":"number"},"ourFaultQty":{"description":"Davon aus Gründen, die wir zu verantworten haben — die Zahl, auf die es ankommt.","default":0,"type":"number"},"reasons":{"description":"Je Grund, größte Gruppe zuerst.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"}]}}}}},"ShippingReturnQuota.jsonld-return_quota.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"default":"return-quota","type":"string"},"from":{"type":["string","null"]},"to":{"type":["string","null"]},"returnedQty":{"description":"Zurückgekommene Menge im Zeitraum.","default":0,"type":"number"},"ourFaultQty":{"description":"Davon aus Gründen, die wir zu verantworten haben — die Zahl, auf die es ankommt.","default":0,"type":"number"},"reasons":{"description":"Je Grund, größte Gruppe zuerst.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"}]}}}}}],"description":"Retourenquote je Grund (Doc 25 AP 3.7, B7).\n\nDie wichtigste Zahl ist `ourFaultQty`: eine Quote von 30 % ist harmlos, wenn Kunden Größen\nbestellen und aussuchen — und ein Alarm, wenn wir falsch liefern. Ohne diese Trennung sagt die\nQuote nichts darüber, ob etwas zu tun ist."},"ShippingTrackingSyncRun-shipping_tracking_sync_run.read":{"type":"object","description":"`POST /v1/shipments/tracking-sync-run` — API-Pendant zu `shipping:tracking-sync` (Befund R38-20:\nder Abgleich war zuvor NUR auf der Konsole anstoßbar, damit für Oberfläche, MCP und Automation\nnicht vorhanden).\n\nNutzt denselben {@see \\Octi\\Plugin\\Shipping\\Service\\TrackingSyncService} wie Kommando und\nZeitplan, unter demselben `default-schedule`-Lock (belegt → 409). Literal `tracking-sync-run`\nkollidiert nicht mit der `{ulid}`-Route (ULID-Format-Requirement, Muster QuoteExpiryRun).","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"ShippingTrackingSyncRun-shipping_tracking_sync_run.write":{"type":"object","description":"`POST /v1/shipments/tracking-sync-run` — API-Pendant zu `shipping:tracking-sync` (Befund R38-20:\nder Abgleich war zuvor NUR auf der Konsole anstoßbar, damit für Oberfläche, MCP und Automation\nnicht vorhanden).\n\nNutzt denselben {@see \\Octi\\Plugin\\Shipping\\Service\\TrackingSyncService} wie Kommando und\nZeitplan, unter demselben `default-schedule`-Lock (belegt → 409). Literal `tracking-sync-run`\nkollidiert nicht mit der `{ulid}`-Route (ULID-Format-Requirement, Muster QuoteExpiryRun).","properties":{"dryRun":{"description":"true = nur abfragen, nichts schreiben und nichts versenden (wie `--dry-run`).","default":false,"type":"boolean"},"limit":{"minimum":1,"maximum":1000,"description":"Obergrenze der abgefragten Sendungen je Lauf (Default 200, wie `--limit`).","type":["integer","null"]}}},"ShippingTrackingSyncRun.jsonld-shipping_tracking_sync_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"`POST /v1/shipments/tracking-sync-run` — API-Pendant zu `shipping:tracking-sync` (Befund R38-20:\nder Abgleich war zuvor NUR auf der Konsole anstoßbar, damit für Oberfläche, MCP und Automation\nnicht vorhanden).\n\nNutzt denselben {@see \\Octi\\Plugin\\Shipping\\Service\\TrackingSyncService} wie Kommando und\nZeitplan, unter demselben `default-schedule`-Lock (belegt → 409). Literal `tracking-sync-run`\nkollidiert nicht mit der `{ulid}`-Route (ULID-Format-Requirement, Muster QuoteExpiryRun)."},"Site-site.read":{"type":"object","description":"Site der Marke (Doc 35 Stufe 4, W-a). Seiten-Referenzen (Startseite, Fehler-, Wartungs-,\nPflichtseiten) laufen als Seiten-ULIDs; `legalStatus` (W-e) zeigt, ob die Pflichtseiten\ngesetzt UND veroeffentlicht sind.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"primaryHost":{"description":"lowercase, ohne Schema; leerer String löscht den Host.","type":["string","null"]},"additionalHosts":{"type":["array","null"],"items":{"type":"string"}},"defaultLocale":{"type":["string","null"]},"locales":{"type":["array","null"],"items":{"type":"string"}},"themeUlid":{"description":"Builder-Theme (Token-Satz) der Site.","type":["string","null"]},"homepagePageUlid":{"type":["string","null"]},"errorPageUlid":{"type":["string","null"]},"maintenancePageUlid":{"type":["string","null"]},"maintenanceMode":{"type":["boolean","null"]},"robotsPolicy":{"description":"{aiCrawlers: {GPTBot: allow|deny, …}, extraRules: [{userAgent, allow[], disallow[]}]}","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"llmsTxt":{"type":["string","null"]},"consentConfigJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"imprintPageUlid":{"type":["string","null"]},"privacyPageUlid":{"type":["string","null"]},"accessibilityPageUlid":{"type":["string","null"]},"cacheVersion":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"legalStatus":{"description":"Pflichtseiten-Status (W-e): gesetzt UND veröffentlicht.","type":["object","null"],"additionalProperties":{"type":"boolean"}},"createdAt":{"type":["string","null"]}}},"Site-site.write":{"type":"object","description":"Site der Marke (Doc 35 Stufe 4, W-a). Seiten-Referenzen (Startseite, Fehler-, Wartungs-,\nPflichtseiten) laufen als Seiten-ULIDs; `legalStatus` (W-e) zeigt, ob die Pflichtseiten\ngesetzt UND veroeffentlicht sind.","properties":{"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"primaryHost":{"description":"lowercase, ohne Schema; leerer String löscht den Host.","type":["string","null"]},"additionalHosts":{"type":["array","null"],"items":{"type":"string"}},"defaultLocale":{"type":["string","null"]},"locales":{"type":["array","null"],"items":{"type":"string"}},"themeUlid":{"description":"Builder-Theme (Token-Satz) der Site.","type":["string","null"]},"homepagePageUlid":{"type":["string","null"]},"errorPageUlid":{"type":["string","null"]},"maintenancePageUlid":{"type":["string","null"]},"maintenanceMode":{"type":["boolean","null"]},"robotsPolicy":{"description":"{aiCrawlers: {GPTBot: allow|deny, …}, extraRules: [{userAgent, allow[], disallow[]}]}","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"llmsTxt":{"type":["string","null"]},"consentConfigJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"imprintPageUlid":{"type":["string","null"]},"privacyPageUlid":{"type":["string","null"]},"accessibilityPageUlid":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"Site-site.write.jsonMergePatch":{"type":"object","description":"Site der Marke (Doc 35 Stufe 4, W-a). Seiten-Referenzen (Startseite, Fehler-, Wartungs-,\nPflichtseiten) laufen als Seiten-ULIDs; `legalStatus` (W-e) zeigt, ob die Pflichtseiten\ngesetzt UND veroeffentlicht sind.","properties":{"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"primaryHost":{"description":"lowercase, ohne Schema; leerer String löscht den Host.","type":["string","null"]},"additionalHosts":{"type":["array","null"],"items":{"type":"string"}},"defaultLocale":{"type":["string","null"]},"locales":{"type":["array","null"],"items":{"type":"string"}},"themeUlid":{"description":"Builder-Theme (Token-Satz) der Site.","type":["string","null"]},"homepagePageUlid":{"type":["string","null"]},"errorPageUlid":{"type":["string","null"]},"maintenancePageUlid":{"type":["string","null"]},"maintenanceMode":{"type":["boolean","null"]},"robotsPolicy":{"description":"{aiCrawlers: {GPTBot: allow|deny, …}, extraRules: [{userAgent, allow[], disallow[]}]}","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"llmsTxt":{"type":["string","null"]},"consentConfigJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"imprintPageUlid":{"type":["string","null"]},"privacyPageUlid":{"type":["string","null"]},"accessibilityPageUlid":{"type":["string","null"]},"active":{"type":["boolean","null"]}}},"Site.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"primaryHost":{"description":"lowercase, ohne Schema; leerer String löscht den Host.","type":["string","null"]},"additionalHosts":{"type":["array","null"],"items":{"type":"string"}},"defaultLocale":{"type":["string","null"]},"locales":{"type":["array","null"],"items":{"type":"string"}},"themeUlid":{"description":"Builder-Theme (Token-Satz) der Site.","type":["string","null"]},"homepagePageUlid":{"type":["string","null"]},"errorPageUlid":{"type":["string","null"]},"maintenancePageUlid":{"type":["string","null"]},"maintenanceMode":{"type":["boolean","null"]},"robotsPolicy":{"description":"{aiCrawlers: {GPTBot: allow|deny, …}, extraRules: [{userAgent, allow[], disallow[]}]}","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"llmsTxt":{"type":["string","null"]},"consentConfigJson":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"imprintPageUlid":{"type":["string","null"]},"privacyPageUlid":{"type":["string","null"]},"accessibilityPageUlid":{"type":["string","null"]},"cacheVersion":{"type":["integer","null"]},"active":{"type":["boolean","null"]},"legalStatus":{"description":"Pflichtseiten-Status (W-e): gesetzt UND veröffentlicht.","type":["object","null"],"additionalProperties":{"type":"boolean"}},"createdAt":{"type":["string","null"]}}}],"description":"Site der Marke (Doc 35 Stufe 4, W-a). Seiten-Referenzen (Startseite, Fehler-, Wartungs-,\nPflichtseiten) laufen als Seiten-ULIDs; `legalStatus` (W-e) zeigt, ob die Pflichtseiten\ngesetzt UND veroeffentlicht sind."},"SiteCollection-site.read":{"type":"object","description":"Collection-Schema (ENT-BUILDER-13, Doc 35 §13a): Felderliste mit Typ/Pflicht/uebersetzbar/\nReferenz-Ziel; Slug = URL-Segment der Eintrags-Seiten. Item-Rechte oeffnen die Lese-Sicht\n(Eintrags-Editor braucht das Schema), Schreiben nur mit site.collection.manage.","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"description":"URL-Segment der Eintrags-Seiten (je Site eindeutig).","type":["string","null"]},"fields":{"description":"Schema: {key, label, type, required?, translatable?, refCollectionUlid?}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"titleFieldKey":{"description":"Key des text-Feldes, das Titel/SEO-Titel liefert.","type":["string","null"]},"seoDescriptionKey":{"description":"Optionaler Key der Meta-Description-Quelle (text/richtext).","type":["string","null"]},"createdAt":{"type":["string","null"]}}},"SiteCollection-site.write":{"type":"object","description":"Collection-Schema (ENT-BUILDER-13, Doc 35 §13a): Felderliste mit Typ/Pflicht/uebersetzbar/\nReferenz-Ziel; Slug = URL-Segment der Eintrags-Seiten. Item-Rechte oeffnen die Lese-Sicht\n(Eintrags-Editor braucht das Schema), Schreiben nur mit site.collection.manage.","properties":{"siteUlid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"description":"URL-Segment der Eintrags-Seiten (je Site eindeutig).","type":["string","null"]},"fields":{"description":"Schema: {key, label, type, required?, translatable?, refCollectionUlid?}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"titleFieldKey":{"description":"Key des text-Feldes, das Titel/SEO-Titel liefert.","type":["string","null"]},"seoDescriptionKey":{"description":"Optionaler Key der Meta-Description-Quelle (text/richtext).","type":["string","null"]}}},"SiteCollection-site.write.jsonMergePatch":{"type":"object","description":"Collection-Schema (ENT-BUILDER-13, Doc 35 §13a): Felderliste mit Typ/Pflicht/uebersetzbar/\nReferenz-Ziel; Slug = URL-Segment der Eintrags-Seiten. Item-Rechte oeffnen die Lese-Sicht\n(Eintrags-Editor braucht das Schema), Schreiben nur mit site.collection.manage.","properties":{"siteUlid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"description":"URL-Segment der Eintrags-Seiten (je Site eindeutig).","type":["string","null"]},"fields":{"description":"Schema: {key, label, type, required?, translatable?, refCollectionUlid?}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"titleFieldKey":{"description":"Key des text-Feldes, das Titel/SEO-Titel liefert.","type":["string","null"]},"seoDescriptionKey":{"description":"Optionaler Key der Meta-Description-Quelle (text/richtext).","type":["string","null"]}}},"SiteCollection.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"description":"URL-Segment der Eintrags-Seiten (je Site eindeutig).","type":["string","null"]},"fields":{"description":"Schema: {key, label, type, required?, translatable?, refCollectionUlid?}","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"titleFieldKey":{"description":"Key des text-Feldes, das Titel/SEO-Titel liefert.","type":["string","null"]},"seoDescriptionKey":{"description":"Optionaler Key der Meta-Description-Quelle (text/richtext).","type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Collection-Schema (ENT-BUILDER-13, Doc 35 §13a): Felderliste mit Typ/Pflicht/uebersetzbar/\nReferenz-Ziel; Slug = URL-Segment der Eintrags-Seiten. Item-Rechte oeffnen die Lese-Sicht\n(Eintrags-Editor braucht das Schema), Schreiben nur mit site.collection.manage."},"SiteCollectionCsv-site.read":{"type":"object","description":"CSV-Austausch einer Collection (Doc 37 §7.3, Stufe 6).\n\nBewusst als API-Ressource mit JSON-Nutzlast und NICHT als Datei-Endpunkt: so ist der Weg\n„Bestand herausziehen, aendern, zurueckspielen\" auch fuer MCP und Automation erreichbar\n(P-1/P-2) — die Oberflaeche macht daraus einen Download bzw. nimmt eine Datei entgegen.","properties":{"ulid":{"default":"","type":"string"},"filename":{"description":"Dateiname-Vorschlag für den Download.","default":"","type":"string"},"csv":{"description":"CSV-Inhalt: beim Lesen die Ausgabe, beim Schreiben die Eingabe.","default":"","type":"string"},"created":{"default":0,"type":"integer"},"updated":{"default":0,"type":"integer"},"failed":{"default":0,"type":"integer"},"report":{"description":"Bericht je Zeile: {row, action: created|updated|failed, itemId?, slug?, error?}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"SiteCollectionCsv-site.write":{"type":"object","description":"CSV-Austausch einer Collection (Doc 37 §7.3, Stufe 6).\n\nBewusst als API-Ressource mit JSON-Nutzlast und NICHT als Datei-Endpunkt: so ist der Weg\n„Bestand herausziehen, aendern, zurueckspielen\" auch fuer MCP und Automation erreichbar\n(P-1/P-2) — die Oberflaeche macht daraus einen Download bzw. nimmt eine Datei entgegen.","properties":{"csv":{"description":"CSV-Inhalt: beim Lesen die Ausgabe, beim Schreiben die Eingabe.","default":"","type":"string"}}},"SiteCollectionCsv.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"default":"","type":"string"},"filename":{"description":"Dateiname-Vorschlag für den Download.","default":"","type":"string"},"csv":{"description":"CSV-Inhalt: beim Lesen die Ausgabe, beim Schreiben die Eingabe.","default":"","type":"string"},"created":{"default":0,"type":"integer"},"updated":{"default":0,"type":"integer"},"failed":{"default":0,"type":"integer"},"report":{"description":"Bericht je Zeile: {row, action: created|updated|failed, itemId?, slug?, error?}.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"CSV-Austausch einer Collection (Doc 37 §7.3, Stufe 6).\n\nBewusst als API-Ressource mit JSON-Nutzlast und NICHT als Datei-Endpunkt: so ist der Weg\n„Bestand herausziehen, aendern, zurueckspielen\" auch fuer MCP und Automation erreichbar\n(P-1/P-2) — die Oberflaeche macht daraus einen Download bzw. nimmt eine Datei entgegen."},"SiteCollectionItem-site.read":{"type":"object","description":"Collection-Eintrag (ENT-BUILDER-13): fields = {key: wert} gegen das Schema; uebersetzbare\nWerte in {i18n:{de,en}}-Form (werden NIE flachgeklopft). EIN Slug fuer alle Sprachen —\ndas Sprachpraefix macht die URL. /publish schaltet die Auslieferung frei (404 sonst).","properties":{"ulid":{"type":["string","null"]},"collectionUlid":{"type":["string","null"]},"slug":{"description":"EIN Slug fuer alle Sprachen (je Collection eindeutig).","type":["string","null"]},"fields":{"description":"Feld-Werte {key: wert}; i18n-Form bleibt erhalten","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"status":{"description":"draft | published","type":["string","null"]},"publishedAt":{"type":["string","null"]},"position":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"SiteCollectionItem-site.write":{"type":"object","description":"Collection-Eintrag (ENT-BUILDER-13): fields = {key: wert} gegen das Schema; uebersetzbare\nWerte in {i18n:{de,en}}-Form (werden NIE flachgeklopft). EIN Slug fuer alle Sprachen —\ndas Sprachpraefix macht die URL. /publish schaltet die Auslieferung frei (404 sonst).","properties":{"collectionUlid":{"type":["string","null"]},"slug":{"description":"EIN Slug fuer alle Sprachen (je Collection eindeutig).","type":["string","null"]},"fields":{"description":"Feld-Werte {key: wert}; i18n-Form bleibt erhalten","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"position":{"type":["integer","null"]}}},"SiteCollectionItem-site.write.jsonMergePatch":{"type":"object","description":"Collection-Eintrag (ENT-BUILDER-13): fields = {key: wert} gegen das Schema; uebersetzbare\nWerte in {i18n:{de,en}}-Form (werden NIE flachgeklopft). EIN Slug fuer alle Sprachen —\ndas Sprachpraefix macht die URL. /publish schaltet die Auslieferung frei (404 sonst).","properties":{"collectionUlid":{"type":["string","null"]},"slug":{"description":"EIN Slug fuer alle Sprachen (je Collection eindeutig).","type":["string","null"]},"fields":{"description":"Feld-Werte {key: wert}; i18n-Form bleibt erhalten","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"position":{"type":["integer","null"]}}},"SiteCollectionItem.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"collectionUlid":{"type":["string","null"]},"slug":{"description":"EIN Slug fuer alle Sprachen (je Collection eindeutig).","type":["string","null"]},"fields":{"description":"Feld-Werte {key: wert}; i18n-Form bleibt erhalten","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"status":{"description":"draft | published","type":["string","null"]},"publishedAt":{"type":["string","null"]},"position":{"type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Collection-Eintrag (ENT-BUILDER-13): fields = {key: wert} gegen das Schema; uebersetzbare\nWerte in {i18n:{de,en}}-Form (werden NIE flachgeklopft). EIN Slug fuer alle Sprachen —\ndas Sprachpraefix macht die URL. /publish schaltet die Auslieferung frei (404 sonst)."},"SiteConsentEvent-site.read":{"type":"object","description":"Cookie-Einwilligungs-Nachweise (W-e, nur lesend): Abgabe erfolgt ueber den\noeffentlichen Endpunkt POST /api/v1/site/public/consent.","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"choices":{"description":"{Kategorie-Key: Zustimmung}","type":["object","null"],"additionalProperties":{"type":"boolean"}},"visitorKey":{"description":"Kurz-Kennung des Besuchers (Praefix des getasteten IP-Hashes, R31-42): erkennt Mehrfach-\nAbgaben, taugt aber nicht zur Rueckrechnung. Der volle Hash bleibt serverseitig.","type":["string","null"]},"userAgent":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"SiteConsentEvent.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"choices":{"description":"{Kategorie-Key: Zustimmung}","type":["object","null"],"additionalProperties":{"type":"boolean"}},"visitorKey":{"description":"Kurz-Kennung des Besuchers (Praefix des getasteten IP-Hashes, R31-42): erkennt Mehrfach-\nAbgaben, taugt aber nicht zur Rueckrechnung. Der volle Hash bleibt serverseitig.","type":["string","null"]},"userAgent":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Cookie-Einwilligungs-Nachweise (W-e, nur lesend): Abgabe erfolgt ueber den\noeffentlichen Endpunkt POST /api/v1/site/public/consent."},"SiteMenu-site.read":{"type":"object","description":"Navigationsmenue einer Site (W-a): mehrere je Site, `key` als stabiler Einbau-Anker.","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"key":{"description":"Stabiler Einbau-Anker (z. B. main, footer); eindeutig je Site.","type":["string","null"]},"name":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"SiteMenu-site.write":{"type":"object","description":"Navigationsmenue einer Site (W-a): mehrere je Site, `key` als stabiler Einbau-Anker.","properties":{"siteUlid":{"type":["string","null"]},"key":{"description":"Stabiler Einbau-Anker (z. B. main, footer); eindeutig je Site.","type":["string","null"]},"name":{"type":["string","null"]}}},"SiteMenu-site.write.jsonMergePatch":{"type":"object","description":"Navigationsmenue einer Site (W-a): mehrere je Site, `key` als stabiler Einbau-Anker.","properties":{"siteUlid":{"type":["string","null"]},"key":{"description":"Stabiler Einbau-Anker (z. B. main, footer); eindeutig je Site.","type":["string","null"]},"name":{"type":["string","null"]}}},"SiteMenu.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"key":{"description":"Stabiler Einbau-Anker (z. B. main, footer); eindeutig je Site.","type":["string","null"]},"name":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Navigationsmenue einer Site (W-a): mehrere je Site, `key` als stabiler Einbau-Anker."},"SiteMenuItem-site.read":{"type":"object","description":"Menue-Eintrag (verschachtelbar): Ziel Seite (pageUlid) oder freie URL;\n`label` mehrsprachig als {locale: Text}.","properties":{"ulid":{"type":["string","null"]},"menuUlid":{"type":["string","null"]},"parentUlid":{"type":["string","null"]},"position":{"type":["integer","null"]},"label":{"description":"{locale: Beschriftung}","type":["object","null"],"additionalProperties":{"type":"string"}},"targetType":{"description":"page | url","type":["string","null"]},"pageUlid":{"type":["string","null"]},"url":{"type":["string","null"]},"newTab":{"type":["boolean","null"]}}},"SiteMenuItem-site.write":{"type":"object","description":"Menue-Eintrag (verschachtelbar): Ziel Seite (pageUlid) oder freie URL;\n`label` mehrsprachig als {locale: Text}.","properties":{"menuUlid":{"type":["string","null"]},"parentUlid":{"type":["string","null"]},"position":{"type":["integer","null"]},"label":{"description":"{locale: Beschriftung}","type":["object","null"],"additionalProperties":{"type":"string"}},"targetType":{"description":"page | url","type":["string","null"]},"pageUlid":{"type":["string","null"]},"url":{"type":["string","null"]},"newTab":{"type":["boolean","null"]}}},"SiteMenuItem-site.write.jsonMergePatch":{"type":"object","description":"Menue-Eintrag (verschachtelbar): Ziel Seite (pageUlid) oder freie URL;\n`label` mehrsprachig als {locale: Text}.","properties":{"menuUlid":{"type":["string","null"]},"parentUlid":{"type":["string","null"]},"position":{"type":["integer","null"]},"label":{"description":"{locale: Beschriftung}","type":["object","null"],"additionalProperties":{"type":"string"}},"targetType":{"description":"page | url","type":["string","null"]},"pageUlid":{"type":["string","null"]},"url":{"type":["string","null"]},"newTab":{"type":["boolean","null"]}}},"SiteMenuItem.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"menuUlid":{"type":["string","null"]},"parentUlid":{"type":["string","null"]},"position":{"type":["integer","null"]},"label":{"description":"{locale: Beschriftung}","type":["object","null"],"additionalProperties":{"type":"string"}},"targetType":{"description":"page | url","type":["string","null"]},"pageUlid":{"type":["string","null"]},"url":{"type":["string","null"]},"newTab":{"type":["boolean","null"]}}}],"description":"Menue-Eintrag (verschachtelbar): Ziel Seite (pageUlid) oder freie URL;\n`label` mehrsprachig als {locale: Text}."},"SitePage-site.read":{"type":"object","description":"Strukturknoten des Seitenbaums (B22): sprachneutral, traegt Baum/Sortierung/Art.\nTitel/Slug/Inhalt je Sprache: SitePageLocalization. Umhaengen via PATCH (parent/position)\noder POST /move; beides schreibt die URLs des Teilbaums mit 301 fort (W-c).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"siteUlid":{"type":["string","null"]},"parentUlid":{"type":["string","null"]},"position":{"type":["integer","null"]},"kind":{"description":"page | blog-index","type":["string","null"]},"active":{"type":["boolean","null"]},"localizedIn":{"description":"Sprachen mit vorhandener Auspraegung (read)","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"]}}},"SitePage-site.write":{"type":"object","description":"Strukturknoten des Seitenbaums (B22): sprachneutral, traegt Baum/Sortierung/Art.\nTitel/Slug/Inhalt je Sprache: SitePageLocalization. Umhaengen via PATCH (parent/position)\noder POST /move; beides schreibt die URLs des Teilbaums mit 301 fort (W-c).","properties":{"siteUlid":{"type":["string","null"]},"parentUlid":{"type":["string","null"]},"position":{"type":["integer","null"]},"kind":{"description":"page | blog-index","type":["string","null"]},"active":{"type":["boolean","null"]}}},"SitePage-site.write.jsonMergePatch":{"type":"object","description":"Strukturknoten des Seitenbaums (B22): sprachneutral, traegt Baum/Sortierung/Art.\nTitel/Slug/Inhalt je Sprache: SitePageLocalization. Umhaengen via PATCH (parent/position)\noder POST /move; beides schreibt die URLs des Teilbaums mit 301 fort (W-c).","properties":{"siteUlid":{"type":["string","null"]},"parentUlid":{"type":["string","null"]},"position":{"type":["integer","null"]},"kind":{"description":"page | blog-index","type":["string","null"]},"active":{"type":["boolean","null"]}}},"SitePage.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"siteUlid":{"type":["string","null"]},"parentUlid":{"type":["string","null"]},"position":{"type":["integer","null"]},"kind":{"description":"page | blog-index","type":["string","null"]},"active":{"type":["boolean","null"]},"localizedIn":{"description":"Sprachen mit vorhandener Auspraegung (read)","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"]}}}],"description":"Strukturknoten des Seitenbaums (B22): sprachneutral, traegt Baum/Sortierung/Art.\nTitel/Slug/Inhalt je Sprache: SitePageLocalization. Umhaengen via PATCH (parent/position)\noder POST /move; beides schreibt die URLs des Teilbaums mit 301 fort (W-c)."},"SitePageLocalization-site.read":{"type":"object","description":"Sprach-Auspraegung eines Strukturknotens (B22/ENT-BUILDER-12): POST stellt die GETEILTE\nBuilderPage des Knotens sicher (EIN Baum, Feld-Uebersetzung im Element, Release je\nSprache) — Inhalt wird im Builder bearbeitet und EINMAL veroeffentlicht.\nSlug-Aenderung schreibt die URL mit 301 fort (W-c).","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"title":{"type":["string","null"]},"slug":{"description":"URL-Segment ohne führenden /.","type":["string","null"]},"builderPageUlid":{"description":"GETEILTE Builder-Fläche des Seiten-Knotens (Inhalt + Veröffentlichung leben dort).","type":["string","null"]},"visible":{"description":"Eigener Sichtbarkeits-Schalter; ausgeliefert nur mit aktivem Builder-Release dieser Sprache.","type":["boolean","null"]},"path":{"description":"Aktueller aktiver Pfad (aus der URL-Tabelle).","type":["string","null"]},"createdAt":{"type":["string","null"]}}},"SitePageLocalization-site.write":{"type":"object","description":"Sprach-Auspraegung eines Strukturknotens (B22/ENT-BUILDER-12): POST stellt die GETEILTE\nBuilderPage des Knotens sicher (EIN Baum, Feld-Uebersetzung im Element, Release je\nSprache) — Inhalt wird im Builder bearbeitet und EINMAL veroeffentlicht.\nSlug-Aenderung schreibt die URL mit 301 fort (W-c).","properties":{"pageUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"title":{"type":["string","null"]},"slug":{"description":"URL-Segment ohne führenden /.","type":["string","null"]},"visible":{"description":"Eigener Sichtbarkeits-Schalter; ausgeliefert nur mit aktivem Builder-Release dieser Sprache.","type":["boolean","null"]}}},"SitePageLocalization-site.write.jsonMergePatch":{"type":"object","description":"Sprach-Auspraegung eines Strukturknotens (B22/ENT-BUILDER-12): POST stellt die GETEILTE\nBuilderPage des Knotens sicher (EIN Baum, Feld-Uebersetzung im Element, Release je\nSprache) — Inhalt wird im Builder bearbeitet und EINMAL veroeffentlicht.\nSlug-Aenderung schreibt die URL mit 301 fort (W-c).","properties":{"pageUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"title":{"type":["string","null"]},"slug":{"description":"URL-Segment ohne führenden /.","type":["string","null"]},"visible":{"description":"Eigener Sichtbarkeits-Schalter; ausgeliefert nur mit aktivem Builder-Release dieser Sprache.","type":["boolean","null"]}}},"SitePageLocalization.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"pageUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"title":{"type":["string","null"]},"slug":{"description":"URL-Segment ohne führenden /.","type":["string","null"]},"builderPageUlid":{"description":"GETEILTE Builder-Fläche des Seiten-Knotens (Inhalt + Veröffentlichung leben dort).","type":["string","null"]},"visible":{"description":"Eigener Sichtbarkeits-Schalter; ausgeliefert nur mit aktivem Builder-Release dieser Sprache.","type":["boolean","null"]},"path":{"description":"Aktueller aktiver Pfad (aus der URL-Tabelle).","type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Sprach-Auspraegung eines Strukturknotens (B22/ENT-BUILDER-12): POST stellt die GETEILTE\nBuilderPage des Knotens sicher (EIN Baum, Feld-Uebersetzung im Element, Release je\nSprache) — Inhalt wird im Builder bearbeitet und EINMAL veroeffentlicht.\nSlug-Aenderung schreibt die URL mit 301 fort (W-c)."},"SitePost-site.read":{"type":"object","description":"Blog-Beitrag (B11/W-b): Inhalt ist eine automatisch angelegte Builder-Flaeche.\nPOST /{ulid}/publish veroeffentlicht (Status, publishedAt, URL-Zeile /{locale?}/blog/{slug},\nLesezeit aus dem Inhalt).","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"title":{"type":["string","null"]},"slug":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"builderPageUlid":{"description":"Automatisch angelegte Builder-Fläche (Inhalt + Veröffentlichung leben dort).","type":["string","null"]},"authorEmployeeId":{"type":["integer","null"]},"featuredImageFileUlid":{"type":["string","null"]},"publishedAt":{"type":["string","null"]},"status":{"description":"draft | published","type":["string","null"]},"readingMinutes":{"description":"Lesezeit in Minuten (Wörter/200, beim Publish errechnet).","type":["integer","null"]},"translationGroupUlid":{"description":"Sprachgeschwister-Gruppe (Doc 35 §14): Beiträge derselben Gruppe sind Sprachfassungen voneinander.","type":["string","null"]},"categoryUlids":{"description":"Kategorie-ULIDs","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"]}}},"SitePost-site.write":{"type":"object","description":"Blog-Beitrag (B11/W-b): Inhalt ist eine automatisch angelegte Builder-Flaeche.\nPOST /{ulid}/publish veroeffentlicht (Status, publishedAt, URL-Zeile /{locale?}/blog/{slug},\nLesezeit aus dem Inhalt).","properties":{"siteUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"title":{"type":["string","null"]},"slug":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"authorEmployeeId":{"type":["integer","null"]},"featuredImageFileUlid":{"type":["string","null"]},"translationOfUlid":{"description":"write-only: ULID eines Beitrags derselben Site in ANDERER Sprache — übernimmt dessen\nGruppe bzw. stiftet eine neue (verknüpft beide Beiträge als Sprachfassungen).","type":["string","null"]},"categoryUlids":{"description":"Kategorie-ULIDs","type":["array","null"],"items":{"type":"string"}}}},"SitePost-site.write.jsonMergePatch":{"type":"object","description":"Blog-Beitrag (B11/W-b): Inhalt ist eine automatisch angelegte Builder-Flaeche.\nPOST /{ulid}/publish veroeffentlicht (Status, publishedAt, URL-Zeile /{locale?}/blog/{slug},\nLesezeit aus dem Inhalt).","properties":{"siteUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"title":{"type":["string","null"]},"slug":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"authorEmployeeId":{"type":["integer","null"]},"featuredImageFileUlid":{"type":["string","null"]},"translationOfUlid":{"description":"write-only: ULID eines Beitrags derselben Site in ANDERER Sprache — übernimmt dessen\nGruppe bzw. stiftet eine neue (verknüpft beide Beiträge als Sprachfassungen).","type":["string","null"]},"categoryUlids":{"description":"Kategorie-ULIDs","type":["array","null"],"items":{"type":"string"}}}},"SitePost.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"title":{"type":["string","null"]},"slug":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"builderPageUlid":{"description":"Automatisch angelegte Builder-Fläche (Inhalt + Veröffentlichung leben dort).","type":["string","null"]},"authorEmployeeId":{"type":["integer","null"]},"featuredImageFileUlid":{"type":["string","null"]},"publishedAt":{"type":["string","null"]},"status":{"description":"draft | published","type":["string","null"]},"readingMinutes":{"description":"Lesezeit in Minuten (Wörter/200, beim Publish errechnet).","type":["integer","null"]},"translationGroupUlid":{"description":"Sprachgeschwister-Gruppe (Doc 35 §14): Beiträge derselben Gruppe sind Sprachfassungen voneinander.","type":["string","null"]},"categoryUlids":{"description":"Kategorie-ULIDs","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"]}}}],"description":"Blog-Beitrag (B11/W-b): Inhalt ist eine automatisch angelegte Builder-Flaeche.\nPOST /{ulid}/publish veroeffentlicht (Status, publishedAt, URL-Zeile /{locale?}/blog/{slug},\nLesezeit aus dem Inhalt)."},"SitePostCategory-site.read":{"type":"object","description":"Blog-Kategorie (B11/W-b).","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}},"SitePostCategory-site.write":{"type":"object","description":"Blog-Kategorie (B11/W-b).","properties":{"siteUlid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"type":["string","null"]}}},"SitePostCategory-site.write.jsonMergePatch":{"type":"object","description":"Blog-Kategorie (B11/W-b).","properties":{"siteUlid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"type":["string","null"]}}},"SitePostCategory.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"name":{"type":["string","null"]},"slug":{"type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Blog-Kategorie (B11/W-b)."},"SiteUrl-site.read":{"type":"object","description":"URL-Tabelle der Site (B10/W-c): aktive Pfade + 301-Historie einsehbar; manuelle\nRedirect-Zeilen anlegbar; nur redirect-Zeilen loeschbar (aktive Zeilen pflegt das System).","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"path":{"description":"Vollständiger Pfad mit führendem /.","type":["string","null"]},"targetType":{"description":"page | post | null (manuelle Weiterleitung).","type":["string","null"]},"targetId":{"type":["integer","null"]},"status":{"description":"active | redirect","type":["string","null"]},"redirectToPath":{"type":["string","null"]},"httpStatus":{"type":["integer","null"]},"updatedAt":{"type":["string","null"]}}},"SiteUrl-site.write":{"type":"object","description":"URL-Tabelle der Site (B10/W-c): aktive Pfade + 301-Historie einsehbar; manuelle\nRedirect-Zeilen anlegbar; nur redirect-Zeilen loeschbar (aktive Zeilen pflegt das System).","properties":{"siteUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"path":{"description":"Vollständiger Pfad mit führendem /.","type":["string","null"]},"redirectToPath":{"type":["string","null"]}}},"SiteUrl.jsonld-site.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"siteUlid":{"type":["string","null"]},"locale":{"type":["string","null"]},"path":{"description":"Vollständiger Pfad mit führendem /.","type":["string","null"]},"targetType":{"description":"page | post | null (manuelle Weiterleitung).","type":["string","null"]},"targetId":{"type":["integer","null"]},"status":{"description":"active | redirect","type":["string","null"]},"redirectToPath":{"type":["string","null"]},"httpStatus":{"type":["integer","null"]},"updatedAt":{"type":["string","null"]}}}],"description":"URL-Tabelle der Site (B10/W-c): aktive Pfade + 301-Historie einsehbar; manuelle\nRedirect-Zeilen anlegbar; nur redirect-Zeilen loeschbar (aktive Zeilen pflegt das System)."},"SkillDemand-skilldemand.action":{"type":"object","description":"SkillDemand-Resource (04-09 §4.5): Skill-Bedarfe eines Projekts + Skill-Matching\n(rangierte Kandidaten inkl. freier Kapazität) + KI-Staffing-Vorschlag.\nBedarfe als gedeckt markierbar / wieder öffnenbar.","properties":{"employeeId":{"description":"mark-met: deckende Person.","type":["integer","null"]}}},"SkillDemand-skilldemand.read":{"type":"object","description":"SkillDemand-Resource (04-09 §4.5): Skill-Bedarfe eines Projekts + Skill-Matching\n(rangierte Kandidaten inkl. freier Kapazität) + KI-Staffing-Vorschlag.\nBedarfe als gedeckt markierbar / wieder öffnenbar.","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"milestoneId":{"type":["integer","null"]},"skillId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minLevel":{"minimum":1,"maximum":5,"type":["integer","null"]},"requiredHours":{"minimum":0,"type":["number","null"]},"periodStart":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"status":{"type":["string","null"]},"filledByEmployeeId":{"type":["integer","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"candidates":{"description":"Skill-Matching-Kandidaten (nur Candidates-Endpoint).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"aiSuggestion":{"type":["string","null"]}}},"SkillDemand-skilldemand.update.jsonMergePatch":{"type":"object","description":"SkillDemand-Resource (04-09 §4.5): Skill-Bedarfe eines Projekts + Skill-Matching\n(rangierte Kandidaten inkl. freier Kapazität) + KI-Staffing-Vorschlag.\nBedarfe als gedeckt markierbar / wieder öffnenbar.","properties":{"milestoneId":{"type":["integer","null"]},"skillId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minLevel":{"minimum":1,"maximum":5,"type":["integer","null"]},"requiredHours":{"minimum":0,"type":["number","null"]},"periodStart":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"note":{"type":["string","null"]}}},"SkillDemand-skilldemand.write":{"type":"object","description":"SkillDemand-Resource (04-09 §4.5): Skill-Bedarfe eines Projekts + Skill-Matching\n(rangierte Kandidaten inkl. freier Kapazität) + KI-Staffing-Vorschlag.\nBedarfe als gedeckt markierbar / wieder öffnenbar.","properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"milestoneId":{"type":["integer","null"]},"skillId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minLevel":{"minimum":1,"maximum":5,"type":["integer","null"]},"requiredHours":{"minimum":0,"type":["number","null"]},"periodStart":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"note":{"type":["string","null"]}}},"SkillDemand.jsonld-skilldemand.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"milestoneId":{"type":["integer","null"]},"skillId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minLevel":{"minimum":1,"maximum":5,"type":["integer","null"]},"requiredHours":{"minimum":0,"type":["number","null"]},"periodStart":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"periodEnd":{"description":"Tag (Y-m-d).","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"status":{"type":["string","null"]},"filledByEmployeeId":{"type":["integer","null"]},"note":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"candidates":{"description":"Skill-Matching-Kandidaten (nur Candidates-Endpoint).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"aiSuggestion":{"type":["string","null"]}}}],"description":"SkillDemand-Resource (04-09 §4.5): Skill-Bedarfe eines Projekts + Skill-Matching\n(rangierte Kandidaten inkl. freier Kapazität) + KI-Staffing-Vorschlag.\nBedarfe als gedeckt markierbar / wieder öffnenbar."},"Sla-ticket_sla.read":{"type":"object","description":"SLA-Definition als Daten (04-04 §3/§4.3/AK11). Quelle-Priorität: contractId > priorityLevel\n> isDefault.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"responseMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"resolutionMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"businessHoursId":{"type":["integer","null"]},"escalationRule":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"contractId":{"type":["integer","null"]},"priorityLevel":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"Sla-ticket_sla.update.jsonMergePatch":{"type":"object","description":"SLA-Definition als Daten (04-04 §3/§4.3/AK11). Quelle-Priorität: contractId > priorityLevel\n> isDefault.","properties":{"label":{"type":["string","null"]},"responseMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"resolutionMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"businessHoursId":{"type":["integer","null"]},"escalationRule":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"contractId":{"type":["integer","null"]},"priorityLevel":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"Sla-ticket_sla.write":{"type":"object","description":"SLA-Definition als Daten (04-04 §3/§4.3/AK11). Quelle-Priorität: contractId > priorityLevel\n> isDefault.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"responseMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"resolutionMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"businessHoursId":{"type":["integer","null"]},"escalationRule":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"contractId":{"type":["integer","null"]},"priorityLevel":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"Sla.jsonld-ticket_sla.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"responseMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"resolutionMinutes":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"businessHoursId":{"type":["integer","null"]},"escalationRule":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"contractId":{"type":["integer","null"]},"priorityLevel":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"SLA-Definition als Daten (04-04 §3/§4.3/AK11). Quelle-Priorität: contractId > priorityLevel\n> isDefault."},"SlackInstallation-slackinstall.read":{"type":"object","description":"Installations-ZUSTAND der Slack-App (Doc 27 6.1).\n\nDas MCP-sichtbare Admin-Pendant zur browser-gebundenen OAuth-Strecke\n({@see \\Octi\\Plugin\\Slack\\Controller\\SlackOAuthController}): „ist installiert, mit welchem\nWorkspace, ist der Eingang scharf\". Bewusst nur LESEND — installiert wird über die\nZustimmungs-Strecke, nicht per API-Aufruf.\n\nEnthaelt niemals Token oder Secrets, nur deren VORHANDENSEIN. Ein Statusfeld, das ein Geheimnis\nmitliefert, waere ein Leck mit Ansage.\n\nRechte-Schnitt (R36-31): bewusst SUBJEKTLOS geprueft. Es gibt genau einen Zustand je System, er\ntraegt weder Marke noch Eigentuemer — {@see \\Octi\\Plugin\\Slack\\Security\\OctiSlackVoter}\nkennt dieses Subjekt deshalb nicht, und der Katalog-Check ist hier der ganze Schnitt.","properties":{"id":{"description":"Singleton-Ressource: fester Identifier, es gibt genau eine Installation je System.","default":"current","type":"string"},"installed":{"description":"Bot-Token vorhanden — die App ist in einem Workspace installiert.","default":false,"type":"boolean"},"workspace":{"description":"Name des verbundenen Workspace (rein informativ); null = nicht installiert.","type":["string","null"]},"inboundReady":{"description":"Signing Secret hinterlegt. Ohne es bleibt der EINGANG (Slash-Befehle, Buttons) fail-closed\ngeschlossen — auch bei erfolgreicher Installation. Genau deshalb steht es hier: sonst sähe\neine halbe Einrichtung wie eine fertige aus.","default":false,"type":"boolean"}}},"SlackInstallation.jsonld-slackinstall.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Singleton-Ressource: fester Identifier, es gibt genau eine Installation je System.","default":"current","type":"string"},"installed":{"description":"Bot-Token vorhanden — die App ist in einem Workspace installiert.","default":false,"type":"boolean"},"workspace":{"description":"Name des verbundenen Workspace (rein informativ); null = nicht installiert.","type":["string","null"]},"inboundReady":{"description":"Signing Secret hinterlegt. Ohne es bleibt der EINGANG (Slash-Befehle, Buttons) fail-closed\ngeschlossen — auch bei erfolgreicher Installation. Genau deshalb steht es hier: sonst sähe\neine halbe Einrichtung wie eine fertige aus.","default":false,"type":"boolean"}}}],"description":"Installations-ZUSTAND der Slack-App (Doc 27 6.1).\n\nDas MCP-sichtbare Admin-Pendant zur browser-gebundenen OAuth-Strecke\n({@see \\Octi\\Plugin\\Slack\\Controller\\SlackOAuthController}): „ist installiert, mit welchem\nWorkspace, ist der Eingang scharf\". Bewusst nur LESEND — installiert wird über die\nZustimmungs-Strecke, nicht per API-Aufruf.\n\nEnthaelt niemals Token oder Secrets, nur deren VORHANDENSEIN. Ein Statusfeld, das ein Geheimnis\nmitliefert, waere ein Leck mit Ansage.\n\nRechte-Schnitt (R36-31): bewusst SUBJEKTLOS geprueft. Es gibt genau einen Zustand je System, er\ntraegt weder Marke noch Eigentuemer — {@see \\Octi\\Plugin\\Slack\\Security\\OctiSlackVoter}\nkennt dieses Subjekt deshalb nicht, und der Katalog-Check ist hier der ganze Schnitt."},"SlackProjectLink-slacklink.read":{"type":"object","description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.1).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\Slack\\Controller\\SlackInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\Slack\\Entity\\SlackProjectLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler.\n\nRechte-Schnitt (R36-31):\n- Item-Operationen prüfen MIT `object` — nur so wird {@see \\Octi\\Plugin\\Slack\\Security\\OctiSlackVoter}\n  überhaupt befragt (der Core-`PermissionVoter` enthält sich bei vorhandenem Subjekt, der\n  Objekt-Voter bei fehlendem — subjektlos befragt also KEINER die Objekt-Regel).\n- Collection und `Post` bleiben subjektlos: dort existiert zum Prüfzeitpunkt kein Objekt.\n- Wächter: `SlackItemVoterErreichbarkeitTest`.","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"channelId":{"maxLength":40,"description":"Slack-Channel-Id (`C…`) — nicht der Anzeigename, der ist umbenennbar.","type":["string","null"]},"channelName":{"maxLength":120,"type":["string","null"]},"active":{"description":"Ereignis-Posts aussetzen, ohne die Verknüpfung zu verlieren.","default":true,"type":"boolean"}},"required":["projectId","channelId"]},"SlackProjectLink-slacklink.write":{"type":"object","description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.1).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\Slack\\Controller\\SlackInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\Slack\\Entity\\SlackProjectLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler.\n\nRechte-Schnitt (R36-31):\n- Item-Operationen prüfen MIT `object` — nur so wird {@see \\Octi\\Plugin\\Slack\\Security\\OctiSlackVoter}\n  überhaupt befragt (der Core-`PermissionVoter` enthält sich bei vorhandenem Subjekt, der\n  Objekt-Voter bei fehlendem — subjektlos befragt also KEINER die Objekt-Regel).\n- Collection und `Post` bleiben subjektlos: dort existiert zum Prüfzeitpunkt kein Objekt.\n- Wächter: `SlackItemVoterErreichbarkeitTest`.","required":["projectId","channelId"],"properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"channelId":{"maxLength":40,"description":"Slack-Channel-Id (`C…`) — nicht der Anzeigename, der ist umbenennbar.","type":["string","null"]},"channelName":{"maxLength":120,"type":["string","null"]},"active":{"description":"Ereignis-Posts aussetzen, ohne die Verknüpfung zu verlieren.","default":true,"type":"boolean"}}},"SlackProjectLink-slacklink.write.jsonMergePatch":{"type":"object","description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.1).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\Slack\\Controller\\SlackInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\Slack\\Entity\\SlackProjectLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler.\n\nRechte-Schnitt (R36-31):\n- Item-Operationen prüfen MIT `object` — nur so wird {@see \\Octi\\Plugin\\Slack\\Security\\OctiSlackVoter}\n  überhaupt befragt (der Core-`PermissionVoter` enthält sich bei vorhandenem Subjekt, der\n  Objekt-Voter bei fehlendem — subjektlos befragt also KEINER die Objekt-Regel).\n- Collection und `Post` bleiben subjektlos: dort existiert zum Prüfzeitpunkt kein Objekt.\n- Wächter: `SlackItemVoterErreichbarkeitTest`.","properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"channelId":{"maxLength":40,"description":"Slack-Channel-Id (`C…`) — nicht der Anzeigename, der ist umbenennbar.","type":["string","null"]},"channelName":{"maxLength":120,"type":["string","null"]},"active":{"description":"Ereignis-Posts aussetzen, ohne die Verknüpfung zu verlieren.","default":true,"type":"boolean"}}},"SlackProjectLink.jsonld-slacklink.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"channelId":{"maxLength":40,"description":"Slack-Channel-Id (`C…`) — nicht der Anzeigename, der ist umbenennbar.","type":["string","null"]},"channelName":{"maxLength":120,"type":["string","null"]},"active":{"description":"Ereignis-Posts aussetzen, ohne die Verknüpfung zu verlieren.","default":true,"type":"boolean"}},"required":["projectId","channelId"]}],"description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.1).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\Slack\\Controller\\SlackInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\Slack\\Entity\\SlackProjectLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler.\n\nRechte-Schnitt (R36-31):\n- Item-Operationen prüfen MIT `object` — nur so wird {@see \\Octi\\Plugin\\Slack\\Security\\OctiSlackVoter}\n  überhaupt befragt (der Core-`PermissionVoter` enthält sich bei vorhandenem Subjekt, der\n  Objekt-Voter bei fehlendem — subjektlos befragt also KEINER die Objekt-Regel).\n- Collection und `Post` bleiben subjektlos: dort existiert zum Prüfzeitpunkt kein Objekt.\n- Wächter: `SlackItemVoterErreichbarkeitTest`."},"SmsCampaign-sms_campaign.read":{"type":"object","description":"Bulk-SMS-Kampagne (Programm 46 F-L, ENT-MKT-09).\n\nDER VERSAND IST EINE EIGENE OPERATION MIT EIGENEM RECHT. Er kostet Geld je Empfaenger und\nlaesst sich nicht zurueckholen — wer Entwuerfe pflegen darf, soll damit nicht tausend\nNachrichten ausloesen koennen. Dasselbe Muster wie beim Mail-Versand.","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"body":{"type":["string","null"]},"audienceId":{"type":["integer","null"]},"scheduledAt":{"description":"Geplanter Versandzeitpunkt; gesetzt ⇒ Zustand `scheduled`.","type":["string","null"]},"brandId":{"type":["integer","null"]},"status":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"sentCount":{"type":["integer","null"]},"segments":{"description":"Anzahl der Nachrichten, in die der Text zerfällt (161 Zeichen kosten das Doppelte von 160).","type":["integer","null"]},"createdAt":{"type":["string","null"]}}},"SmsCampaign-sms_campaign.write":{"type":"object","description":"Bulk-SMS-Kampagne (Programm 46 F-L, ENT-MKT-09).\n\nDER VERSAND IST EINE EIGENE OPERATION MIT EIGENEM RECHT. Er kostet Geld je Empfaenger und\nlaesst sich nicht zurueckholen — wer Entwuerfe pflegen darf, soll damit nicht tausend\nNachrichten ausloesen koennen. Dasselbe Muster wie beim Mail-Versand.","properties":{"name":{"type":["string","null"]},"body":{"type":["string","null"]},"audienceId":{"type":["integer","null"]},"scheduledAt":{"description":"Geplanter Versandzeitpunkt; gesetzt ⇒ Zustand `scheduled`.","type":["string","null"]},"brandId":{"type":["integer","null"]}}},"SmsCampaign-sms_campaign.write.jsonMergePatch":{"type":"object","description":"Bulk-SMS-Kampagne (Programm 46 F-L, ENT-MKT-09).\n\nDER VERSAND IST EINE EIGENE OPERATION MIT EIGENEM RECHT. Er kostet Geld je Empfaenger und\nlaesst sich nicht zurueckholen — wer Entwuerfe pflegen darf, soll damit nicht tausend\nNachrichten ausloesen koennen. Dasselbe Muster wie beim Mail-Versand.","properties":{"name":{"type":["string","null"]},"body":{"type":["string","null"]},"audienceId":{"type":["integer","null"]},"scheduledAt":{"description":"Geplanter Versandzeitpunkt; gesetzt ⇒ Zustand `scheduled`.","type":["string","null"]},"brandId":{"type":["integer","null"]}}},"SmsCampaign.jsonld-sms_campaign.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"type":["string","null"]},"body":{"type":["string","null"]},"audienceId":{"type":["integer","null"]},"scheduledAt":{"description":"Geplanter Versandzeitpunkt; gesetzt ⇒ Zustand `scheduled`.","type":["string","null"]},"brandId":{"type":["integer","null"]},"status":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"sentCount":{"type":["integer","null"]},"segments":{"description":"Anzahl der Nachrichten, in die der Text zerfällt (161 Zeichen kosten das Doppelte von 160).","type":["integer","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Bulk-SMS-Kampagne (Programm 46 F-L, ENT-MKT-09).\n\nDER VERSAND IST EINE EIGENE OPERATION MIT EIGENEM RECHT. Er kostet Geld je Empfaenger und\nlaesst sich nicht zurueckholen — wer Entwuerfe pflegen darf, soll damit nicht tausend\nNachrichten ausloesen koennen. Dasselbe Muster wie beim Mail-Versand."},"SocialChannelStatus-mkt_social_channel.read":{"type":"object","description":"Verbindungsstatus je Social-Kanal (ENT-MKT-SOCIAL-01, 04-13 §4.3), read-only Aggregat für die SPA.\nPro {@see \\Octi\\Plugin\\Social\\Contract\\SocialPostPayload}-Kanal: `connected` (real angebunden?) + `mode`\n— `native` (Adapter, Credentials via Platform/Integration), `webhook` (generisch) oder `none`.","properties":{"channel":{"description":"Kanal-Schlüssel (= SocialPostPayload::CHANNEL_*), zugleich Ressourcen-Identifier.","default":"","type":"string"},"connected":{"description":"Ob der Kanal real veröffentlichen kann (nativer Adapter mit Credentials ODER konfigurierter Webhook).","default":false,"type":"boolean"},"mode":{"description":"Veröffentlichungspfad: `native` (Netzwerk-Adapter) | `webhook` (Automations-URL) | `none`.","default":"none","type":"string"},"provider":{"description":"Provider-Schlüssel des nativen Adapters (z.B. linkedin/meta/x), sonst null.","type":["string","null"]}}},"SocialChannelStatus.jsonld-mkt_social_channel.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"channel":{"description":"Kanal-Schlüssel (= SocialPostPayload::CHANNEL_*), zugleich Ressourcen-Identifier.","default":"","type":"string"},"connected":{"description":"Ob der Kanal real veröffentlichen kann (nativer Adapter mit Credentials ODER konfigurierter Webhook).","default":false,"type":"boolean"},"mode":{"description":"Veröffentlichungspfad: `native` (Netzwerk-Adapter) | `webhook` (Automations-URL) | `none`.","default":"none","type":"string"},"provider":{"description":"Provider-Schlüssel des nativen Adapters (z.B. linkedin/meta/x), sonst null.","type":["string","null"]}}}],"description":"Verbindungsstatus je Social-Kanal (ENT-MKT-SOCIAL-01, 04-13 §4.3), read-only Aggregat für die SPA.\nPro {@see \\Octi\\Plugin\\Social\\Contract\\SocialPostPayload}-Kanal: `connected` (real angebunden?) + `mode`\n— `native` (Adapter, Credentials via Platform/Integration), `webhook` (generisch) oder `none`."},"SocialConnection-mkt_social_connection.read":{"type":"object","description":"Verbindungs-ZUSTAND der Social-Kanaele (Programm 46 C2, ENT-MKT-05).\n\nDas Admin-Pendant zum browser-gebundenen Verbindungs-Einstieg: hier steht, was verbunden ist,\nwann es ablaeuft und welche Konten zur Wahl stehen. Diese Flaeche ist Schnittstelle und damit\nauch fuer Automatisierung und KI erreichbar — der Weiterleitungs-Einstieg selbst kann das\nnaturgemaess nicht sein.\n\nMARKENSCHARF, und das ist kein Detail: der Beitrags-Weg schreibt markenscharf. Eine global\ngelesene Statusleiste behauptete „verbunden\" fuer eine Marke, die gar kein Konto hat — und der\nFehler faellt erst auf, wenn ein geplanter Beitrag nicht erscheint.","properties":{"provider":{"type":["string","null"]},"connected":{"default":false,"type":"boolean"},"expiresAt":{"description":"Ablaufzeitpunkt des Zugriffs-Tokens; null = kein Ablauf hinterlegt.","type":["string","null"]},"expiringSoon":{"description":"Läuft der Zugang in den nächsten sieben Tagen ab? Danach werden geplante Beiträge nicht mehr veröffentlicht.","default":false,"type":"boolean"},"accounts":{"description":"Zur Wahl stehende Konten (Meta: Seiten samt Instagram-Bezug).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"type":["integer","null"]},"adAccounts":{"description":"Werbekonten, die dieser Zugang anbietet (nur lesend).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"adAccountId":{"description":"Gewaehltes Werbekonto — welches Konto Geld ausgibt, entscheidet ein Mensch.","type":["string","null"]}}},"SocialConnection-mkt_social_connection.write":{"type":"object","description":"Verbindungs-ZUSTAND der Social-Kanaele (Programm 46 C2, ENT-MKT-05).\n\nDas Admin-Pendant zum browser-gebundenen Verbindungs-Einstieg: hier steht, was verbunden ist,\nwann es ablaeuft und welche Konten zur Wahl stehen. Diese Flaeche ist Schnittstelle und damit\nauch fuer Automatisierung und KI erreichbar — der Weiterleitungs-Einstieg selbst kann das\nnaturgemaess nicht sein.\n\nMARKENSCHARF, und das ist kein Detail: der Beitrags-Weg schreibt markenscharf. Eine global\ngelesene Statusleiste behauptete „verbunden\" fuer eine Marke, die gar kein Konto hat — und der\nFehler faellt erst auf, wenn ein geplanter Beitrag nicht erscheint.","properties":{"provider":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"accountId":{"description":"Nur beim Auswählen: Kennung des gewünschten Kontos.","type":["string","null"]},"adAccountId":{"description":"Gewaehltes Werbekonto — welches Konto Geld ausgibt, entscheidet ein Mensch.","type":["string","null"]}}},"SocialConnection.jsonld-mkt_social_connection.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"provider":{"type":["string","null"]},"connected":{"default":false,"type":"boolean"},"expiresAt":{"description":"Ablaufzeitpunkt des Zugriffs-Tokens; null = kein Ablauf hinterlegt.","type":["string","null"]},"expiringSoon":{"description":"Läuft der Zugang in den nächsten sieben Tagen ab? Danach werden geplante Beiträge nicht mehr veröffentlicht.","default":false,"type":"boolean"},"accounts":{"description":"Zur Wahl stehende Konten (Meta: Seiten samt Instagram-Bezug).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"brandId":{"type":["integer","null"]},"adAccounts":{"description":"Werbekonten, die dieser Zugang anbietet (nur lesend).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"adAccountId":{"description":"Gewaehltes Werbekonto — welches Konto Geld ausgibt, entscheidet ein Mensch.","type":["string","null"]}}}],"description":"Verbindungs-ZUSTAND der Social-Kanaele (Programm 46 C2, ENT-MKT-05).\n\nDas Admin-Pendant zum browser-gebundenen Verbindungs-Einstieg: hier steht, was verbunden ist,\nwann es ablaeuft und welche Konten zur Wahl stehen. Diese Flaeche ist Schnittstelle und damit\nauch fuer Automatisierung und KI erreichbar — der Weiterleitungs-Einstieg selbst kann das\nnaturgemaess nicht sein.\n\nMARKENSCHARF, und das ist kein Detail: der Beitrags-Weg schreibt markenscharf. Eine global\ngelesene Statusleiste behauptete „verbunden\" fuer eine Marke, die gar kein Konto hat — und der\nFehler faellt erst auf, wenn ein geplanter Beitrag nicht erscheint."},"StockTake-stock_take.read":{"type":"object","description":"Inventur (Doc 25 AP 2.3, B5; HGB §240) — der Zähl-Beleg als eigenes Objekt.\n\nDer Ablauf ist bewusst in vier getrennte Operationen zerlegt statt in ein Status-Feld, das\nbeliebig gesetzt werden kann: `populate` friert den Sollstand ein, `start` gibt die Zählung\nfrei, `finish` schließt sie ab, `book` bucht die Differenzen. Jeder Schritt hat genau eine\nzulässige Vorbedingung — ein PATCH auf `status` hätte diese Ordnung nicht.\n\n**`book` ist final.** Eine gebuchte Inventur wird nicht storniert, sondern durch eine neue\nZählung ersetzt.","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["cutoff","permanent","location"],"description":"`cutoff` (Stichtag) · `permanent` · `location` (Lagerplatz).","type":["string","null"]},"status":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"blind":{"description":"Blinde Zählung: der Sollstand bleibt während der Zählung verborgen.","type":["boolean","null"]},"scope":{"description":"Eingrenzung: `warehouseIds`, `categoryIds`, `binTypes`, `productIds` — je optional.","type":["object","null"],"additionalProperties":{"type":"array","items":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"comment":{"type":["string","null"]},"countingStartedAt":{"type":["string","null"]},"bookedAt":{"type":["string","null"]},"bookedBy":{"type":["string","null"]},"lineCount":{"default":0,"type":"integer"},"countedCount":{"default":0,"type":"integer"},"differenceCount":{"description":"Zeilen mit Abweichung — bei blinder Zählung erst nach dem Abschluss aussagekräftig.","default":0,"type":"integer"},"differenceTotal":{"description":"Summe der Differenzen (Ist − Soll) über alle gezählten Zeilen.","default":0,"type":"integer"}}},"StockTake-stock_take.write":{"type":"object","description":"Inventur (Doc 25 AP 2.3, B5; HGB §240) — der Zähl-Beleg als eigenes Objekt.\n\nDer Ablauf ist bewusst in vier getrennte Operationen zerlegt statt in ein Status-Feld, das\nbeliebig gesetzt werden kann: `populate` friert den Sollstand ein, `start` gibt die Zählung\nfrei, `finish` schließt sie ab, `book` bucht die Differenzen. Jeder Schritt hat genau eine\nzulässige Vorbedingung — ein PATCH auf `status` hätte diese Ordnung nicht.\n\n**`book` ist final.** Eine gebuchte Inventur wird nicht storniert, sondern durch eine neue\nZählung ersetzt.","required":["name"],"properties":{"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["cutoff","permanent","location"],"description":"`cutoff` (Stichtag) · `permanent` · `location` (Lagerplatz).","type":["string","null"]},"brandId":{"type":["integer","null"]},"blind":{"description":"Blinde Zählung: der Sollstand bleibt während der Zählung verborgen.","type":["boolean","null"]},"scope":{"description":"Eingrenzung: `warehouseIds`, `categoryIds`, `binTypes`, `productIds` — je optional.","type":["object","null"],"additionalProperties":{"type":"array","items":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"comment":{"type":["string","null"]},"productIds":{"description":"Nur für `populate`: Artikel eingrenzen (leer = alle lagergeführten).","type":["array","null"],"items":{"type":"integer"}}}},"StockTake-stock_take.write.jsonMergePatch":{"type":"object","description":"Inventur (Doc 25 AP 2.3, B5; HGB §240) — der Zähl-Beleg als eigenes Objekt.\n\nDer Ablauf ist bewusst in vier getrennte Operationen zerlegt statt in ein Status-Feld, das\nbeliebig gesetzt werden kann: `populate` friert den Sollstand ein, `start` gibt die Zählung\nfrei, `finish` schließt sie ab, `book` bucht die Differenzen. Jeder Schritt hat genau eine\nzulässige Vorbedingung — ein PATCH auf `status` hätte diese Ordnung nicht.\n\n**`book` ist final.** Eine gebuchte Inventur wird nicht storniert, sondern durch eine neue\nZählung ersetzt.","properties":{"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["cutoff","permanent","location"],"description":"`cutoff` (Stichtag) · `permanent` · `location` (Lagerplatz).","type":["string","null"]},"brandId":{"type":["integer","null"]},"blind":{"description":"Blinde Zählung: der Sollstand bleibt während der Zählung verborgen.","type":["boolean","null"]},"scope":{"description":"Eingrenzung: `warehouseIds`, `categoryIds`, `binTypes`, `productIds` — je optional.","type":["object","null"],"additionalProperties":{"type":"array","items":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"comment":{"type":["string","null"]},"productIds":{"description":"Nur für `populate`: Artikel eingrenzen (leer = alle lagergeführten).","type":["array","null"],"items":{"type":"integer"}}}},"StockTake.jsonld-stock_take.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":120,"type":["string","null"]},"type":{"enum":["cutoff","permanent","location"],"description":"`cutoff` (Stichtag) · `permanent` · `location` (Lagerplatz).","type":["string","null"]},"status":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"blind":{"description":"Blinde Zählung: der Sollstand bleibt während der Zählung verborgen.","type":["boolean","null"]},"scope":{"description":"Eingrenzung: `warehouseIds`, `categoryIds`, `binTypes`, `productIds` — je optional.","type":["object","null"],"additionalProperties":{"type":"array","items":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"comment":{"type":["string","null"]},"countingStartedAt":{"type":["string","null"]},"bookedAt":{"type":["string","null"]},"bookedBy":{"type":["string","null"]},"lineCount":{"default":0,"type":"integer"},"countedCount":{"default":0,"type":"integer"},"differenceCount":{"description":"Zeilen mit Abweichung — bei blinder Zählung erst nach dem Abschluss aussagekräftig.","default":0,"type":"integer"},"differenceTotal":{"description":"Summe der Differenzen (Ist − Soll) über alle gezählten Zeilen.","default":0,"type":"integer"}}}],"description":"Inventur (Doc 25 AP 2.3, B5; HGB §240) — der Zähl-Beleg als eigenes Objekt.\n\nDer Ablauf ist bewusst in vier getrennte Operationen zerlegt statt in ein Status-Feld, das\nbeliebig gesetzt werden kann: `populate` friert den Sollstand ein, `start` gibt die Zählung\nfrei, `finish` schließt sie ab, `book` bucht die Differenzen. Jeder Schritt hat genau eine\nzulässige Vorbedingung — ein PATCH auf `status` hätte diese Ordnung nicht.\n\n**`book` ist final.** Eine gebuchte Inventur wird nicht storniert, sondern durch eine neue\nZählung ersetzt."},"StockTakeLine-stock_take_line.read":{"type":"object","description":"Zählzeile einer Inventur (Doc 25 AP 2.3).\n\n**`version` ist Pflicht beim Zählen, und das ist kein technisches Detail:** zwei Zählende am\nselben Platz sind der Normalfall. Ohne die gelesene Version überschreibt der zweite Eintrag den\nersten stillschweigend — beide Zahlen sehen plausibel aus, und die falsche gewinnt. Mit ihr\nbekommt der zweite einen 409 und zählt nach.\n\n**`expectedQty` fehlt bei blinder Zählung**, solange gezählt wird. Nicht ausgeblendet in der\nOberfläche, sondern nicht ausgeliefert — sonst steht der Sollwert im Netzwerk-Protokoll und die\nZusage „blind\" ist keine.","properties":{"ulid":{"type":["string","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"sku":{"type":["string","null"]},"expectedQty":{"description":"Sollbestand — bei blinder Zählung `null`, solange gezählt wird.","type":["integer","null"]},"countedQty":{"minimum":0,"type":["integer","null"]},"difference":{"description":"Ist − Soll; `null`, solange nicht gezählt oder bei blinder Zählung.","type":["integer","null"]},"batchRef":{"type":["string","null"]},"locationRef":{"type":["string","null"]},"note":{"type":["string","null"]},"countedAt":{"type":["string","null"]},"countedBy":{"type":["string","null"]},"bookedDelta":{"description":"Gebuchte Differenz — erst nach dem Buchen gesetzt, dann festgeschrieben.","type":["integer","null"]},"version":{"minimum":0,"exclusiveMinimum":0,"description":"Optimistische Sperre: beim Zählen die zuvor gelesene Version zurückschicken.","type":["integer","null"]}}},"StockTakeLine-stock_take_line.write.jsonMergePatch":{"type":"object","description":"Zählzeile einer Inventur (Doc 25 AP 2.3).\n\n**`version` ist Pflicht beim Zählen, und das ist kein technisches Detail:** zwei Zählende am\nselben Platz sind der Normalfall. Ohne die gelesene Version überschreibt der zweite Eintrag den\nersten stillschweigend — beide Zahlen sehen plausibel aus, und die falsche gewinnt. Mit ihr\nbekommt der zweite einen 409 und zählt nach.\n\n**`expectedQty` fehlt bei blinder Zählung**, solange gezählt wird. Nicht ausgeblendet in der\nOberfläche, sondern nicht ausgeliefert — sonst steht der Sollwert im Netzwerk-Protokoll und die\nZusage „blind\" ist keine.","properties":{"countedQty":{"minimum":0,"type":["integer","null"]},"batchRef":{"type":["string","null"]},"locationRef":{"type":["string","null"]},"note":{"type":["string","null"]},"version":{"minimum":0,"exclusiveMinimum":0,"description":"Optimistische Sperre: beim Zählen die zuvor gelesene Version zurückschicken.","type":["integer","null"]}}},"StockTakeLine.jsonld-stock_take_line.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"productId":{"type":["integer","null"]},"productName":{"type":["string","null"]},"sku":{"type":["string","null"]},"expectedQty":{"description":"Sollbestand — bei blinder Zählung `null`, solange gezählt wird.","type":["integer","null"]},"countedQty":{"minimum":0,"type":["integer","null"]},"difference":{"description":"Ist − Soll; `null`, solange nicht gezählt oder bei blinder Zählung.","type":["integer","null"]},"batchRef":{"type":["string","null"]},"locationRef":{"type":["string","null"]},"note":{"type":["string","null"]},"countedAt":{"type":["string","null"]},"countedBy":{"type":["string","null"]},"bookedDelta":{"description":"Gebuchte Differenz — erst nach dem Buchen gesetzt, dann festgeschrieben.","type":["integer","null"]},"version":{"minimum":0,"exclusiveMinimum":0,"description":"Optimistische Sperre: beim Zählen die zuvor gelesene Version zurückschicken.","type":["integer","null"]}}}],"description":"Zählzeile einer Inventur (Doc 25 AP 2.3).\n\n**`version` ist Pflicht beim Zählen, und das ist kein technisches Detail:** zwei Zählende am\nselben Platz sind der Normalfall. Ohne die gelesene Version überschreibt der zweite Eintrag den\nersten stillschweigend — beide Zahlen sehen plausibel aus, und die falsche gewinnt. Mit ihr\nbekommt der zweite einen 409 und zählt nach.\n\n**`expectedQty` fehlt bei blinder Zählung**, solange gezählt wird. Nicht ausgeblendet in der\nOberfläche, sondern nicht ausgeliefert — sonst steht der Sollwert im Netzwerk-Protokoll und die\nZusage „blind\" ist keine."},"StockTransfer-stock_transfer.read":{"type":"object","description":"Umlagerungs-Beleg (04-25 §5/§8).\nAnlage als Entwurf; Workflow-Aktionen `send` (→ in_transit) und `receive` (→ done).\nKein PATCH — gebuchte Transfers sind unveränderlich (Buchungs-Integrität).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"fromWarehouseId":{"type":["integer","null"]},"toWarehouseId":{"type":["integer","null"]},"status":{"description":"Lebenszyklus: draft | in_transit | done (Übergänge nur über send/receive).","type":["string","null"]},"items":{"description":"Positionen: Liste {productId, qty} (qty > 0, nur bei Anlage).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"sentAt":{"type":["string","null"]},"receivedAt":{"type":["string","null"]},"note":{"type":["string","null"]}}},"StockTransfer-stock_transfer.write":{"type":"object","description":"Umlagerungs-Beleg (04-25 §5/§8).\nAnlage als Entwurf; Workflow-Aktionen `send` (→ in_transit) und `receive` (→ done).\nKein PATCH — gebuchte Transfers sind unveränderlich (Buchungs-Integrität).","required":["fromWarehouseUlid","toWarehouseUlid","items"],"properties":{"fromWarehouseUlid":{"maxLength":26,"description":"Quell-Lager per ULID (nur Anlage).","type":["string","null"]},"toWarehouseUlid":{"maxLength":26,"description":"Ziel-Lager per ULID (nur Anlage).","type":["string","null"]},"items":{"description":"Positionen: Liste {productId, qty} (qty > 0, nur bei Anlage).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"note":{"type":["string","null"]}}},"StockTransfer.jsonld-stock_transfer.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"fromWarehouseId":{"type":["integer","null"]},"toWarehouseId":{"type":["integer","null"]},"status":{"description":"Lebenszyklus: draft | in_transit | done (Übergänge nur über send/receive).","type":["string","null"]},"items":{"description":"Positionen: Liste {productId, qty} (qty > 0, nur bei Anlage).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"integer"}}},"sentAt":{"type":["string","null"]},"receivedAt":{"type":["string","null"]},"note":{"type":["string","null"]}}}],"description":"Umlagerungs-Beleg (04-25 §5/§8).\nAnlage als Entwurf; Workflow-Aktionen `send` (→ in_transit) und `receive` (→ done).\nKein PATCH — gebuchte Transfers sind unveränderlich (Buchungs-Integrität)."},"Supplier-supplier.read":{"type":"object","description":"Lieferanten-Rolle am geteilten Geschäftspartner (04-29 §8), CRUD unter `suppliers`.\n- POST löst businessPartnerUlid zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01);\n  Rolle bereits vorhanden → 409.\n- DELETE: soft, nur ohne gelistete Lieferantenartikel (sonst 409).\n- Markenübergreifende Stammdaten, kein Brand-Scope (04-29 §6).\n- ULID-Routen mit Format-Requirement (Literal-Segmente ≠ {ulid}, Muster SalesOrder).\n- PATCH = Merge-Patch (Provider-Prefill, OBJECT_TO_POPULATE): weggelassene Keys bleiben;\n  explizites null leert paymentTerms/cashDiscountTerms/incoterms/blockReason/notes;\n  genulltes currency fällt auf EUR zurück (Spalte NOT NULL).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"businessPartnerId":{"description":"Partner-Master (Customer-Id, read-only — gesetzt via businessPartnerUlid).","type":["integer","null"]},"partnerName":{"description":"Anzeigename des Partners (read-only, Anreicherung aus dem Kunden-Stamm).","type":["string","null"]},"supplierNumber":{"maxLength":50,"type":["string","null"]},"supplierKind":{"maxLength":30,"type":["string","null"]},"role":{"enum":["goods","service"],"description":"goods | service — Primär-Facette (goods bevorzugt), gespiegelt aus {@see $roles}.","type":["string","null"]},"roles":{"type":"array","items":{"type":"string","enum":["goods","service"]},"description":"Fähigkeits-Facetten der Rolle (⊆ {goods, service}); Partner kann Waren- UND\nDienstleister sein (5.10). roles hat Vorrang vor role; sonst role maßgeblich (abwärtskompatibel)."},"paymentTerms":{"maxLength":100,"type":["string","null"]},"cashDiscountTerms":{"maxLength":100,"description":"Skonto-Kondition als FREITEXT (z. B. \"2 % / 10 Tage\") — nicht rechenbar, nur Anzeige.","type":["string","null"]},"paymentTermUlid":{"maxLength":26,"description":"Rechenbare Zahlungsbedingung aus dem Stammdaten-Katalog (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"incoterms":{"maxLength":20,"type":["string","null"]},"minOrderValueAmount":{"minimum":0,"description":"Mindestbestellwert in Cent.","type":["integer","null"]},"surcharges":{"description":"Zuschläge (JSON, z. B. Mindermengenzuschlag).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"currency":{"minLength":3,"maxLength":3,"type":["string","null"]},"defaultLeadTimeDays":{"minimum":0,"type":["integer","null"]},"matchTolerancePercentBp":{"minimum":0,"maximum":10000,"description":"Abgleichs-Toleranz (Doc 25 AP 7.4) — relative Grenze in Basispunkten (500 = 5 %).","type":["integer","null"]},"matchToleranceAbsAmount":{"minimum":0,"description":"Absolute Abgleichs-Obergrenze in Cent (Doc 25 AP 7.4); leer = globaler Wert gilt.","type":["integer","null"]},"complianceStatus":{"enum":["ok","blocked"],"description":"ok | blocked — blocked sperrt den Lieferanten für Bestellungen.","type":["string","null"]},"blockReason":{"type":["string","null"]},"status":{"enum":["active","blocked"],"description":"active | blocked.","type":["string","null"]},"brandId":{"description":"Marke des Lieferanten (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — der\nZustand jedes Bestandsdatensatzes und zugleich die weiteste Reichweite, weshalb sie zu setzen\nein markenübergreifendes Verwaltungsrecht verlangt. Der Schnitt ist WEICH: eine bestehende\nBestellung auf einen Lieferanten fremder Marke bleibt lesbar.","type":["integer","null"]},"notes":{"type":["string","null"]},"linkedEmployeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Verknüpfter Employee (Freelancer-Übergang Pfad A, 03 D4).","type":["integer","null"]},"categoryCodes":{"description":"Klassifikations-Codes (frei, z. B. Hersteller/Großhandel/Dienstleister).","type":["array","null"],"items":{"type":"string"}},"ibanDisplay":{"description":"Nur Lesen: maskierte bzw. (für Verwalter mit `suppliers.supplier.manage`) vollständige IBAN.","type":["string","null"]}}},"Supplier-supplier.write":{"type":"object","description":"Lieferanten-Rolle am geteilten Geschäftspartner (04-29 §8), CRUD unter `suppliers`.\n- POST löst businessPartnerUlid zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01);\n  Rolle bereits vorhanden → 409.\n- DELETE: soft, nur ohne gelistete Lieferantenartikel (sonst 409).\n- Markenübergreifende Stammdaten, kein Brand-Scope (04-29 §6).\n- ULID-Routen mit Format-Requirement (Literal-Segmente ≠ {ulid}, Muster SalesOrder).\n- PATCH = Merge-Patch (Provider-Prefill, OBJECT_TO_POPULATE): weggelassene Keys bleiben;\n  explizites null leert paymentTerms/cashDiscountTerms/incoterms/blockReason/notes;\n  genulltes currency fällt auf EUR zurück (Spalte NOT NULL).","properties":{"businessPartnerUlid":{"description":"Kunden-ULID des Partner-Stamms — Pflicht bei POST (Auflösung zum Customer).","type":["string","null"]},"supplierNumber":{"maxLength":50,"type":["string","null"]},"supplierKind":{"maxLength":30,"type":["string","null"]},"role":{"enum":["goods","service"],"description":"goods | service — Primär-Facette (goods bevorzugt), gespiegelt aus {@see $roles}.","type":["string","null"]},"roles":{"type":"array","items":{"type":"string","enum":["goods","service"]},"description":"Fähigkeits-Facetten der Rolle (⊆ {goods, service}); Partner kann Waren- UND\nDienstleister sein (5.10). roles hat Vorrang vor role; sonst role maßgeblich (abwärtskompatibel)."},"paymentTerms":{"maxLength":100,"type":["string","null"]},"cashDiscountTerms":{"maxLength":100,"description":"Skonto-Kondition als FREITEXT (z. B. \"2 % / 10 Tage\") — nicht rechenbar, nur Anzeige.","type":["string","null"]},"paymentTermUlid":{"maxLength":26,"description":"Rechenbare Zahlungsbedingung aus dem Stammdaten-Katalog (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"incoterms":{"maxLength":20,"type":["string","null"]},"minOrderValueAmount":{"minimum":0,"description":"Mindestbestellwert in Cent.","type":["integer","null"]},"surcharges":{"description":"Zuschläge (JSON, z. B. Mindermengenzuschlag).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"currency":{"minLength":3,"maxLength":3,"type":["string","null"]},"defaultLeadTimeDays":{"minimum":0,"type":["integer","null"]},"matchTolerancePercentBp":{"minimum":0,"maximum":10000,"description":"Abgleichs-Toleranz (Doc 25 AP 7.4) — relative Grenze in Basispunkten (500 = 5 %).","type":["integer","null"]},"matchToleranceAbsAmount":{"minimum":0,"description":"Absolute Abgleichs-Obergrenze in Cent (Doc 25 AP 7.4); leer = globaler Wert gilt.","type":["integer","null"]},"complianceStatus":{"enum":["ok","blocked"],"description":"ok | blocked — blocked sperrt den Lieferanten für Bestellungen.","type":["string","null"]},"blockReason":{"type":["string","null"]},"status":{"enum":["active","blocked"],"description":"active | blocked.","type":["string","null"]},"brandId":{"description":"Marke des Lieferanten (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — der\nZustand jedes Bestandsdatensatzes und zugleich die weiteste Reichweite, weshalb sie zu setzen\nein markenübergreifendes Verwaltungsrecht verlangt. Der Schnitt ist WEICH: eine bestehende\nBestellung auf einen Lieferanten fremder Marke bleibt lesbar.","type":["integer","null"]},"notes":{"type":["string","null"]},"linkedEmployeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Verknüpfter Employee (Freelancer-Übergang Pfad A, 03 D4).","type":["integer","null"]},"categoryCodes":{"description":"Klassifikations-Codes (frei, z. B. Hersteller/Großhandel/Dienstleister).","type":["array","null"],"items":{"type":"string"}},"iban":{"description":"Nur Schreiben: Zahlbank-IBAN im Klartext; wird verschlüsselt abgelegt (CredentialCipher).","externalDocs":{"url":"https://schema.org/identifier"},"type":["string","null"]}}},"Supplier-supplier.write.jsonMergePatch":{"type":"object","description":"Lieferanten-Rolle am geteilten Geschäftspartner (04-29 §8), CRUD unter `suppliers`.\n- POST löst businessPartnerUlid zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01);\n  Rolle bereits vorhanden → 409.\n- DELETE: soft, nur ohne gelistete Lieferantenartikel (sonst 409).\n- Markenübergreifende Stammdaten, kein Brand-Scope (04-29 §6).\n- ULID-Routen mit Format-Requirement (Literal-Segmente ≠ {ulid}, Muster SalesOrder).\n- PATCH = Merge-Patch (Provider-Prefill, OBJECT_TO_POPULATE): weggelassene Keys bleiben;\n  explizites null leert paymentTerms/cashDiscountTerms/incoterms/blockReason/notes;\n  genulltes currency fällt auf EUR zurück (Spalte NOT NULL).","properties":{"businessPartnerUlid":{"description":"Kunden-ULID des Partner-Stamms — Pflicht bei POST (Auflösung zum Customer).","type":["string","null"]},"supplierNumber":{"maxLength":50,"type":["string","null"]},"supplierKind":{"maxLength":30,"type":["string","null"]},"role":{"enum":["goods","service"],"description":"goods | service — Primär-Facette (goods bevorzugt), gespiegelt aus {@see $roles}.","type":["string","null"]},"roles":{"type":"array","items":{"type":"string","enum":["goods","service"]},"description":"Fähigkeits-Facetten der Rolle (⊆ {goods, service}); Partner kann Waren- UND\nDienstleister sein (5.10). roles hat Vorrang vor role; sonst role maßgeblich (abwärtskompatibel)."},"paymentTerms":{"maxLength":100,"type":["string","null"]},"cashDiscountTerms":{"maxLength":100,"description":"Skonto-Kondition als FREITEXT (z. B. \"2 % / 10 Tage\") — nicht rechenbar, nur Anzeige.","type":["string","null"]},"paymentTermUlid":{"maxLength":26,"description":"Rechenbare Zahlungsbedingung aus dem Stammdaten-Katalog (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"incoterms":{"maxLength":20,"type":["string","null"]},"minOrderValueAmount":{"minimum":0,"description":"Mindestbestellwert in Cent.","type":["integer","null"]},"surcharges":{"description":"Zuschläge (JSON, z. B. Mindermengenzuschlag).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"currency":{"minLength":3,"maxLength":3,"type":["string","null"]},"defaultLeadTimeDays":{"minimum":0,"type":["integer","null"]},"matchTolerancePercentBp":{"minimum":0,"maximum":10000,"description":"Abgleichs-Toleranz (Doc 25 AP 7.4) — relative Grenze in Basispunkten (500 = 5 %).","type":["integer","null"]},"matchToleranceAbsAmount":{"minimum":0,"description":"Absolute Abgleichs-Obergrenze in Cent (Doc 25 AP 7.4); leer = globaler Wert gilt.","type":["integer","null"]},"complianceStatus":{"enum":["ok","blocked"],"description":"ok | blocked — blocked sperrt den Lieferanten für Bestellungen.","type":["string","null"]},"blockReason":{"type":["string","null"]},"status":{"enum":["active","blocked"],"description":"active | blocked.","type":["string","null"]},"brandId":{"description":"Marke des Lieferanten (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — der\nZustand jedes Bestandsdatensatzes und zugleich die weiteste Reichweite, weshalb sie zu setzen\nein markenübergreifendes Verwaltungsrecht verlangt. Der Schnitt ist WEICH: eine bestehende\nBestellung auf einen Lieferanten fremder Marke bleibt lesbar.","type":["integer","null"]},"notes":{"type":["string","null"]},"linkedEmployeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Verknüpfter Employee (Freelancer-Übergang Pfad A, 03 D4).","type":["integer","null"]},"categoryCodes":{"description":"Klassifikations-Codes (frei, z. B. Hersteller/Großhandel/Dienstleister).","type":["array","null"],"items":{"type":"string"}},"iban":{"description":"Nur Schreiben: Zahlbank-IBAN im Klartext; wird verschlüsselt abgelegt (CredentialCipher).","externalDocs":{"url":"https://schema.org/identifier"},"type":["string","null"]}}},"Supplier.jsonld-supplier.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"businessPartnerId":{"description":"Partner-Master (Customer-Id, read-only — gesetzt via businessPartnerUlid).","type":["integer","null"]},"partnerName":{"description":"Anzeigename des Partners (read-only, Anreicherung aus dem Kunden-Stamm).","type":["string","null"]},"supplierNumber":{"maxLength":50,"type":["string","null"]},"supplierKind":{"maxLength":30,"type":["string","null"]},"role":{"enum":["goods","service"],"description":"goods | service — Primär-Facette (goods bevorzugt), gespiegelt aus {@see $roles}.","type":["string","null"]},"roles":{"type":"array","items":{"type":"string","enum":["goods","service"]},"description":"Fähigkeits-Facetten der Rolle (⊆ {goods, service}); Partner kann Waren- UND\nDienstleister sein (5.10). roles hat Vorrang vor role; sonst role maßgeblich (abwärtskompatibel)."},"paymentTerms":{"maxLength":100,"type":["string","null"]},"cashDiscountTerms":{"maxLength":100,"description":"Skonto-Kondition als FREITEXT (z. B. \"2 % / 10 Tage\") — nicht rechenbar, nur Anzeige.","type":["string","null"]},"paymentTermUlid":{"maxLength":26,"description":"Rechenbare Zahlungsbedingung aus dem Stammdaten-Katalog (`/v1/payment-terms`, Doc 25 AP 0.1).","type":["string","null"]},"incoterms":{"maxLength":20,"type":["string","null"]},"minOrderValueAmount":{"minimum":0,"description":"Mindestbestellwert in Cent.","type":["integer","null"]},"surcharges":{"description":"Zuschläge (JSON, z. B. Mindermengenzuschlag).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"currency":{"minLength":3,"maxLength":3,"type":["string","null"]},"defaultLeadTimeDays":{"minimum":0,"type":["integer","null"]},"matchTolerancePercentBp":{"minimum":0,"maximum":10000,"description":"Abgleichs-Toleranz (Doc 25 AP 7.4) — relative Grenze in Basispunkten (500 = 5 %).","type":["integer","null"]},"matchToleranceAbsAmount":{"minimum":0,"description":"Absolute Abgleichs-Obergrenze in Cent (Doc 25 AP 7.4); leer = globaler Wert gilt.","type":["integer","null"]},"complianceStatus":{"enum":["ok","blocked"],"description":"ok | blocked — blocked sperrt den Lieferanten für Bestellungen.","type":["string","null"]},"blockReason":{"type":["string","null"]},"status":{"enum":["active","blocked"],"description":"active | blocked.","type":["string","null"]},"brandId":{"description":"Marke des Lieferanten (Doc 42, ENT-MARKE-01…03). `null` = für ALLE Marken sichtbar — der\nZustand jedes Bestandsdatensatzes und zugleich die weiteste Reichweite, weshalb sie zu setzen\nein markenübergreifendes Verwaltungsrecht verlangt. Der Schnitt ist WEICH: eine bestehende\nBestellung auf einen Lieferanten fremder Marke bleibt lesbar.","type":["integer","null"]},"notes":{"type":["string","null"]},"linkedEmployeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Verknüpfter Employee (Freelancer-Übergang Pfad A, 03 D4).","type":["integer","null"]},"categoryCodes":{"description":"Klassifikations-Codes (frei, z. B. Hersteller/Großhandel/Dienstleister).","type":["array","null"],"items":{"type":"string"}},"ibanDisplay":{"description":"Nur Lesen: maskierte bzw. (für Verwalter mit `suppliers.supplier.manage`) vollständige IBAN.","type":["string","null"]}}}],"description":"Lieferanten-Rolle am geteilten Geschäftspartner (04-29 §8), CRUD unter `suppliers`.\n- POST löst businessPartnerUlid zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01);\n  Rolle bereits vorhanden → 409.\n- DELETE: soft, nur ohne gelistete Lieferantenartikel (sonst 409).\n- Markenübergreifende Stammdaten, kein Brand-Scope (04-29 §6).\n- ULID-Routen mit Format-Requirement (Literal-Segmente ≠ {ulid}, Muster SalesOrder).\n- PATCH = Merge-Patch (Provider-Prefill, OBJECT_TO_POPULATE): weggelassene Keys bleiben;\n  explizites null leert paymentTerms/cashDiscountTerms/incoterms/blockReason/notes;\n  genulltes currency fällt auf EUR zurück (Spalte NOT NULL)."},"SupplierArticle-supplier_article.read":{"type":"object","description":"Lieferantenartikel (EK je Lieferant × Artikel, 04-29 §8), Sub-Resource unter\n`/v1/suppliers/{ulid}/articles`.\n- POST: Upsert je (Lieferant, productId) via SupplierArticleService; Preisänderung\n  schreibt EK-Historie fort; `scales` synct Staffelsatz vollständig; isPreferred=true\n  löst bisherigen Vorzugslieferanten ab.\n- EK-Historie: `…/articles/{articleUlid}/history` (eigene Resource).\n- Leeren-Semantik (POST/PATCH): weggelassene Felder unverändert; explizites null leert\n  (einziger Leeren-Kanal für ?int-Felder); '' leert String-/Dezimal-/Datumsfelder.","properties":{"ulid":{"type":["string","null"]},"supplierUlid":{"description":"ULID der Lieferanten-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Katalog-Artikel (Kernel-Produktreferenz) — Pflicht beim Upsert (POST).","type":["integer","null"]},"supplierSku":{"maxLength":100,"type":["string","null"]},"purchasePriceAmount":{"minimum":0,"description":"EK in Cent — Pflicht bei Anlage.","type":["integer","null"]},"freightCostAmount":{"minimum":0,"description":"Fracht-/Bezugskosten in Cent (Einstandspreis = EK + Fracht).","type":["integer","null"]},"landedCostAmount":{"description":"Einstandspreis in Cent (read-only, berechnet).","type":["integer","null"]},"currency":{"type":["string","null"]},"minOrderQty":{"type":["string","null"]},"orderUnit":{"maxLength":30,"type":["string","null"]},"packagingQty":{"type":["string","null"]},"leadTimeDays":{"minimum":0,"type":["integer","null"]},"availableQty":{"description":"Vom Lieferanten gemeldeter Bestand (Doc 25 AP 7.2); leer = unbekannt.","type":["string","null"]},"availableQtyAt":{"description":"Stand der Bestandsmeldung (ISO 8601) — wird beim Schreiben von `availableQty` gesetzt.","type":["string","null"]},"isPreferred":{"description":"Bevorzugter Lieferant des Artikels (genau einer je Artikel).","type":["boolean","null"]},"validFrom":{"description":"Aktions-/Zeitpreis-Fenster (Y-m-d).","type":["string","null"]},"validTo":{"type":["string","null"]},"scales":{"description":"Mengen-Staffeln: Schreiben=voller Sync {minQty, priceAmount}; Lesen=aufsteigend nach minQty.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}},"SupplierArticle-supplier_article.write":{"type":"object","description":"Lieferantenartikel (EK je Lieferant × Artikel, 04-29 §8), Sub-Resource unter\n`/v1/suppliers/{ulid}/articles`.\n- POST: Upsert je (Lieferant, productId) via SupplierArticleService; Preisänderung\n  schreibt EK-Historie fort; `scales` synct Staffelsatz vollständig; isPreferred=true\n  löst bisherigen Vorzugslieferanten ab.\n- EK-Historie: `…/articles/{articleUlid}/history` (eigene Resource).\n- Leeren-Semantik (POST/PATCH): weggelassene Felder unverändert; explizites null leert\n  (einziger Leeren-Kanal für ?int-Felder); '' leert String-/Dezimal-/Datumsfelder.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Katalog-Artikel (Kernel-Produktreferenz) — Pflicht beim Upsert (POST).","type":["integer","null"]},"supplierSku":{"maxLength":100,"type":["string","null"]},"purchasePriceAmount":{"minimum":0,"description":"EK in Cent — Pflicht bei Anlage.","type":["integer","null"]},"freightCostAmount":{"minimum":0,"description":"Fracht-/Bezugskosten in Cent (Einstandspreis = EK + Fracht).","type":["integer","null"]},"minOrderQty":{"type":["string","null"]},"orderUnit":{"maxLength":30,"type":["string","null"]},"packagingQty":{"type":["string","null"]},"leadTimeDays":{"minimum":0,"type":["integer","null"]},"availableQty":{"description":"Vom Lieferanten gemeldeter Bestand (Doc 25 AP 7.2); leer = unbekannt.","type":["string","null"]},"isPreferred":{"description":"Bevorzugter Lieferant des Artikels (genau einer je Artikel).","type":["boolean","null"]},"validFrom":{"description":"Aktions-/Zeitpreis-Fenster (Y-m-d).","type":["string","null"]},"validTo":{"type":["string","null"]},"scales":{"description":"Mengen-Staffeln: Schreiben=voller Sync {minQty, priceAmount}; Lesen=aufsteigend nach minQty.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}},"SupplierArticle-supplier_article.write.jsonMergePatch":{"type":"object","description":"Lieferantenartikel (EK je Lieferant × Artikel, 04-29 §8), Sub-Resource unter\n`/v1/suppliers/{ulid}/articles`.\n- POST: Upsert je (Lieferant, productId) via SupplierArticleService; Preisänderung\n  schreibt EK-Historie fort; `scales` synct Staffelsatz vollständig; isPreferred=true\n  löst bisherigen Vorzugslieferanten ab.\n- EK-Historie: `…/articles/{articleUlid}/history` (eigene Resource).\n- Leeren-Semantik (POST/PATCH): weggelassene Felder unverändert; explizites null leert\n  (einziger Leeren-Kanal für ?int-Felder); '' leert String-/Dezimal-/Datumsfelder.","properties":{"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Katalog-Artikel (Kernel-Produktreferenz) — Pflicht beim Upsert (POST).","type":["integer","null"]},"supplierSku":{"maxLength":100,"type":["string","null"]},"purchasePriceAmount":{"minimum":0,"description":"EK in Cent — Pflicht bei Anlage.","type":["integer","null"]},"freightCostAmount":{"minimum":0,"description":"Fracht-/Bezugskosten in Cent (Einstandspreis = EK + Fracht).","type":["integer","null"]},"minOrderQty":{"type":["string","null"]},"orderUnit":{"maxLength":30,"type":["string","null"]},"packagingQty":{"type":["string","null"]},"leadTimeDays":{"minimum":0,"type":["integer","null"]},"availableQty":{"description":"Vom Lieferanten gemeldeter Bestand (Doc 25 AP 7.2); leer = unbekannt.","type":["string","null"]},"isPreferred":{"description":"Bevorzugter Lieferant des Artikels (genau einer je Artikel).","type":["boolean","null"]},"validFrom":{"description":"Aktions-/Zeitpreis-Fenster (Y-m-d).","type":["string","null"]},"validTo":{"type":["string","null"]},"scales":{"description":"Mengen-Staffeln: Schreiben=voller Sync {minQty, priceAmount}; Lesen=aufsteigend nach minQty.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}},"SupplierArticle.jsonld-supplier_article.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"supplierUlid":{"description":"ULID der Lieferanten-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Katalog-Artikel (Kernel-Produktreferenz) — Pflicht beim Upsert (POST).","type":["integer","null"]},"supplierSku":{"maxLength":100,"type":["string","null"]},"purchasePriceAmount":{"minimum":0,"description":"EK in Cent — Pflicht bei Anlage.","type":["integer","null"]},"freightCostAmount":{"minimum":0,"description":"Fracht-/Bezugskosten in Cent (Einstandspreis = EK + Fracht).","type":["integer","null"]},"landedCostAmount":{"description":"Einstandspreis in Cent (read-only, berechnet).","type":["integer","null"]},"currency":{"type":["string","null"]},"minOrderQty":{"type":["string","null"]},"orderUnit":{"maxLength":30,"type":["string","null"]},"packagingQty":{"type":["string","null"]},"leadTimeDays":{"minimum":0,"type":["integer","null"]},"availableQty":{"description":"Vom Lieferanten gemeldeter Bestand (Doc 25 AP 7.2); leer = unbekannt.","type":["string","null"]},"availableQtyAt":{"description":"Stand der Bestandsmeldung (ISO 8601) — wird beim Schreiben von `availableQty` gesetzt.","type":["string","null"]},"isPreferred":{"description":"Bevorzugter Lieferant des Artikels (genau einer je Artikel).","type":["boolean","null"]},"validFrom":{"description":"Aktions-/Zeitpreis-Fenster (Y-m-d).","type":["string","null"]},"validTo":{"type":["string","null"]},"scales":{"description":"Mengen-Staffeln: Schreiben=voller Sync {minQty, priceAmount}; Lesen=aufsteigend nach minQty.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}}}}],"description":"Lieferantenartikel (EK je Lieferant × Artikel, 04-29 §8), Sub-Resource unter\n`/v1/suppliers/{ulid}/articles`.\n- POST: Upsert je (Lieferant, productId) via SupplierArticleService; Preisänderung\n  schreibt EK-Historie fort; `scales` synct Staffelsatz vollständig; isPreferred=true\n  löst bisherigen Vorzugslieferanten ab.\n- EK-Historie: `…/articles/{articleUlid}/history` (eigene Resource).\n- Leeren-Semantik (POST/PATCH): weggelassene Felder unverändert; explizites null leert\n  (einziger Leeren-Kanal für ?int-Felder); '' leert String-/Dezimal-/Datumsfelder."},"SupplierCertificate-supplier_certificate.read":{"type":"object","description":"Zertifikate eines Lieferanten (04-29 §8): Typ, optionaler Datei-Nachweis (fileId),\nAblaufdatum (Basis Ablaufwarnung); /v1/suppliers/{ulid}/certificates.","properties":{"ulid":{"type":["string","null"]},"supplierUlid":{"description":"ULID der Lieferanten-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"type":{"maxLength":50,"description":"Zertifikatstyp (z. B. iso9001) — Pflicht bei POST.","type":["string","null"]},"fileId":{"minimum":0,"exclusiveMinimum":0,"description":"Nachweis-Datei (File-Modul).","type":["integer","null"]},"validUntil":{"description":"Ablaufdatum (Y-m-d) — Basis der Ablaufwarnung (04-29 §6).","type":["string","null"]}}},"SupplierCertificate-supplier_certificate.write":{"type":"object","description":"Zertifikate eines Lieferanten (04-29 §8): Typ, optionaler Datei-Nachweis (fileId),\nAblaufdatum (Basis Ablaufwarnung); /v1/suppliers/{ulid}/certificates.","properties":{"type":{"maxLength":50,"description":"Zertifikatstyp (z. B. iso9001) — Pflicht bei POST.","type":["string","null"]},"fileId":{"minimum":0,"exclusiveMinimum":0,"description":"Nachweis-Datei (File-Modul).","type":["integer","null"]},"validUntil":{"description":"Ablaufdatum (Y-m-d) — Basis der Ablaufwarnung (04-29 §6).","type":["string","null"]}}},"SupplierCertificate.jsonld-supplier_certificate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"supplierUlid":{"description":"ULID der Lieferanten-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"type":{"maxLength":50,"description":"Zertifikatstyp (z. B. iso9001) — Pflicht bei POST.","type":["string","null"]},"fileId":{"minimum":0,"exclusiveMinimum":0,"description":"Nachweis-Datei (File-Modul).","type":["integer","null"]},"validUntil":{"description":"Ablaufdatum (Y-m-d) — Basis der Ablaufwarnung (04-29 §6).","type":["string","null"]}}}],"description":"Zertifikate eines Lieferanten (04-29 §8): Typ, optionaler Datei-Nachweis (fileId),\nAblaufdatum (Basis Ablaufwarnung); /v1/suppliers/{ulid}/certificates."},"SupplierFrameworkAgreement-supplier_agreement.read":{"type":"object","description":"Rahmenvereinbarungen eines Lieferanten (04-29 §8): Laufzeit, Konditionstext, bonusRule\n(Umsatzstufe→%); /v1/suppliers/{ulid}/agreements.","properties":{"ulid":{"type":["string","null"]},"supplierUlid":{"description":"ULID der Lieferanten-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"validFrom":{"description":"Laufzeit (Y-m-d).","type":["string","null"]},"validTo":{"type":["string","null"]},"terms":{"type":["string","null"]},"bonusRule":{"description":"Bonusregel (JSON: Umsatzstufe → Prozentsatz).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SupplierFrameworkAgreement-supplier_agreement.write":{"type":"object","description":"Rahmenvereinbarungen eines Lieferanten (04-29 §8): Laufzeit, Konditionstext, bonusRule\n(Umsatzstufe→%); /v1/suppliers/{ulid}/agreements.","properties":{"validFrom":{"description":"Laufzeit (Y-m-d).","type":["string","null"]},"validTo":{"type":["string","null"]},"terms":{"type":["string","null"]},"bonusRule":{"description":"Bonusregel (JSON: Umsatzstufe → Prozentsatz).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SupplierFrameworkAgreement-supplier_agreement.write.jsonMergePatch":{"type":"object","description":"Rahmenvereinbarungen eines Lieferanten (04-29 §8): Laufzeit, Konditionstext, bonusRule\n(Umsatzstufe→%); /v1/suppliers/{ulid}/agreements.","properties":{"validFrom":{"description":"Laufzeit (Y-m-d).","type":["string","null"]},"validTo":{"type":["string","null"]},"terms":{"type":["string","null"]},"bonusRule":{"description":"Bonusregel (JSON: Umsatzstufe → Prozentsatz).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}},"SupplierFrameworkAgreement.jsonld-supplier_agreement.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"supplierUlid":{"description":"ULID der Lieferanten-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"validFrom":{"description":"Laufzeit (Y-m-d).","type":["string","null"]},"validTo":{"type":["string","null"]},"terms":{"type":["string","null"]},"bonusRule":{"description":"Bonusregel (JSON: Umsatzstufe → Prozentsatz).","type":["object","null"],"additionalProperties":{"type":["string","null"]}}}}],"description":"Rahmenvereinbarungen eines Lieferanten (04-29 §8): Laufzeit, Konditionstext, bonusRule\n(Umsatzstufe→%); /v1/suppliers/{ulid}/agreements."},"SupplierPriceHistory-supplier_price_history.read":{"type":"object","description":"EK-Historie eines Lieferantenartikels (04-29 §8, read-only, append-only).\nGET .../history: absteigend nach validFrom; Schreiben nur via SupplierArticleService.","properties":{"ulid":{"type":["string","null"]},"priceAmount":{"description":"EK-Stand in Cent.","type":["integer","null"]},"validFrom":{"type":["string","null"]},"changedBy":{"description":"Verursacher (Blameable createdBy, User-ULID).","type":["string","null"]}}},"SupplierPriceHistory.jsonld-supplier_price_history.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"priceAmount":{"description":"EK-Stand in Cent.","type":["integer","null"]},"validFrom":{"type":["string","null"]},"changedBy":{"description":"Verursacher (Blameable createdBy, User-ULID).","type":["string","null"]}}}],"description":"EK-Historie eines Lieferantenartikels (04-29 §8, read-only, append-only).\nGET .../history: absteigend nach validFrom; Schreiben nur via SupplierArticleService."},"SupplierRating-supplier_rating.read":{"type":"object","description":"Lieferantenbewertung (04-29 §8): Scores 0–100 je Periode (YYYY-MM);\n/v1/suppliers/{ulid}/ratings. POST=Upsert je (Lieferant, Periode) via\nSupplierRatingService; overall=gerundetes Mittel (read-only).","properties":{"ulid":{"type":["string","null"]},"supplierUlid":{"description":"ULID der Lieferanten-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"period":{"maxLength":7,"description":"Bewertungsperiode (YYYY-MM) — Pflicht bei POST.","type":["string","null"]},"deliveryScore":{"minimum":0,"maximum":100,"type":["integer","null"]},"qualityScore":{"minimum":0,"maximum":100,"type":["integer","null"]},"priceScore":{"minimum":0,"maximum":100,"type":["integer","null"]},"overall":{"description":"Gesamtscore = gerundetes Mittel (read-only).","type":["integer","null"]}}},"SupplierRating-supplier_rating.write":{"type":"object","description":"Lieferantenbewertung (04-29 §8): Scores 0–100 je Periode (YYYY-MM);\n/v1/suppliers/{ulid}/ratings. POST=Upsert je (Lieferant, Periode) via\nSupplierRatingService; overall=gerundetes Mittel (read-only).","properties":{"period":{"maxLength":7,"description":"Bewertungsperiode (YYYY-MM) — Pflicht bei POST.","type":["string","null"]},"deliveryScore":{"minimum":0,"maximum":100,"type":["integer","null"]},"qualityScore":{"minimum":0,"maximum":100,"type":["integer","null"]},"priceScore":{"minimum":0,"maximum":100,"type":["integer","null"]}}},"SupplierRating.jsonld-supplier_rating.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"supplierUlid":{"description":"ULID der Lieferanten-Rolle (read-only, aus dem Pfad).","type":["string","null"]},"period":{"maxLength":7,"description":"Bewertungsperiode (YYYY-MM) — Pflicht bei POST.","type":["string","null"]},"deliveryScore":{"minimum":0,"maximum":100,"type":["integer","null"]},"qualityScore":{"minimum":0,"maximum":100,"type":["integer","null"]},"priceScore":{"minimum":0,"maximum":100,"type":["integer","null"]},"overall":{"description":"Gesamtscore = gerundetes Mittel (read-only).","type":["integer","null"]}}}],"description":"Lieferantenbewertung (04-29 §8): Scores 0–100 je Periode (YYYY-MM);\n/v1/suppliers/{ulid}/ratings. POST=Upsert je (Lieferant, Periode) via\nSupplierRatingService; overall=gerundetes Mittel (read-only)."},"SupportMailbox-support_mailbox.read":{"type":"object","description":"Support-Postfach je Marke (04-04 T2, S4-3) — Postfach-Zuordnung inkl. generischer IMAP/SMTP-\nVerbindungsdaten. Passwort write-only (verschlüsselt, nie ausgelesen). Typ `gmail`: OAuth-\nCredentials weiterhin separat über `support:mailbox:connect` (nicht über die API).\n\n`active` ist der Handschalter, `connectionState` der GEMESSENE Zustand des letzten Abrufs/Tests\n(SESS-MAILBOX-02) — beides getrennt lesbar, damit ein abgelehntes Postfach nicht länger wie ein\ngesundes aussieht. `test-connection` prüft denselben Verbindungsweg, den der Abruf nimmt.","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["gmail","imap"],"default":"gmail","type":"string"},"label":{"type":["string","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"integrationId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"lastHistoryId":{"type":["string","null"]},"imapHost":{"type":["string","null"]},"imapPort":{"type":["integer","null"]},"imapEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"imapUsername":{"type":["string","null"]},"imapFolder":{"type":["string","null"]},"smtpHost":{"type":["string","null"]},"smtpPort":{"type":["integer","null"]},"smtpEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"smtpUsername":{"type":["string","null"]},"hasPassword":{"description":"Ob ein Passwort hinterlegt ist (read-only Statusanzeige).","default":false,"type":"boolean"},"active":{"type":["boolean","null"]},"lastUid":{"type":["string","null"]},"importFrom":{"description":"Stichtag (ISO-8601): nur Mails ab diesem Zeitpunkt importiert, ältere verworfen. Gilt für\nbeide Typen. Leer beim Anlegen = Verbindungszeitpunkt (verhindert Altbestand-Flut).","type":["string","null"]},"backfill":{"description":"Einmaliger Auslöser: zieht beim nächsten Abruf Altbestand ab {@see $importFrom} nach\n(Gmail-Historie, IMAP auch gelesene Mails), setzt sich danach selbst zurück.","type":["boolean","null"]},"connectionState":{"description":"Gemessener Zustand des letzten Abrufs/Tests — NICHT `active` (das ist der Handschalter):\n`unknown` (nie geprüft) · `ok` (letzter Versuch geglückt) · `error` (letzter Versuch gescheitert).","default":"unknown","type":"string"},"lastCheckedAt":{"description":"Letzter Abrufversuch (ISO-8601), unabhängig vom Ergebnis.","type":["string","null"]},"lastSuccessAt":{"description":"Letzter ERFOLGREICHER Abruf (ISO-8601) — bleibt bei Fehlern stehen: zeigt, seit wann es klemmt.","type":["string","null"]},"lastError":{"description":"Fehlertext des letzten Versuchs (gekürzt, Passwort redigiert); null = zuletzt erfolgreich.","type":["string","null"]}},"required":["label","email"]},"SupportMailbox-support_mailbox.write":{"type":"object","description":"Support-Postfach je Marke (04-04 T2, S4-3) — Postfach-Zuordnung inkl. generischer IMAP/SMTP-\nVerbindungsdaten. Passwort write-only (verschlüsselt, nie ausgelesen). Typ `gmail`: OAuth-\nCredentials weiterhin separat über `support:mailbox:connect` (nicht über die API).\n\n`active` ist der Handschalter, `connectionState` der GEMESSENE Zustand des letzten Abrufs/Tests\n(SESS-MAILBOX-02) — beides getrennt lesbar, damit ein abgelehntes Postfach nicht länger wie ein\ngesundes aussieht. `test-connection` prüft denselben Verbindungsweg, den der Abruf nimmt.","properties":{"type":{"enum":["gmail","imap"],"default":"gmail","type":"string"},"label":{"type":["string","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"integrationId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"imapHost":{"type":["string","null"]},"imapPort":{"type":["integer","null"]},"imapEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"imapUsername":{"type":["string","null"]},"imapFolder":{"type":["string","null"]},"smtpHost":{"type":["string","null"]},"smtpPort":{"type":["integer","null"]},"smtpEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"smtpUsername":{"type":["string","null"]},"password":{"description":"Write-only: Passwort für IMAP+SMTP — verschlüsselt gespeichert, nie zurückgegeben.","type":["string","null"]},"active":{"type":["boolean","null"]},"importFrom":{"description":"Stichtag (ISO-8601): nur Mails ab diesem Zeitpunkt importiert, ältere verworfen. Gilt für\nbeide Typen. Leer beim Anlegen = Verbindungszeitpunkt (verhindert Altbestand-Flut).","type":["string","null"]},"backfill":{"description":"Einmaliger Auslöser: zieht beim nächsten Abruf Altbestand ab {@see $importFrom} nach\n(Gmail-Historie, IMAP auch gelesene Mails), setzt sich danach selbst zurück.","type":["boolean","null"]}},"required":["label","email"]},"SupportMailbox-support_mailbox.write.jsonMergePatch":{"type":"object","description":"Support-Postfach je Marke (04-04 T2, S4-3) — Postfach-Zuordnung inkl. generischer IMAP/SMTP-\nVerbindungsdaten. Passwort write-only (verschlüsselt, nie ausgelesen). Typ `gmail`: OAuth-\nCredentials weiterhin separat über `support:mailbox:connect` (nicht über die API).\n\n`active` ist der Handschalter, `connectionState` der GEMESSENE Zustand des letzten Abrufs/Tests\n(SESS-MAILBOX-02) — beides getrennt lesbar, damit ein abgelehntes Postfach nicht länger wie ein\ngesundes aussieht. `test-connection` prüft denselben Verbindungsweg, den der Abruf nimmt.","properties":{"type":{"enum":["gmail","imap"],"default":"gmail","type":"string"},"label":{"type":["string","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"integrationId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"imapHost":{"type":["string","null"]},"imapPort":{"type":["integer","null"]},"imapEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"imapUsername":{"type":["string","null"]},"imapFolder":{"type":["string","null"]},"smtpHost":{"type":["string","null"]},"smtpPort":{"type":["integer","null"]},"smtpEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"smtpUsername":{"type":["string","null"]},"password":{"description":"Write-only: Passwort für IMAP+SMTP — verschlüsselt gespeichert, nie zurückgegeben.","type":["string","null"]},"active":{"type":["boolean","null"]},"importFrom":{"description":"Stichtag (ISO-8601): nur Mails ab diesem Zeitpunkt importiert, ältere verworfen. Gilt für\nbeide Typen. Leer beim Anlegen = Verbindungszeitpunkt (verhindert Altbestand-Flut).","type":["string","null"]},"backfill":{"description":"Einmaliger Auslöser: zieht beim nächsten Abruf Altbestand ab {@see $importFrom} nach\n(Gmail-Historie, IMAP auch gelesene Mails), setzt sich danach selbst zurück.","type":["boolean","null"]}}},"SupportMailbox.jsonld-support_mailbox.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["gmail","imap"],"default":"gmail","type":"string"},"label":{"type":["string","null"]},"email":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"integrationId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"lastHistoryId":{"type":["string","null"]},"imapHost":{"type":["string","null"]},"imapPort":{"type":["integer","null"]},"imapEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"imapUsername":{"type":["string","null"]},"imapFolder":{"type":["string","null"]},"smtpHost":{"type":["string","null"]},"smtpPort":{"type":["integer","null"]},"smtpEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"smtpUsername":{"type":["string","null"]},"hasPassword":{"description":"Ob ein Passwort hinterlegt ist (read-only Statusanzeige).","default":false,"type":"boolean"},"active":{"type":["boolean","null"]},"lastUid":{"type":["string","null"]},"importFrom":{"description":"Stichtag (ISO-8601): nur Mails ab diesem Zeitpunkt importiert, ältere verworfen. Gilt für\nbeide Typen. Leer beim Anlegen = Verbindungszeitpunkt (verhindert Altbestand-Flut).","type":["string","null"]},"backfill":{"description":"Einmaliger Auslöser: zieht beim nächsten Abruf Altbestand ab {@see $importFrom} nach\n(Gmail-Historie, IMAP auch gelesene Mails), setzt sich danach selbst zurück.","type":["boolean","null"]},"connectionState":{"description":"Gemessener Zustand des letzten Abrufs/Tests — NICHT `active` (das ist der Handschalter):\n`unknown` (nie geprüft) · `ok` (letzter Versuch geglückt) · `error` (letzter Versuch gescheitert).","default":"unknown","type":"string"},"lastCheckedAt":{"description":"Letzter Abrufversuch (ISO-8601), unabhängig vom Ergebnis.","type":["string","null"]},"lastSuccessAt":{"description":"Letzter ERFOLGREICHER Abruf (ISO-8601) — bleibt bei Fehlern stehen: zeigt, seit wann es klemmt.","type":["string","null"]},"lastError":{"description":"Fehlertext des letzten Versuchs (gekürzt, Passwort redigiert); null = zuletzt erfolgreich.","type":["string","null"]}},"required":["label","email"]}],"description":"Support-Postfach je Marke (04-04 T2, S4-3) — Postfach-Zuordnung inkl. generischer IMAP/SMTP-\nVerbindungsdaten. Passwort write-only (verschlüsselt, nie ausgelesen). Typ `gmail`: OAuth-\nCredentials weiterhin separat über `support:mailbox:connect` (nicht über die API).\n\n`active` ist der Handschalter, `connectionState` der GEMESSENE Zustand des letzten Abrufs/Tests\n(SESS-MAILBOX-02) — beides getrennt lesbar, damit ein abgelehntes Postfach nicht länger wie ein\ngesundes aussieht. `test-connection` prüft denselben Verbindungsweg, den der Abruf nimmt."},"SystemMailAccount-system_mail_account.read":{"type":"object","description":"- System-Mailaccount je Marke (rein ausgehender Versandweg für alle System-Mails)\n- Verwaltung der Account-Zuordnung inkl. Typ (Google-Integration oder SMTP)\n- SMTP-Passwort write-only (verschlüsselt gespeichert, nie ausgelesen)\n- Typ gmail: OAuth-Credentials weiterhin über die Google-Integration (nicht über diese API).","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["gmail","smtp"],"default":"gmail","type":"string"},"label":{"type":["string","null"]},"fromEmail":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"fromName":{"type":["string","null"]},"replyTo":{"format":"email","description":"Antwortadresse (Reply-To); wird auf ausgehende Mails ohne eigene Reply-To gesetzt.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"integrationId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"smtpHost":{"type":["string","null"]},"smtpPort":{"type":["integer","null"]},"smtpEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"smtpUsername":{"type":["string","null"]},"hasPassword":{"description":"Ob ein Passwort hinterlegt ist (read-only Statusanzeige).","default":false,"type":"boolean"},"isDefault":{"description":"Globaler Fallback-Account (greift für Marken ohne eigenen Account).","type":["boolean","null"]},"active":{"type":["boolean","null"]}},"required":["label","fromEmail"]},"SystemMailAccount-system_mail_account.write":{"type":"object","description":"- System-Mailaccount je Marke (rein ausgehender Versandweg für alle System-Mails)\n- Verwaltung der Account-Zuordnung inkl. Typ (Google-Integration oder SMTP)\n- SMTP-Passwort write-only (verschlüsselt gespeichert, nie ausgelesen)\n- Typ gmail: OAuth-Credentials weiterhin über die Google-Integration (nicht über diese API).","properties":{"type":{"enum":["gmail","smtp"],"default":"gmail","type":"string"},"label":{"type":["string","null"]},"fromEmail":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"fromName":{"type":["string","null"]},"replyTo":{"format":"email","description":"Antwortadresse (Reply-To); wird auf ausgehende Mails ohne eigene Reply-To gesetzt.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"integrationId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"smtpHost":{"type":["string","null"]},"smtpPort":{"type":["integer","null"]},"smtpEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"smtpUsername":{"type":["string","null"]},"password":{"description":"Write-only: SMTP-Passwort. Wird verschlüsselt gespeichert und nie zurückgegeben.","type":["string","null"]},"isDefault":{"description":"Globaler Fallback-Account (greift für Marken ohne eigenen Account).","type":["boolean","null"]},"active":{"type":["boolean","null"]}},"required":["label","fromEmail"]},"SystemMailAccount-system_mail_account.write.jsonMergePatch":{"type":"object","description":"- System-Mailaccount je Marke (rein ausgehender Versandweg für alle System-Mails)\n- Verwaltung der Account-Zuordnung inkl. Typ (Google-Integration oder SMTP)\n- SMTP-Passwort write-only (verschlüsselt gespeichert, nie ausgelesen)\n- Typ gmail: OAuth-Credentials weiterhin über die Google-Integration (nicht über diese API).","properties":{"type":{"enum":["gmail","smtp"],"default":"gmail","type":"string"},"label":{"type":["string","null"]},"fromEmail":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"fromName":{"type":["string","null"]},"replyTo":{"format":"email","description":"Antwortadresse (Reply-To); wird auf ausgehende Mails ohne eigene Reply-To gesetzt.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"integrationId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"smtpHost":{"type":["string","null"]},"smtpPort":{"type":["integer","null"]},"smtpEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"smtpUsername":{"type":["string","null"]},"password":{"description":"Write-only: SMTP-Passwort. Wird verschlüsselt gespeichert und nie zurückgegeben.","type":["string","null"]},"isDefault":{"description":"Globaler Fallback-Account (greift für Marken ohne eigenen Account).","type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"SystemMailAccount.jsonld-system_mail_account.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"type":{"enum":["gmail","smtp"],"default":"gmail","type":"string"},"label":{"type":["string","null"]},"fromEmail":{"format":"email","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"fromName":{"type":["string","null"]},"replyTo":{"format":"email","description":"Antwortadresse (Reply-To); wird auf ausgehende Mails ohne eigene Reply-To gesetzt.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"brandId":{"type":["integer","null"]},"integrationId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"smtpHost":{"type":["string","null"]},"smtpPort":{"type":["integer","null"]},"smtpEncryption":{"enum":["ssl","tls","none"],"type":["string","null"]},"smtpUsername":{"type":["string","null"]},"hasPassword":{"description":"Ob ein Passwort hinterlegt ist (read-only Statusanzeige).","default":false,"type":"boolean"},"isDefault":{"description":"Globaler Fallback-Account (greift für Marken ohne eigenen Account).","type":["boolean","null"]},"active":{"type":["boolean","null"]}},"required":["label","fromEmail"]}],"description":"- System-Mailaccount je Marke (rein ausgehender Versandweg für alle System-Mails)\n- Verwaltung der Account-Zuordnung inkl. Typ (Google-Integration oder SMTP)\n- SMTP-Passwort write-only (verschlüsselt gespeichert, nie ausgelesen)\n- Typ gmail: OAuth-Credentials weiterhin über die Google-Integration (nicht über diese API)."},"SystemUpdate":{"type":"object","description":"System-Update-Fläche, Singleton-Ressource (id `system`). Gated: `platform.system.update`.\n\n - `GET /v1/system/update` — Status: Version, Feed-Konfig, letzter Check (6h Cache),\n   Entitlement, laufender/letzter Job.\n - `POST /v1/system/update/check` — erzwungener Feed-Re-Check (Cache umgangen).\n - `POST /v1/system/update/run` — startet Update-Lauf async (202 + jobId; Fortschritt über\n   `GET /v1/system/update/jobs/{jobId}`, {@see SystemUpdateJobResource}). Body optional\n   `{\"backup\": false}` überspringt DB-Sicherung.\n\nEntitlement-Felder (`entitled`/`entitlementReason`/`requiredPlan`): Feed-Server füllt sie\nab Liveschaltung anhand gebuchtem Plan (Plan-Kopplungs-Seam §D).","properties":{"id":{"description":"Singleton-Identifikator (immer `system`).","default":"system","type":"string"},"currentVersion":{"description":"Installierte Version (aus /VERSION; `dev` ohne Versionsdatei).","default":"","type":"string"},"channel":{"description":"Release-Kanal des Feeds (Default `stable`).","default":"stable","type":"string"},"feedConfigured":{"description":"Update-Feed konfiguriert (SYSTEM_UPDATE_FEED_URL)? Ohne Feed ist der Check inaktiv.","default":false,"type":"boolean"},"checkedAt":{"description":"Zeitpunkt des letzten Feed-Abrufs (Unix-Sekunden); null ohne Feed/Abruf.","type":["integer","null"]},"checkError":{"description":"Klartext-Detail, wenn der Feed-Abruf fehlschlug; null sonst.","type":["string","null"]},"availableVersion":{"description":"Vom Feed angebotene neueste Version; null ohne Feed/Angebot.","type":["string","null"]},"updateAvailable":{"description":"Angebotene Version neuer als installierte?","default":false,"type":"boolean"},"notes":{"description":"Release-Notes je Locale (z.B. de/en), Markdown/Plaintext.","type":"object","additionalProperties":{"type":"string"}},"releasedAt":{"type":["string","null"]},"minPhp":{"description":"Mindest-PHP-Version des Releases + ob diese Instanz sie erfüllt.","type":["string","null"]},"phpCompatible":{"default":true,"type":"boolean"},"minUpdatableVersion":{"description":"Mindest-Ausgangsversion für ein Direkt-Update + ob diese Instanz sie erfüllt.","type":["string","null"]},"versionUpdatable":{"default":true,"type":"boolean"},"entitled":{"description":"Plan-Entitlement (Seam §D): darf diese Instanz das Update einspielen?","default":true,"type":"boolean"},"entitlementReason":{"type":["string","null"]},"requiredPlan":{"type":["string","null"]},"runnable":{"description":"Verfügbar + Voraussetzungen + Entitlement erfüllt → Start sinnvoll.","default":false,"type":"boolean"},"activeJobId":{"description":"Zuletzt gestarteter Update-Job (auch nach UI-Reload wiederauffindbar); null wenn keiner.","type":["string","null"]},"activeJobStatus":{"description":"Status des zuletzt gestarteten Jobs (queued/running/succeeded/failed); null wenn keiner.","type":["string","null"]}}},"SystemUpdate-system_update.read":{"type":"object","description":"System-Update-Fläche, Singleton-Ressource (id `system`). Gated: `platform.system.update`.\n\n - `GET /v1/system/update` — Status: Version, Feed-Konfig, letzter Check (6h Cache),\n   Entitlement, laufender/letzter Job.\n - `POST /v1/system/update/check` — erzwungener Feed-Re-Check (Cache umgangen).\n - `POST /v1/system/update/run` — startet Update-Lauf async (202 + jobId; Fortschritt über\n   `GET /v1/system/update/jobs/{jobId}`, {@see SystemUpdateJobResource}). Body optional\n   `{\"backup\": false}` überspringt DB-Sicherung.\n\nEntitlement-Felder (`entitled`/`entitlementReason`/`requiredPlan`): Feed-Server füllt sie\nab Liveschaltung anhand gebuchtem Plan (Plan-Kopplungs-Seam §D).","properties":{"id":{"description":"Singleton-Identifikator (immer `system`).","default":"system","type":"string"},"currentVersion":{"description":"Installierte Version (aus /VERSION; `dev` ohne Versionsdatei).","default":"","type":"string"},"channel":{"description":"Release-Kanal des Feeds (Default `stable`).","default":"stable","type":"string"},"feedConfigured":{"description":"Update-Feed konfiguriert (SYSTEM_UPDATE_FEED_URL)? Ohne Feed ist der Check inaktiv.","default":false,"type":"boolean"},"checkedAt":{"description":"Zeitpunkt des letzten Feed-Abrufs (Unix-Sekunden); null ohne Feed/Abruf.","type":["integer","null"]},"checkError":{"description":"Klartext-Detail, wenn der Feed-Abruf fehlschlug; null sonst.","type":["string","null"]},"availableVersion":{"description":"Vom Feed angebotene neueste Version; null ohne Feed/Angebot.","type":["string","null"]},"updateAvailable":{"description":"Angebotene Version neuer als installierte?","default":false,"type":"boolean"},"notes":{"description":"Release-Notes je Locale (z.B. de/en), Markdown/Plaintext.","type":"object","additionalProperties":{"type":"string"}},"releasedAt":{"type":["string","null"]},"minPhp":{"description":"Mindest-PHP-Version des Releases + ob diese Instanz sie erfüllt.","type":["string","null"]},"phpCompatible":{"default":true,"type":"boolean"},"minUpdatableVersion":{"description":"Mindest-Ausgangsversion für ein Direkt-Update + ob diese Instanz sie erfüllt.","type":["string","null"]},"versionUpdatable":{"default":true,"type":"boolean"},"entitled":{"description":"Plan-Entitlement (Seam §D): darf diese Instanz das Update einspielen?","default":true,"type":"boolean"},"entitlementReason":{"type":["string","null"]},"requiredPlan":{"type":["string","null"]},"runnable":{"description":"Verfügbar + Voraussetzungen + Entitlement erfüllt → Start sinnvoll.","default":false,"type":"boolean"},"activeJobId":{"description":"Zuletzt gestarteter Update-Job (auch nach UI-Reload wiederauffindbar); null wenn keiner.","type":["string","null"]},"activeJobStatus":{"description":"Status des zuletzt gestarteten Jobs (queued/running/succeeded/failed); null wenn keiner.","type":["string","null"]}}},"SystemUpdate.jsonld-system_update.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Singleton-Identifikator (immer `system`).","default":"system","type":"string"},"currentVersion":{"description":"Installierte Version (aus /VERSION; `dev` ohne Versionsdatei).","default":"","type":"string"},"channel":{"description":"Release-Kanal des Feeds (Default `stable`).","default":"stable","type":"string"},"feedConfigured":{"description":"Update-Feed konfiguriert (SYSTEM_UPDATE_FEED_URL)? Ohne Feed ist der Check inaktiv.","default":false,"type":"boolean"},"checkedAt":{"description":"Zeitpunkt des letzten Feed-Abrufs (Unix-Sekunden); null ohne Feed/Abruf.","type":["integer","null"]},"checkError":{"description":"Klartext-Detail, wenn der Feed-Abruf fehlschlug; null sonst.","type":["string","null"]},"availableVersion":{"description":"Vom Feed angebotene neueste Version; null ohne Feed/Angebot.","type":["string","null"]},"updateAvailable":{"description":"Angebotene Version neuer als installierte?","default":false,"type":"boolean"},"notes":{"description":"Release-Notes je Locale (z.B. de/en), Markdown/Plaintext.","type":"object","additionalProperties":{"type":"string"}},"releasedAt":{"type":["string","null"]},"minPhp":{"description":"Mindest-PHP-Version des Releases + ob diese Instanz sie erfüllt.","type":["string","null"]},"phpCompatible":{"default":true,"type":"boolean"},"minUpdatableVersion":{"description":"Mindest-Ausgangsversion für ein Direkt-Update + ob diese Instanz sie erfüllt.","type":["string","null"]},"versionUpdatable":{"default":true,"type":"boolean"},"entitled":{"description":"Plan-Entitlement (Seam §D): darf diese Instanz das Update einspielen?","default":true,"type":"boolean"},"entitlementReason":{"type":["string","null"]},"requiredPlan":{"type":["string","null"]},"runnable":{"description":"Verfügbar + Voraussetzungen + Entitlement erfüllt → Start sinnvoll.","default":false,"type":"boolean"},"activeJobId":{"description":"Zuletzt gestarteter Update-Job (auch nach UI-Reload wiederauffindbar); null wenn keiner.","type":["string","null"]},"activeJobStatus":{"description":"Status des zuletzt gestarteten Jobs (queued/running/succeeded/failed); null wenn keiner.","type":["string","null"]}}}],"description":"System-Update-Fläche, Singleton-Ressource (id `system`). Gated: `platform.system.update`.\n\n - `GET /v1/system/update` — Status: Version, Feed-Konfig, letzter Check (6h Cache),\n   Entitlement, laufender/letzter Job.\n - `POST /v1/system/update/check` — erzwungener Feed-Re-Check (Cache umgangen).\n - `POST /v1/system/update/run` — startet Update-Lauf async (202 + jobId; Fortschritt über\n   `GET /v1/system/update/jobs/{jobId}`, {@see SystemUpdateJobResource}). Body optional\n   `{\"backup\": false}` überspringt DB-Sicherung.\n\nEntitlement-Felder (`entitled`/`entitlementReason`/`requiredPlan`): Feed-Server füllt sie\nab Liveschaltung anhand gebuchtem Plan (Plan-Kopplungs-Seam §D)."},"SystemUpdateJob-system_update_job.read":{"type":"object","description":"Fortschritt/Ergebnis des async System-Update-Laufs (gepollt nach POST /v1/system/update/run).\nApiResource statt Plain-Controller — MCP/Automation kann mitverfolgen (P-1/P-2).","properties":{"jobId":{"description":"Job-ID (ULID, aus der run-Antwort).","default":"","type":"string"},"status":{"description":"queued | running | succeeded | failed.","default":"","type":"string"},"message":{"description":"Menschentaugliche Meldung in Request-Sprache (Job-Store hält Übersetzungs-Keys).","default":"","type":"string"},"steps":{"description":"Schritt-Liste mit Live-Status (pending/running/ok/warning/failed).","type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"outputTail":{"description":"Letzte Konsolen-Zeilen des jüngsten (Warn-/Fehl-)Schritts; null ohne Ausgabe.","type":["string","null"]},"fromVersion":{"description":"Versionsstand vor dem Lauf (aus var/install.lock); null/leer wenn unbekannt.","type":["string","null"]},"toVersion":{"description":"Ziel-Version des Laufs (Code-Stand).","type":["string","null"]}}},"SystemUpdateJob.jsonld-system_update_job.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"jobId":{"description":"Job-ID (ULID, aus der run-Antwort).","default":"","type":"string"},"status":{"description":"queued | running | succeeded | failed.","default":"","type":"string"},"message":{"description":"Menschentaugliche Meldung in Request-Sprache (Job-Store hält Übersetzungs-Keys).","default":"","type":"string"},"steps":{"description":"Schritt-Liste mit Live-Status (pending/running/ok/warning/failed).","type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"outputTail":{"description":"Letzte Konsolen-Zeilen des jüngsten (Warn-/Fehl-)Schritts; null ohne Ausgabe.","type":["string","null"]},"fromVersion":{"description":"Versionsstand vor dem Lauf (aus var/install.lock); null/leer wenn unbekannt.","type":["string","null"]},"toVersion":{"description":"Ziel-Version des Laufs (Code-Stand).","type":["string","null"]}}}],"description":"Fortschritt/Ergebnis des async System-Update-Laufs (gepollt nach POST /v1/system/update/run).\nApiResource statt Plain-Controller — MCP/Automation kann mitverfolgen (P-1/P-2)."},"Tag-tag.read":{"type":"object","properties":{"id":{"type":["integer","null"]},"name":{"maxLength":100,"default":"","type":"string"},"color":{"maxLength":20,"type":["string","null"]},"scope":{"maxLength":100,"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"Tag-tag.write":{"type":"object","required":["name"],"properties":{"name":{"maxLength":100,"default":"","type":"string"},"color":{"maxLength":20,"type":["string","null"]},"scope":{"maxLength":100,"type":["string","null"]}}},"Tag-tag.write.jsonMergePatch":{"type":"object","properties":{"name":{"maxLength":100,"default":"","type":"string"},"color":{"maxLength":20,"type":["string","null"]},"scope":{"maxLength":100,"type":["string","null"]}}},"Tag.jsonld-tag.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["integer","null"]},"name":{"maxLength":100,"default":"","type":"string"},"color":{"maxLength":20,"type":["string","null"]},"scope":{"maxLength":100,"type":["string","null"]},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}]},"TagAssignment-tag_assignment.read":{"type":"object","description":"Schlagwörter AN einem Objekt (Programm 46 F-S, ENT-MKT-10).\n\n**Die Zugriffsprüfung hängt am ZIEL, nicht an einer eigenen Schlagwort-Berechtigung.** Wer eine\nAufgabe bearbeiten darf, darf sie verschlagworten; wer sie nicht einmal sehen darf, kann ihr\nauch kein Schlagwort anhängen. Ein eigenes `tag.assign`-Recht hätte eine zweite Wahrheit über\ndie Sichtbarkeit desselben Objekts geschaffen — und die Lücke dazwischen wäre ein Weg, fremde\nDatensätze zu verändern, ohne sie lesen zu dürfen.\n\nEin noch unbekanntes Schlagwort wird angelegt: ein Name, den es noch nicht gibt, ist kein\nFehler, sondern der Normalfall beim ersten Mal.","properties":{"id":{"type":["string","null"]},"entityType":{"type":["string","null"]},"entityId":{"type":["integer","null"]},"tag":{"description":"Name des Schlagworts; ein unbekannter wird angelegt.","type":["string","null"]},"changed":{"description":"Hat sich der Zustand wirklich geändert? (Idempotenz sichtbar gemacht.)","default":false,"type":"boolean"},"tags":{"description":"Schlagwörter des Ziels nach der Aktion — bzw. bei der Liste die des abgefragten Objekts.","type":"array","items":{"type":"string"}},"entityIds":{"description":"Nur bei Abfrage mit `tag`: Kennungen der Objekte, die es tragen — höchstens eine Seite\n({@see ListPaginator::MAX_PER_PAGE}), gefiltert auf das, was der Aufrufer sehen darf.","type":"array","items":{"type":"integer"}},"hasMore":{"description":"Nur bei Abfrage mit `tag`: liegen hinter dieser Seite weitere Kennungen?","default":false,"type":"boolean"},"nextAfterEntityId":{"description":"Nur bei Abfrage mit `tag`: Wert für `afterEntityId` der Folgeseite; `null` = Ende der Menge.","type":["integer","null"]}}},"TagAssignment-tag_assignment.write":{"type":"object","description":"Schlagwörter AN einem Objekt (Programm 46 F-S, ENT-MKT-10).\n\n**Die Zugriffsprüfung hängt am ZIEL, nicht an einer eigenen Schlagwort-Berechtigung.** Wer eine\nAufgabe bearbeiten darf, darf sie verschlagworten; wer sie nicht einmal sehen darf, kann ihr\nauch kein Schlagwort anhängen. Ein eigenes `tag.assign`-Recht hätte eine zweite Wahrheit über\ndie Sichtbarkeit desselben Objekts geschaffen — und die Lücke dazwischen wäre ein Weg, fremde\nDatensätze zu verändern, ohne sie lesen zu dürfen.\n\nEin noch unbekanntes Schlagwort wird angelegt: ein Name, den es noch nicht gibt, ist kein\nFehler, sondern der Normalfall beim ersten Mal.","properties":{"entityType":{"type":["string","null"]},"entityId":{"type":["integer","null"]},"tag":{"description":"Name des Schlagworts; ein unbekannter wird angelegt.","type":["string","null"]},"remove":{"description":"`true` entfernt statt zu vergeben.","default":false,"type":"boolean"}}},"TagAssignment.jsonld-tag_assignment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"entityType":{"type":["string","null"]},"entityId":{"type":["integer","null"]},"tag":{"description":"Name des Schlagworts; ein unbekannter wird angelegt.","type":["string","null"]},"changed":{"description":"Hat sich der Zustand wirklich geändert? (Idempotenz sichtbar gemacht.)","default":false,"type":"boolean"},"tags":{"description":"Schlagwörter des Ziels nach der Aktion — bzw. bei der Liste die des abgefragten Objekts.","type":"array","items":{"type":"string"}},"entityIds":{"description":"Nur bei Abfrage mit `tag`: Kennungen der Objekte, die es tragen — höchstens eine Seite\n({@see ListPaginator::MAX_PER_PAGE}), gefiltert auf das, was der Aufrufer sehen darf.","type":"array","items":{"type":"integer"}},"hasMore":{"description":"Nur bei Abfrage mit `tag`: liegen hinter dieser Seite weitere Kennungen?","default":false,"type":"boolean"},"nextAfterEntityId":{"description":"Nur bei Abfrage mit `tag`: Wert für `afterEntityId` der Folgeseite; `null` = Ende der Menge.","type":["integer","null"]}}}],"description":"Schlagwörter AN einem Objekt (Programm 46 F-S, ENT-MKT-10).\n\n**Die Zugriffsprüfung hängt am ZIEL, nicht an einer eigenen Schlagwort-Berechtigung.** Wer eine\nAufgabe bearbeiten darf, darf sie verschlagworten; wer sie nicht einmal sehen darf, kann ihr\nauch kein Schlagwort anhängen. Ein eigenes `tag.assign`-Recht hätte eine zweite Wahrheit über\ndie Sichtbarkeit desselben Objekts geschaffen — und die Lücke dazwischen wäre ein Weg, fremde\nDatensätze zu verändern, ohne sie lesen zu dürfen.\n\nEin noch unbekanntes Schlagwort wird angelegt: ein Name, den es noch nicht gibt, ist kein\nFehler, sondern der Normalfall beim ersten Mal."},"TaskBundle-taskbundle.read":{"type":"object","description":"Aufgaben-Bündel (Doc 27 1.1/G7): wiederverwendbarer Aufgaben-Baukasten für **bestehende** Projekte.\n- Lesen `projects.project.view` (Bündel im Projekt laden können alle, die Aufgaben pflegen)\n- Pflegen `projects.config.manage` (Verwaltung unter Einstellungen → Projekte, wie Projekt-Vorlagen)\n- Laden ins Projekt: `POST /v1/task-bundles/{ulid}/apply` mit `projects.project.edit`\n- Listen/Aufgaben werden beim Schreiben vollständig ersetzt (Positions-Indizes als Querbezug).","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":255,"type":["string","null"]},"description":{"type":["string","null"]},"active":{"default":true,"type":"boolean"},"brandId":{"description":"null = allen Marken verfügbar.","type":["integer","null"]},"lists":{"description":"Listen des Bündels (Reihenfolge = Positions-Index für `listIndex`).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Aufgaben des Bündels (Reihenfolge = Positions-Index für `parentIndex`/`dependsOnIndex`).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"array","items":{"type":"string"}},{"type":"string"},{"type":"null"}]}}},"appliedTasks":{"description":"Ergebnis von `apply`: erzeugte Aufgaben, neu angelegte und gemergte Listen.","type":["integer","null"]},"appliedListsCreated":{"type":["integer","null"]},"appliedListsMerged":{"type":["integer","null"]}},"required":["name"]},"TaskBundle-taskbundle.write":{"type":"object","description":"Aufgaben-Bündel (Doc 27 1.1/G7): wiederverwendbarer Aufgaben-Baukasten für **bestehende** Projekte.\n- Lesen `projects.project.view` (Bündel im Projekt laden können alle, die Aufgaben pflegen)\n- Pflegen `projects.config.manage` (Verwaltung unter Einstellungen → Projekte, wie Projekt-Vorlagen)\n- Laden ins Projekt: `POST /v1/task-bundles/{ulid}/apply` mit `projects.project.edit`\n- Listen/Aufgaben werden beim Schreiben vollständig ersetzt (Positions-Indizes als Querbezug).","required":["name"],"properties":{"name":{"maxLength":255,"type":["string","null"]},"description":{"type":["string","null"]},"active":{"default":true,"type":"boolean"},"brandId":{"description":"null = allen Marken verfügbar.","type":["integer","null"]},"lists":{"description":"Listen des Bündels (Reihenfolge = Positions-Index für `listIndex`).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Aufgaben des Bündels (Reihenfolge = Positions-Index für `parentIndex`/`dependsOnIndex`).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"array","items":{"type":"string"}},{"type":"string"},{"type":"null"}]}}},"projectUlid":{"description":"Zielprojekt (nur `apply`).","type":["string","null"]},"referenceDate":{"description":"Referenzdatum der relativen Offsets (nur `apply`; Default heute).","type":["string","null"]}}},"TaskBundle-taskbundle.write.jsonMergePatch":{"type":"object","description":"Aufgaben-Bündel (Doc 27 1.1/G7): wiederverwendbarer Aufgaben-Baukasten für **bestehende** Projekte.\n- Lesen `projects.project.view` (Bündel im Projekt laden können alle, die Aufgaben pflegen)\n- Pflegen `projects.config.manage` (Verwaltung unter Einstellungen → Projekte, wie Projekt-Vorlagen)\n- Laden ins Projekt: `POST /v1/task-bundles/{ulid}/apply` mit `projects.project.edit`\n- Listen/Aufgaben werden beim Schreiben vollständig ersetzt (Positions-Indizes als Querbezug).","properties":{"name":{"maxLength":255,"type":["string","null"]},"description":{"type":["string","null"]},"active":{"default":true,"type":"boolean"},"brandId":{"description":"null = allen Marken verfügbar.","type":["integer","null"]},"lists":{"description":"Listen des Bündels (Reihenfolge = Positions-Index für `listIndex`).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Aufgaben des Bündels (Reihenfolge = Positions-Index für `parentIndex`/`dependsOnIndex`).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"array","items":{"type":"string"}},{"type":"string"},{"type":"null"}]}}},"projectUlid":{"description":"Zielprojekt (nur `apply`).","type":["string","null"]},"referenceDate":{"description":"Referenzdatum der relativen Offsets (nur `apply`; Default heute).","type":["string","null"]}}},"TaskBundle.jsonld-taskbundle.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":255,"type":["string","null"]},"description":{"type":["string","null"]},"active":{"default":true,"type":"boolean"},"brandId":{"description":"null = allen Marken verfügbar.","type":["integer","null"]},"lists":{"description":"Listen des Bündels (Reihenfolge = Positions-Index für `listIndex`).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"tasks":{"description":"Aufgaben des Bündels (Reihenfolge = Positions-Index für `parentIndex`/`dependsOnIndex`).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"array","items":{"type":"string"}},{"type":"string"},{"type":"null"}]}}},"appliedTasks":{"description":"Ergebnis von `apply`: erzeugte Aufgaben, neu angelegte und gemergte Listen.","type":["integer","null"]},"appliedListsCreated":{"type":["integer","null"]},"appliedListsMerged":{"type":["integer","null"]}},"required":["name"]}],"description":"Aufgaben-Bündel (Doc 27 1.1/G7): wiederverwendbarer Aufgaben-Baukasten für **bestehende** Projekte.\n- Lesen `projects.project.view` (Bündel im Projekt laden können alle, die Aufgaben pflegen)\n- Pflegen `projects.config.manage` (Verwaltung unter Einstellungen → Projekte, wie Projekt-Vorlagen)\n- Laden ins Projekt: `POST /v1/task-bundles/{ulid}/apply` mit `projects.project.edit`\n- Listen/Aufgaben werden beim Schreiben vollständig ersetzt (Positions-Indizes als Querbezug)."},"TaxRate-tax_rate.read":{"type":"object","description":"Steuersatz-Katalog (Modul 0, read-only Lookup) für Artikel/Belege.\n- Commerce-Kernel-Stammdaten → Core, nicht Plugin (sonst fail-closed hinter Modul-Flag).\n- Bewusst int-PK (kein ULID/Soft-Delete) — Alt-Ausnahme analog Setting/Role/Tag/Locale.\n- ROLE_USER genügt (Lesen für Auswahl); Voter am schreibenden Konsumenten schützt.","properties":{"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"rate":{"description":"Satz als decimal-String, z. B. '19.00'.","type":["string","null"]},"ratePercent":{"description":"Satz als Float in Prozent (z. B. 19.0) — bequem für die UI-Anzeige/Brutto-Rechnung.","type":["number","null"]},"category":{"description":"regular | reduced | exempt.","type":["string","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"TaxRate.jsonld-tax_rate.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["integer","null"]},"name":{"type":["string","null"]},"rate":{"description":"Satz als decimal-String, z. B. '19.00'.","type":["string","null"]},"ratePercent":{"description":"Satz als Float in Prozent (z. B. 19.0) — bequem für die UI-Anzeige/Brutto-Rechnung.","type":["number","null"]},"category":{"description":"regular | reduced | exempt.","type":["string","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Steuersatz-Katalog (Modul 0, read-only Lookup) für Artikel/Belege.\n- Commerce-Kernel-Stammdaten → Core, nicht Plugin (sonst fail-closed hinter Modul-Flag).\n- Bewusst int-PK (kein ULID/Soft-Delete) — Alt-Ausnahme analog Setting/Role/Tag/Locale.\n- ROLE_USER genügt (Lesen für Auswahl); Voter am schreibenden Konsumenten schützt."},"Team-team.read":{"type":"object","description":"Generisches Team (Doc 26 5.1). Lesen `platform.team.read`; Pflege `platform.team.manage`.\nMarken-Scope im Provider/Processor (IDOR).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"default":"","type":"string"},"description":{"maxLength":500,"type":["string","null"]},"brandId":{"type":["integer","null"]},"leadUserId":{"type":["integer","null"]},"memberIds":{"type":"array","items":{"type":"integer"}},"active":{"default":true,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"Team-team.write":{"type":"object","description":"Generisches Team (Doc 26 5.1). Lesen `platform.team.read`; Pflege `platform.team.manage`.\nMarken-Scope im Provider/Processor (IDOR).","required":["name"],"properties":{"name":{"maxLength":120,"default":"","type":"string"},"description":{"maxLength":500,"type":["string","null"]},"brandId":{"type":["integer","null"]},"leadUserId":{"type":["integer","null"]},"memberIds":{"type":"array","items":{"type":"integer"}},"active":{"default":true,"type":"boolean"}}},"Team-team.write.jsonMergePatch":{"type":"object","description":"Generisches Team (Doc 26 5.1). Lesen `platform.team.read`; Pflege `platform.team.manage`.\nMarken-Scope im Provider/Processor (IDOR).","properties":{"name":{"maxLength":120,"default":"","type":"string"},"description":{"maxLength":500,"type":["string","null"]},"brandId":{"type":["integer","null"]},"leadUserId":{"type":["integer","null"]},"memberIds":{"type":"array","items":{"type":"integer"}},"active":{"default":true,"type":"boolean"}}},"Team.jsonld-team.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":120,"default":"","type":"string"},"description":{"maxLength":500,"type":["string","null"]},"brandId":{"type":["integer","null"]},"leadUserId":{"type":["integer","null"]},"memberIds":{"type":"array","items":{"type":"integer"}},"active":{"default":true,"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}],"description":"Generisches Team (Doc 26 5.1). Lesen `platform.team.read`; Pflege `platform.team.manage`.\nMarken-Scope im Provider/Processor (IDOR)."},"TeamsChannelLink-teamslink.read":{"type":"object","description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.2).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\MsTeams\\Controller\\TeamsInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\MsTeams\\Entity\\TeamsChannelLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler.","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"channelId":{"maxLength":190,"description":"Teams-Kanal-Id (`19:…@thread.tacv2`) — nicht der Anzeigename, der ist umbenennbar.","type":["string","null"]},"channelName":{"maxLength":120,"type":["string","null"]},"active":{"description":"Ereignis-Posts aussetzen, ohne die Verknüpfung zu verlieren.","default":true,"type":"boolean"}},"required":["projectId","channelId"]},"TeamsChannelLink-teamslink.write":{"type":"object","description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.2).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\MsTeams\\Controller\\TeamsInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\MsTeams\\Entity\\TeamsChannelLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler.","required":["projectId","channelId"],"properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"channelId":{"maxLength":190,"description":"Teams-Kanal-Id (`19:…@thread.tacv2`) — nicht der Anzeigename, der ist umbenennbar.","type":["string","null"]},"channelName":{"maxLength":120,"type":["string","null"]},"active":{"description":"Ereignis-Posts aussetzen, ohne die Verknüpfung zu verlieren.","default":true,"type":"boolean"}}},"TeamsChannelLink-teamslink.write.jsonMergePatch":{"type":"object","description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.2).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\MsTeams\\Controller\\TeamsInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\MsTeams\\Entity\\TeamsChannelLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler.","properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"channelId":{"maxLength":190,"description":"Teams-Kanal-Id (`19:…@thread.tacv2`) — nicht der Anzeigename, der ist umbenennbar.","type":["string","null"]},"channelName":{"maxLength":120,"type":["string","null"]},"active":{"description":"Ereignis-Posts aussetzen, ohne die Verknüpfung zu verlieren.","default":true,"type":"boolean"}}},"TeamsChannelLink.jsonld-teamslink.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"channelId":{"maxLength":190,"description":"Teams-Kanal-Id (`19:…@thread.tacv2`) — nicht der Anzeigename, der ist umbenennbar.","type":["string","null"]},"channelName":{"maxLength":120,"type":["string","null"]},"active":{"description":"Ereignis-Posts aussetzen, ohne die Verknüpfung zu verlieren.","default":true,"type":"boolean"}},"required":["projectId","channelId"]}],"description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.2).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\MsTeams\\Controller\\TeamsInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\MsTeams\\Entity\\TeamsChannelLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler."},"Ticket-ticket.read":{"type":"object","description":"Ticket-Resource (04-04 §4/§5, API-First) — Ticket = WorkItem(kind=ticket). Neben CRUD:\nSupport-Workflows als diskrete POSTs (antworten/Notiz, zuweisen, Status/Reopen, Merge/Split,\nKI-Triage, KI-Assistenz). Listen serverseitig gefiltert (Queue-Sichten); interne Felder\nPortal-getrennt.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische WorkItem-PK (read-only) — entityId für den polymorphen Benutzerfeld-Editor\n(entityType „ticket\"; der CustomFieldTargetAccessResolver löst gegen WorkItem::class auf).","type":["integer","null"]},"ref":{"type":["string","null"]},"customerCode":{"description":"Dedizierte, kundenseitige Vorgangsnummer (brand-abhängig) — die nach außen kommunizierte ID.","type":["string","null"]},"title":{"maxLength":255,"type":["string","null"]},"description":{"type":["string","null"]},"statusId":{"type":["string","null"]},"priorityId":{"type":["string","null"]},"categoryId":{"type":["integer","null"]},"channel":{"type":["string","null"]},"source":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"contactId":{"type":["integer","null"]},"customerName":{"description":"Anzeige-Kontext des Melders (Read-only): Name + ULID des zugeordneten Kunden für Label/Sprungziel.","type":["string","null"]},"customerUlid":{"type":["string","null"]},"contactName":{"description":"Anzeige-Kontext des Melders (Read-only): Name + ULID des zugeordneten Ansprechpartners.","type":["string","null"]},"contactUlid":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"projectId":{"type":["integer","null"]},"milestoneId":{"type":["integer","null"]},"projectUlid":{"description":"AP-3.2: Projekt-/Meilenstein-Kontext (Read-only, Detail) für den Badge mit Link zum Projekt.","type":["string","null"]},"projectName":{"type":["string","null"]},"milestoneName":{"type":["string","null"]},"contractId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"assigneeIds":{"type":["array","null"],"items":{"type":"integer"}},"slaId":{"type":["integer","null"]},"firstResponseDueAt":{"type":["string","null"]},"resolutionDueAt":{"type":["string","null"]},"firstRespondedAt":{"type":["string","null"]},"slaPausedAt":{"type":["string","null"]},"slaBreached":{"default":false,"type":"boolean"},"reopenedCount":{"default":0,"type":"integer"},"resolvedAt":{"type":["string","null"]},"closedAt":{"type":["string","null"]},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]},"messages":{"description":"Verlauf (nur Item-Detail): Liste aus {ulid, direction, type, fromEmail, subject, body, isInternal, isAutoReply, createdAt}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"quotaSnapshot":{"description":"Vertrags-Kontingent-Snapshot (nur Item-Detail, 04-04 §4.4): {contractId, totalMinutes,\nusedMinutes, remainingMinutes, depleted, periodStart, periodEnd, overageRule}. Befüllt über\nInter-Modul-Vertrag {@see \\App\\Ticket\\Contract\\ContractQuotaProvider}; null, wenn kein\naktiver Vertrag deckt (T&M).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"duplicateCandidates":{"description":"Dubletten-Kandidaten (nur Item-Detail, 04-04 §4.1, S4-1): heuristisch ähnliche, offene\nTickets desselben Kunden/derselben Marke als Merge-Vorschlag. Liste aus {ulid, title,\nsimilarity} (similarity ∈ [0,1], absteigend sortiert). Leer, wenn kein Kunde gesetzt oder\nkeine Kandidaten. Befüllt über marken-gescopten\n{@see \\Octi\\Plugin\\Tickets\\Service\\DuplicateDetector} im Item-Provider.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"suggestion":{"description":"triage: Empfehlung {priorityKey, categoryId, language, summary}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"assist":{"description":"assist: KI-Ausgabe (summary/sentiment/draft/translation).","type":["string","null"]},"affected":{"description":"block-sender: Anzahl betroffener (geschlossener) Tickets; bulk antwortet direkt mit {affected}.","type":["integer","null"]},"affectedIncomplete":{"description":"block-sender: true = die Stapelgrenze hat gegriffen, es bleiben weitere offene Tickets dieses\nAbsenders (R37-21). Der Aufruf ist zu wiederholen; `affected` zaehlt nur den erledigten Teil.","type":["boolean","null"]}}},"Ticket-ticket.write":{"type":"object","description":"Ticket-Resource (04-04 §4/§5, API-First) — Ticket = WorkItem(kind=ticket). Neben CRUD:\nSupport-Workflows als diskrete POSTs (antworten/Notiz, zuweisen, Status/Reopen, Merge/Split,\nKI-Triage, KI-Assistenz). Listen serverseitig gefiltert (Queue-Sichten); interne Felder\nPortal-getrennt.","required":["title"],"properties":{"title":{"maxLength":255,"type":["string","null"]},"description":{"type":["string","null"]},"statusId":{"type":["string","null"]},"priorityId":{"type":["string","null"]},"categoryId":{"type":["integer","null"]},"channel":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"contactId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"projectId":{"type":["integer","null"]},"milestoneId":{"type":["integer","null"]},"contractId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"body":{"description":"reply/note: Nachrichtentext (HTML).","type":["string","null"]},"statusKey":{"maxLength":100,"description":"reply: optionaler Status nach dem Senden („Antworten + warten\").","type":["string","null"]},"to":{"format":"email","maxLength":255,"description":"reply: abweichender Empfänger / Absender.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"fromAddress":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"attachmentIds":{"description":"reply/note: DMS-Datei-ULIDs als Anhänge (Upload vorher über `/v1/platform/files`).","type":["array","null"],"items":{"type":"string"}},"employeeId":{"description":"assign: Bearbeiter (User-ID, einheitlicher Owner/Assignee/Watcher-ID-Raum) + Team + Rolle/Grund.","type":["integer","null"]},"teamId":{"type":["integer","null"]},"role":{"type":["string","null"]},"reason":{"type":["string","null"]},"duplicateUlid":{"description":"merge: ULID des Duplikats, das in dieses Ticket übernommen wird.","type":["string","null"]},"splitTitle":{"maxLength":255,"description":"split: neues Work-Item.","type":["string","null"]},"splitDescription":{"type":["string","null"]},"splitKind":{"enum":["task","ticket"],"description":"task|ticket.","type":["string","null"]},"splitProjectId":{"minimum":0,"exclusiveMinimum":0,"description":"split: Zielprojekt des neuen Vorgangs (überschreibt die vom Ticket geerbte Zuordnung).","type":["integer","null"]},"splitMilestoneId":{"minimum":0,"exclusiveMinimum":0,"description":"split: Meilenstein im Zielprojekt (nur zusammen mit splitProjectId).","type":["integer","null"]},"splitAttachmentIds":{"description":"split: ausgewählte Anhänge (DMS-Datei-ULIDs des Quell-Tickets) als Vorgangs-Dokumente für\nden neuen Task („welche Anhänge?\"-Picker). Reine Referenz (keine Byte-Kopie), zentral\nvalidiert (Existenz, gleiche Marke, Sichtbarkeit). Leer/null = keine.","type":["array","null"],"items":{"type":"string"}},"linkType":{"enum":["relates","causes","duplicate"],"description":"relates|causes|duplicate.","type":["string","null"]},"applyTriage":{"description":"triage: bestätigte Empfehlung sofort anwenden.","type":["boolean","null"]},"mode":{"enum":["summary","sentiment","draft","translate"],"description":"assist: summary|sentiment|draft|translate.","type":["string","null"]},"hint":{"maxLength":1000,"description":"assist (translate): Zielsprache; assist (draft): Hinweis.","type":["string","null"]},"targetLanguage":{"maxLength":35,"description":"BCP-47-Sprachkennung (z.B. „de\", „en-GB\").","type":["string","null"]},"blockType":{"enum":["email","domain"],"description":"block-sender: email|domain (Default email).","type":["string","null"]},"blockScope":{"enum":["global","brand"],"description":"block-sender: global|brand (Default global).","type":["string","null"]},"closeOpenTickets":{"description":"block-sender: zusätzlich offene Tickets dieses Absenders schließen.","type":["boolean","null"]},"ids":{"type":["array","null"],"items":{"type":"string"}},"bulkAction":{"enum":["assign","status","priority","category","close","tag","assign_customer","assign_project","convert_task","discard"],"description":"bulk: assign|status|priority|category|close|tag + Eingangskorb (AP-2.5): assign_customer|assign_project|convert_task|discard.","type":["string","null"]},"bulkValue":{"description":"bulk: Wert je nach Aktion (Status-Key, Priority-Key, Category-Id, Employee-Id, Tag, Customer-Id, Project-Id).","type":["string","null"]}}},"Ticket-ticket.write.jsonMergePatch":{"type":"object","description":"Ticket-Resource (04-04 §4/§5, API-First) — Ticket = WorkItem(kind=ticket). Neben CRUD:\nSupport-Workflows als diskrete POSTs (antworten/Notiz, zuweisen, Status/Reopen, Merge/Split,\nKI-Triage, KI-Assistenz). Listen serverseitig gefiltert (Queue-Sichten); interne Felder\nPortal-getrennt.","properties":{"title":{"maxLength":255,"type":["string","null"]},"description":{"type":["string","null"]},"statusId":{"type":["string","null"]},"priorityId":{"type":["string","null"]},"categoryId":{"type":["integer","null"]},"channel":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"contactId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"projectId":{"type":["integer","null"]},"milestoneId":{"type":["integer","null"]},"contractId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"body":{"description":"reply/note: Nachrichtentext (HTML).","type":["string","null"]},"statusKey":{"maxLength":100,"description":"reply: optionaler Status nach dem Senden („Antworten + warten\").","type":["string","null"]},"to":{"format":"email","maxLength":255,"description":"reply: abweichender Empfänger / Absender.","externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"fromAddress":{"format":"email","maxLength":255,"externalDocs":{"url":"https://schema.org/email"},"type":["string","null"]},"attachmentIds":{"description":"reply/note: DMS-Datei-ULIDs als Anhänge (Upload vorher über `/v1/platform/files`).","type":["array","null"],"items":{"type":"string"}},"employeeId":{"description":"assign: Bearbeiter (User-ID, einheitlicher Owner/Assignee/Watcher-ID-Raum) + Team + Rolle/Grund.","type":["integer","null"]},"teamId":{"type":["integer","null"]},"role":{"type":["string","null"]},"reason":{"type":["string","null"]},"duplicateUlid":{"description":"merge: ULID des Duplikats, das in dieses Ticket übernommen wird.","type":["string","null"]},"splitTitle":{"maxLength":255,"description":"split: neues Work-Item.","type":["string","null"]},"splitDescription":{"type":["string","null"]},"splitKind":{"enum":["task","ticket"],"description":"task|ticket.","type":["string","null"]},"splitProjectId":{"minimum":0,"exclusiveMinimum":0,"description":"split: Zielprojekt des neuen Vorgangs (überschreibt die vom Ticket geerbte Zuordnung).","type":["integer","null"]},"splitMilestoneId":{"minimum":0,"exclusiveMinimum":0,"description":"split: Meilenstein im Zielprojekt (nur zusammen mit splitProjectId).","type":["integer","null"]},"splitAttachmentIds":{"description":"split: ausgewählte Anhänge (DMS-Datei-ULIDs des Quell-Tickets) als Vorgangs-Dokumente für\nden neuen Task („welche Anhänge?\"-Picker). Reine Referenz (keine Byte-Kopie), zentral\nvalidiert (Existenz, gleiche Marke, Sichtbarkeit). Leer/null = keine.","type":["array","null"],"items":{"type":"string"}},"linkType":{"enum":["relates","causes","duplicate"],"description":"relates|causes|duplicate.","type":["string","null"]},"applyTriage":{"description":"triage: bestätigte Empfehlung sofort anwenden.","type":["boolean","null"]},"mode":{"enum":["summary","sentiment","draft","translate"],"description":"assist: summary|sentiment|draft|translate.","type":["string","null"]},"hint":{"maxLength":1000,"description":"assist (translate): Zielsprache; assist (draft): Hinweis.","type":["string","null"]},"targetLanguage":{"maxLength":35,"description":"BCP-47-Sprachkennung (z.B. „de\", „en-GB\").","type":["string","null"]},"blockType":{"enum":["email","domain"],"description":"block-sender: email|domain (Default email).","type":["string","null"]},"blockScope":{"enum":["global","brand"],"description":"block-sender: global|brand (Default global).","type":["string","null"]},"closeOpenTickets":{"description":"block-sender: zusätzlich offene Tickets dieses Absenders schließen.","type":["boolean","null"]},"ids":{"type":["array","null"],"items":{"type":"string"}},"bulkAction":{"enum":["assign","status","priority","category","close","tag","assign_customer","assign_project","convert_task","discard"],"description":"bulk: assign|status|priority|category|close|tag + Eingangskorb (AP-2.5): assign_customer|assign_project|convert_task|discard.","type":["string","null"]},"bulkValue":{"description":"bulk: Wert je nach Aktion (Status-Key, Priority-Key, Category-Id, Employee-Id, Tag, Customer-Id, Project-Id).","type":["string","null"]}}},"Ticket.jsonld-ticket.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische WorkItem-PK (read-only) — entityId für den polymorphen Benutzerfeld-Editor\n(entityType „ticket\"; der CustomFieldTargetAccessResolver löst gegen WorkItem::class auf).","type":["integer","null"]},"ref":{"type":["string","null"]},"customerCode":{"description":"Dedizierte, kundenseitige Vorgangsnummer (brand-abhängig) — die nach außen kommunizierte ID.","type":["string","null"]},"title":{"maxLength":255,"type":["string","null"]},"description":{"type":["string","null"]},"statusId":{"type":["string","null"]},"priorityId":{"type":["string","null"]},"categoryId":{"type":["integer","null"]},"channel":{"type":["string","null"]},"source":{"type":["string","null"]},"customerId":{"type":["integer","null"]},"contactId":{"type":["integer","null"]},"customerName":{"description":"Anzeige-Kontext des Melders (Read-only): Name + ULID des zugeordneten Kunden für Label/Sprungziel.","type":["string","null"]},"customerUlid":{"type":["string","null"]},"contactName":{"description":"Anzeige-Kontext des Melders (Read-only): Name + ULID des zugeordneten Ansprechpartners.","type":["string","null"]},"contactUlid":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"projectId":{"type":["integer","null"]},"milestoneId":{"type":["integer","null"]},"projectUlid":{"description":"AP-3.2: Projekt-/Meilenstein-Kontext (Read-only, Detail) für den Badge mit Link zum Projekt.","type":["string","null"]},"projectName":{"type":["string","null"]},"milestoneName":{"type":["string","null"]},"contractId":{"type":["integer","null"]},"ownerId":{"type":["integer","null"]},"assigneeIds":{"type":["array","null"],"items":{"type":"integer"}},"slaId":{"type":["integer","null"]},"firstResponseDueAt":{"type":["string","null"]},"resolutionDueAt":{"type":["string","null"]},"firstRespondedAt":{"type":["string","null"]},"slaPausedAt":{"type":["string","null"]},"slaBreached":{"default":false,"type":"boolean"},"reopenedCount":{"default":0,"type":"integer"},"resolvedAt":{"type":["string","null"]},"closedAt":{"type":["string","null"]},"tags":{"description":"Schlagwörter des Datensatzes. Setzen ersetzt die GANZE Liste über den Zuordnungs-Dienst: fehlende werden angelegt, überzählige entfernt, TagAssigned/TagRemoved feuern nur bei echtem Wechsel — ein Eintritts-Schlagwort startet also sofort die passende Marketing-Strecke. Feld nicht gesendet = unverändert.","type":["array","null"],"items":{"type":"string"}},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]},"messages":{"description":"Verlauf (nur Item-Detail): Liste aus {ulid, direction, type, fromEmail, subject, body, isInternal, isAutoReply, createdAt}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"quotaSnapshot":{"description":"Vertrags-Kontingent-Snapshot (nur Item-Detail, 04-04 §4.4): {contractId, totalMinutes,\nusedMinutes, remainingMinutes, depleted, periodStart, periodEnd, overageRule}. Befüllt über\nInter-Modul-Vertrag {@see \\App\\Ticket\\Contract\\ContractQuotaProvider}; null, wenn kein\naktiver Vertrag deckt (T&M).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"duplicateCandidates":{"description":"Dubletten-Kandidaten (nur Item-Detail, 04-04 §4.1, S4-1): heuristisch ähnliche, offene\nTickets desselben Kunden/derselben Marke als Merge-Vorschlag. Liste aus {ulid, title,\nsimilarity} (similarity ∈ [0,1], absteigend sortiert). Leer, wenn kein Kunde gesetzt oder\nkeine Kandidaten. Befüllt über marken-gescopten\n{@see \\Octi\\Plugin\\Tickets\\Service\\DuplicateDetector} im Item-Provider.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"suggestion":{"description":"triage: Empfehlung {priorityKey, categoryId, language, summary}.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"assist":{"description":"assist: KI-Ausgabe (summary/sentiment/draft/translation).","type":["string","null"]},"affected":{"description":"block-sender: Anzahl betroffener (geschlossener) Tickets; bulk antwortet direkt mit {affected}.","type":["integer","null"]},"affectedIncomplete":{"description":"block-sender: true = die Stapelgrenze hat gegriffen, es bleiben weitere offene Tickets dieses\nAbsenders (R37-21). Der Aufruf ist zu wiederholen; `affected` zaehlt nur den erledigten Teil.","type":["boolean","null"]}}}],"description":"Ticket-Resource (04-04 §4/§5, API-First) — Ticket = WorkItem(kind=ticket). Neben CRUD:\nSupport-Workflows als diskrete POSTs (antworten/Notiz, zuweisen, Status/Reopen, Merge/Split,\nKI-Triage, KI-Assistenz). Listen serverseitig gefiltert (Queue-Sichten); interne Felder\nPortal-getrennt."},"TicketCategory-ticket_category.read":{"type":"object","description":"Ticket-Kategorie/Queue als Daten (04-04 §3/AK11). `defaultAssigneeId` ermöglicht die\nStammbearbeiter-Auto-Zuweisung (T6), `parentId` die Hierarchie.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"defaultAssigneeId":{"type":["integer","null"]},"defaultBrandId":{"type":["integer","null"]},"parentId":{"type":["integer","null"]},"agentPool":{"type":["array","null"],"items":{"type":"integer"}},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"TicketCategory-ticket_category.update.jsonMergePatch":{"type":"object","description":"Ticket-Kategorie/Queue als Daten (04-04 §3/AK11). `defaultAssigneeId` ermöglicht die\nStammbearbeiter-Auto-Zuweisung (T6), `parentId` die Hierarchie.","properties":{"label":{"type":["string","null"]},"defaultAssigneeId":{"type":["integer","null"]},"defaultBrandId":{"type":["integer","null"]},"parentId":{"type":["integer","null"]},"agentPool":{"type":["array","null"],"items":{"type":"integer"}},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"TicketCategory-ticket_category.write":{"type":"object","description":"Ticket-Kategorie/Queue als Daten (04-04 §3/AK11). `defaultAssigneeId` ermöglicht die\nStammbearbeiter-Auto-Zuweisung (T6), `parentId` die Hierarchie.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"defaultAssigneeId":{"type":["integer","null"]},"defaultBrandId":{"type":["integer","null"]},"parentId":{"type":["integer","null"]},"agentPool":{"type":["array","null"],"items":{"type":"integer"}},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"TicketCategory.jsonld-ticket_category.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"id":{"type":["integer","null"]},"label":{"type":["string","null"]},"defaultAssigneeId":{"type":["integer","null"]},"defaultBrandId":{"type":["integer","null"]},"parentId":{"type":["integer","null"]},"agentPool":{"type":["array","null"],"items":{"type":"integer"}},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}}],"description":"Ticket-Kategorie/Queue als Daten (04-04 §3/AK11). `defaultAssigneeId` ermöglicht die\nStammbearbeiter-Auto-Zuweisung (T6), `parentId` die Hierarchie."},"TicketMailPollRun-mail_poll_run.read":{"type":"object","description":"Support-Mail-Abruf als API-Aktion (`POST /v1/tickets/mail-poll-run` → {dispatched}) — API-Pendant\nzu `support:mail-poll` (P-1/P-3, Audit R21 PAR-5: Abruf zuvor nur per CLI/Cron auslösbar;\nVorbild `POST /v1/tickets/triage-calibrate`). Nutzt dieselbe inkrementell-idempotente Service-Logik\nüber ALLE Kanäle ({@see \\Octi\\Plugin\\Tickets\\Service\\MailPollCoordinator::pollAll()}), synchron;\nMail-Verarbeitung selbst läuft wie beim Cron async über Messenger. Literal `mail-poll-run`\nkollidiert mit keiner `{ulid}`-Route (Muster TriageCalibrationResource).","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"TicketMailPollRun-mail_poll_run.write":{"type":"object","description":"Support-Mail-Abruf als API-Aktion (`POST /v1/tickets/mail-poll-run` → {dispatched}) — API-Pendant\nzu `support:mail-poll` (P-1/P-3, Audit R21 PAR-5: Abruf zuvor nur per CLI/Cron auslösbar;\nVorbild `POST /v1/tickets/triage-calibrate`). Nutzt dieselbe inkrementell-idempotente Service-Logik\nüber ALLE Kanäle ({@see \\Octi\\Plugin\\Tickets\\Service\\MailPollCoordinator::pollAll()}), synchron;\nMail-Verarbeitung selbst läuft wie beim Cron async über Messenger. Literal `mail-poll-run`\nkollidiert mit keiner `{ulid}`-Route (Muster TriageCalibrationResource)."},"TicketMailPollRun.jsonld-mail_poll_run.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"Support-Mail-Abruf als API-Aktion (`POST /v1/tickets/mail-poll-run` → {dispatched}) — API-Pendant\nzu `support:mail-poll` (P-1/P-3, Audit R21 PAR-5: Abruf zuvor nur per CLI/Cron auslösbar;\nVorbild `POST /v1/tickets/triage-calibrate`). Nutzt dieselbe inkrementell-idempotente Service-Logik\nüber ALLE Kanäle ({@see \\Octi\\Plugin\\Tickets\\Service\\MailPollCoordinator::pollAll()}), synchron;\nMail-Verarbeitung selbst läuft wie beim Cron async über Messenger. Literal `mail-poll-run`\nkollidiert mit keiner `{ulid}`-Route (Muster TriageCalibrationResource)."},"TicketPriority-ticket_priority.read":{"type":"object","description":"Ticket-Priorität als Daten (04-04 §3/AK11). `level` 1–4; `defaultSlaId` liefert die\nPrioritäts-Default-SLA.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"level":{"minimum":1,"maximum":4,"type":["integer","null"]},"color":{"type":["string","null"]},"defaultSlaId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"TicketPriority-ticket_priority.update.jsonMergePatch":{"type":"object","description":"Ticket-Priorität als Daten (04-04 §3/AK11). `level` 1–4; `defaultSlaId` liefert die\nPrioritäts-Default-SLA.","properties":{"label":{"type":["string","null"]},"level":{"minimum":1,"maximum":4,"type":["integer","null"]},"color":{"type":["string","null"]},"defaultSlaId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"TicketPriority-ticket_priority.write":{"type":"object","description":"Ticket-Priorität als Daten (04-04 §3/AK11). `level` 1–4; `defaultSlaId` liefert die\nPrioritäts-Default-SLA.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"level":{"minimum":1,"maximum":4,"type":["integer","null"]},"color":{"type":["string","null"]},"defaultSlaId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"TicketPriority.jsonld-ticket_priority.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"level":{"minimum":1,"maximum":4,"type":["integer","null"]},"color":{"type":["string","null"]},"defaultSlaId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Ticket-Priorität als Daten (04-04 §3/AK11). `level` 1–4; `defaultSlaId` liefert die\nPrioritäts-Default-SLA."},"TicketReport-ticket_report.read":{"type":"object","description":"Support-Kennzahlen für das SLA-/Support-Dashboard (04-04 §5). Aggregat-Read; filterbar über\n?brandId.","properties":{"scope":{"default":"all","type":"string"},"brandId":{"type":["integer","null"]},"open":{"default":0,"type":"integer"},"byStatus":{"type":"object","additionalProperties":{"type":"integer"}},"byPriority":{"type":"object","additionalProperties":{"type":"integer"}},"slaAtRisk":{"default":0,"type":"integer"},"slaBreached":{"default":0,"type":"integer"},"csatAverage":{"type":["number","null"]},"csatCount":{"default":0,"type":"integer"}}},"TicketReport.jsonld-ticket_report.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"scope":{"default":"all","type":"string"},"brandId":{"type":["integer","null"]},"open":{"default":0,"type":"integer"},"byStatus":{"type":"object","additionalProperties":{"type":"integer"}},"byPriority":{"type":"object","additionalProperties":{"type":"integer"}},"slaAtRisk":{"default":0,"type":"integer"},"slaBreached":{"default":0,"type":"integer"},"csatAverage":{"type":["number","null"]},"csatCount":{"default":0,"type":"integer"}}}],"description":"Support-Kennzahlen für das SLA-/Support-Dashboard (04-04 §5). Aggregat-Read; filterbar über\n?brandId."},"TicketStatus-ticket_status.read":{"type":"object","description":"Ticket-Status als Daten (04-04 §3/AK11): konfigurierbar ohne Code. `stopsSlaClock` pausiert\ndie SLA-Uhr, `isResolved` erfüllt die Lösungsfrist.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","pending","waiting_customer","solved","closed"],"description":"open|pending|waiting_customer|solved|closed.","type":["string","null"]},"color":{"type":["string","null"]},"isResolved":{"type":["boolean","null"]},"stopsSlaClock":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"TicketStatus-ticket_status.update.jsonMergePatch":{"type":"object","description":"Ticket-Status als Daten (04-04 §3/AK11): konfigurierbar ohne Code. `stopsSlaClock` pausiert\ndie SLA-Uhr, `isResolved` erfüllt die Lösungsfrist.","properties":{"label":{"type":["string","null"]},"category":{"enum":["open","pending","waiting_customer","solved","closed"],"description":"open|pending|waiting_customer|solved|closed.","type":["string","null"]},"color":{"type":["string","null"]},"isResolved":{"type":["boolean","null"]},"stopsSlaClock":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"TicketStatus-ticket_status.write":{"type":"object","description":"Ticket-Status als Daten (04-04 §3/AK11): konfigurierbar ohne Code. `stopsSlaClock` pausiert\ndie SLA-Uhr, `isResolved` erfüllt die Lösungsfrist.","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","pending","waiting_customer","solved","closed"],"description":"open|pending|waiting_customer|solved|closed.","type":["string","null"]},"color":{"type":["string","null"]},"isResolved":{"type":["boolean","null"]},"stopsSlaClock":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}},"TicketStatus.jsonld-ticket_status.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["key","label"],"properties":{"key":{"type":["string","null"]},"label":{"type":["string","null"]},"category":{"enum":["open","pending","waiting_customer","solved","closed"],"description":"open|pending|waiting_customer|solved|closed.","type":["string","null"]},"color":{"type":["string","null"]},"isResolved":{"type":["boolean","null"]},"stopsSlaClock":{"type":["boolean","null"]},"sortOrder":{"type":["integer","null"]},"isDefault":{"type":["boolean","null"]},"active":{"type":["boolean","null"]}}}],"description":"Ticket-Status als Daten (04-04 §3/AK11): konfigurierbar ohne Code. `stopsSlaClock` pausiert\ndie SLA-Uhr, `isResolved` erfüllt die Lösungsfrist."},"TicketTeam-ticket_team.read":{"type":"object","description":"Support-Team (benannte Bearbeitergruppe) als Ziel für Ticket-Zuweisung und Mail-Routing.\n- Lesen: jeder mit Ticket-Sicht (Auswahl-Picker in Zuweisung/Mail-Regeln)\n- Verwalten: `tickets.team.manage`\n- `id` (numerisch, read-only) ist der Picker-Wert; `memberIds` = Member-Ids (Assignee-Raum).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, `identifier: false`) — Picker-Wert + `teamId`-Referenz.","type":["integer","null"]},"name":{"maxLength":100,"type":["string","null"]},"description":{"maxLength":500,"type":["string","null"]},"color":{"maxLength":9,"type":["string","null"]},"memberIds":{"description":"Mitglieder als Member-Ids (Assignee-Raum). Write = vollständiger Ersatz.","type":["array","null"],"items":{"type":"integer"}},"memberNames":{"description":"Aufgelöste Anzeigenamen der Mitglieder (read-only).","type":["array","null"],"items":{"type":"string"}},"leadId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}},"required":["name"]},"TicketTeam-ticket_team.write":{"type":"object","description":"Support-Team (benannte Bearbeitergruppe) als Ziel für Ticket-Zuweisung und Mail-Routing.\n- Lesen: jeder mit Ticket-Sicht (Auswahl-Picker in Zuweisung/Mail-Regeln)\n- Verwalten: `tickets.team.manage`\n- `id` (numerisch, read-only) ist der Picker-Wert; `memberIds` = Member-Ids (Assignee-Raum).","required":["name"],"properties":{"name":{"maxLength":100,"type":["string","null"]},"description":{"maxLength":500,"type":["string","null"]},"color":{"maxLength":9,"type":["string","null"]},"memberIds":{"description":"Mitglieder als Member-Ids (Assignee-Raum). Write = vollständiger Ersatz.","type":["array","null"],"items":{"type":"integer"}},"leadId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"TicketTeam-ticket_team.write.jsonMergePatch":{"type":"object","description":"Support-Team (benannte Bearbeitergruppe) als Ziel für Ticket-Zuweisung und Mail-Routing.\n- Lesen: jeder mit Ticket-Sicht (Auswahl-Picker in Zuweisung/Mail-Regeln)\n- Verwalten: `tickets.team.manage`\n- `id` (numerisch, read-only) ist der Picker-Wert; `memberIds` = Member-Ids (Assignee-Raum).","properties":{"name":{"maxLength":100,"type":["string","null"]},"description":{"maxLength":500,"type":["string","null"]},"color":{"maxLength":9,"type":["string","null"]},"memberIds":{"description":"Mitglieder als Member-Ids (Assignee-Raum). Write = vollständiger Ersatz.","type":["array","null"],"items":{"type":"integer"}},"leadId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}}},"TicketTeam.jsonld-ticket_team.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, `identifier: false`) — Picker-Wert + `teamId`-Referenz.","type":["integer","null"]},"name":{"maxLength":100,"type":["string","null"]},"description":{"maxLength":500,"type":["string","null"]},"color":{"maxLength":9,"type":["string","null"]},"memberIds":{"description":"Mitglieder als Member-Ids (Assignee-Raum). Write = vollständiger Ersatz.","type":["array","null"],"items":{"type":"integer"}},"memberNames":{"description":"Aufgelöste Anzeigenamen der Mitglieder (read-only).","type":["array","null"],"items":{"type":"string"}},"leadId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"active":{"type":["boolean","null"]}},"required":["name"]}],"description":"Support-Team (benannte Bearbeitergruppe) als Ziel für Ticket-Zuweisung und Mail-Routing.\n- Lesen: jeder mit Ticket-Sicht (Auswahl-Picker in Zuweisung/Mail-Regeln)\n- Verwalten: `tickets.team.manage`\n- `id` (numerisch, read-only) ist der Picker-Wert; `memberIds` = Member-Ids (Assignee-Raum)."},"TicketTriageCalibration-triage_calibration.read":{"type":"object","description":"KI-Triage-Kalibrierung als API-Aktion (`POST /v1/tickets/triage-calibrate` → Messwerte +\nalte/neue Schwelle) — API-Pendant zu `support:calibrate-triage` (P-1/P-3, Sauberkeits-Runde\n2026-07-16: Auto-Apply-Schwelle zuvor nur per CLI justierbar). Nutzt dieselbe Service-Logik\n({@see \\Octi\\Plugin\\Tickets\\Service\\TriageCalibrationService::recalibrate()}); ULID-Routen der\nTicket-Resource matchen `triage-calibrate` nicht (Format-Requirement).","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}},"TicketTriageCalibration-triage_calibration.write":{"type":"object","description":"KI-Triage-Kalibrierung als API-Aktion (`POST /v1/tickets/triage-calibrate` → Messwerte +\nalte/neue Schwelle) — API-Pendant zu `support:calibrate-triage` (P-1/P-3, Sauberkeits-Runde\n2026-07-16: Auto-Apply-Schwelle zuvor nur per CLI justierbar). Nutzt dieselbe Service-Logik\n({@see \\Octi\\Plugin\\Tickets\\Service\\TriageCalibrationService::recalibrate()}); ULID-Routen der\nTicket-Resource matchen `triage-calibrate` nicht (Format-Requirement).","properties":{"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Optionale Marken-Id (Default: System-Scope, alle Marken) — wie `support:calibrate-triage --brand`.","type":["integer","null"]}}},"TicketTriageCalibration.jsonld-triage_calibration.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Pseudo-Identifier (Aktions-Resource ohne Item-Routen).","type":["string","null"]}}}],"description":"KI-Triage-Kalibrierung als API-Aktion (`POST /v1/tickets/triage-calibrate` → Messwerte +\nalte/neue Schwelle) — API-Pendant zu `support:calibrate-triage` (P-1/P-3, Sauberkeits-Runde\n2026-07-16: Auto-Apply-Schwelle zuvor nur per CLI justierbar). Nutzt dieselbe Service-Logik\n({@see \\Octi\\Plugin\\Tickets\\Service\\TriageCalibrationService::recalibrate()}); ULID-Routen der\nTicket-Resource matchen `triage-calibrate` nicht (Format-Requirement)."},"TimeCalendarSuggestion-timeCalendarSuggestion.read":{"type":"object","description":"Kalender-Termine als Zeiterfassungs-Vorschläge (Doc 27 3.1/G17, awork „Termin übernehmen\") —\nread-only. Liefert die Termine der EIGENEN Kalender-Verknüpfungen für einen Tag; die Übernahme\nlegt daraus mit einem Klick einen Zeiteintrag an (Dauer + Titel vorbelegt, Work-Item-Zuordnung\nnachgelagert wie beim geparkten Timer).\n\nBewusst nur die eigenen Termine: Kalenderinhalte sind persönlich — es gibt keinen Fremd-Zugriff\nüber diese Fläche (kein `employeeId`-Filter).","properties":{"key":{"description":"Stabiler Zeilen-Schlüssel (externe Termin-ID + Beginn).","type":["string","null"]},"title":{"type":["string","null"]},"startAt":{"type":["string","null"]},"endAt":{"type":["string","null"]},"durationMinutes":{"description":"Dauer in Minuten — Vorbelegung des Zeiteintrags.","default":0,"type":"integer"},"allDay":{"default":false,"type":"boolean"}}},"TimeCalendarSuggestion.jsonld-timeCalendarSuggestion.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"description":"Stabiler Zeilen-Schlüssel (externe Termin-ID + Beginn).","type":["string","null"]},"title":{"type":["string","null"]},"startAt":{"type":["string","null"]},"endAt":{"type":["string","null"]},"durationMinutes":{"description":"Dauer in Minuten — Vorbelegung des Zeiteintrags.","default":0,"type":"integer"},"allDay":{"default":false,"type":"boolean"}}}],"description":"Kalender-Termine als Zeiterfassungs-Vorschläge (Doc 27 3.1/G17, awork „Termin übernehmen\") —\nread-only. Liefert die Termine der EIGENEN Kalender-Verknüpfungen für einen Tag; die Übernahme\nlegt daraus mit einem Klick einen Zeiteintrag an (Dauer + Titel vorbelegt, Work-Item-Zuordnung\nnachgelagert wie beim geparkten Timer).\n\nBewusst nur die eigenen Termine: Kalenderinhalte sind persönlich — es gibt keinen Fremd-Zugriff\nüber diese Fläche (kein `employeeId`-Filter)."},"TimeCategory-time_category.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":100,"default":"","type":"string"},"code":{"maxLength":50,"default":"","type":"string"},"defaultBillable":{"description":"null = erbt Projekttyp-Default; true/false = harte Überschreibung.","type":["boolean","null"]},"active":{"default":true,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"}},"required":["name","code"]},"TimeCategory-time_category.write":{"type":"object","required":["name","code"],"properties":{"name":{"maxLength":100,"default":"","type":"string"},"code":{"maxLength":50,"default":"","type":"string"},"defaultBillable":{"description":"null = erbt Projekttyp-Default; true/false = harte Überschreibung.","type":["boolean","null"]},"active":{"default":true,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"}}},"TimeCategory-time_category.write.jsonMergePatch":{"type":"object","properties":{"name":{"maxLength":100,"default":"","type":"string"},"code":{"maxLength":50,"default":"","type":"string"},"defaultBillable":{"description":"null = erbt Projekttyp-Default; true/false = harte Überschreibung.","type":["boolean","null"]},"active":{"default":true,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"}}},"TimeCategory.jsonld-time_category.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":100,"default":"","type":"string"},"code":{"maxLength":50,"default":"","type":"string"},"defaultBillable":{"description":"null = erbt Projekttyp-Default; true/false = harte Überschreibung.","type":["boolean","null"]},"active":{"default":true,"type":"boolean"},"sortOrder":{"default":0,"type":"integer"}},"required":["name","code"]}]},"TimeDayOverview-timeday.read":{"type":"object","description":"Tagesübersicht „My Day\" des angemeldeten Mitarbeiters (Doc 27 3.1/G17).\n\nLiefert Soll/Ist des Tages (Fortschrittsring) plus den Tages-Zeitstrahl: erfasste Zeiten und die\neigenen Kalender-Termine als Segmente in Minuten ab Mitternacht. Immer NUR die eigenen Daten —\nder Mitarbeiter kommt aus der Session, nie aus der Anfrage.","properties":{"date":{"type":["string","null"]},"targetMinutes":{"description":"Tages-Soll in Minuten aus der HR-Verfügbarkeit; null = kein belastbares Soll (kein HR/kein Mitarbeiter).","type":["integer","null"]},"bookedMinutes":{"description":"Erfasste Minuten des Tages.","default":0,"type":"integer"},"timerRunning":{"description":"Läuft gerade ein Timer? (Der Ring zeigt dann „in Arbeit\".)","default":false,"type":"boolean"},"segments":{"description":"Zeitstrahl-Segmente des Tages, sortiert nach Beginn.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}},"TimeDayOverview.jsonld-timeday.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"date":{"type":["string","null"]},"targetMinutes":{"description":"Tages-Soll in Minuten aus der HR-Verfügbarkeit; null = kein belastbares Soll (kein HR/kein Mitarbeiter).","type":["integer","null"]},"bookedMinutes":{"description":"Erfasste Minuten des Tages.","default":0,"type":"integer"},"timerRunning":{"description":"Läuft gerade ein Timer? (Der Ring zeigt dann „in Arbeit\".)","default":false,"type":"boolean"},"segments":{"description":"Zeitstrahl-Segmente des Tages, sortiert nach Beginn.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}}],"description":"Tagesübersicht „My Day\" des angemeldeten Mitarbeiters (Doc 27 3.1/G17).\n\nLiefert Soll/Ist des Tages (Fortschrittsring) plus den Tages-Zeitstrahl: erfasste Zeiten und die\neigenen Kalender-Termine als Segmente in Minuten ab Mitternacht. Immer NUR die eigenen Daten —\nder Mitarbeiter kommt aus der Session, nie aus der Anfrage."},"TimeEntry-time_entry.read":{"type":"object","description":"TimeEntry (04-03 §5/§8).\n- Dauer: durationMinutes ODER durationHours (S3-2); intern immer Minuten.\n- rateAmount/costRateAmount: read-only Snapshots.","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Optional beim Anlegen: Default ist der eingeloggte Mitarbeiter (create_own).","type":["integer","null"]},"workItemId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"workItemUlid":{"maxLength":26,"description":"- Schreiben: Alternative zu workItemId — Work-Item per ULID referenzieren, serverseitig aufgelöst.","type":["string","null"]},"workItemRef":{"description":"Read-only Anzeige-Referenz des Work-Items (z.B. TASK-123).","type":["string","null"]},"workItemTitle":{"description":"Read-only Titel des Work-Items für Listen/Detailanzeige.","type":["string","null"]},"projectId":{"type":["integer","null"]},"workDate":{"description":"Kalendertag (YYYY-MM-DD) in Mitarbeiter-TZ; Default heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"startedAt":{"type":["string","null"]},"endedAt":{"type":["string","null"]},"durationMinutes":{"minimum":0,"type":["integer","null"]},"billableMinutes":{"type":["integer","null"]},"billable":{"description":"null beim Anlegen → Default-Auflösung (Kategorie → Projekttyp → global).","type":["boolean","null"]},"categoryId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"categoryName":{"description":"Read-only Name der Tätigkeits-Kategorie; spart Konsumenten den Katalog-Nachschlag.","type":["string","null"]},"status":{"type":["string","null"]},"description":{"maxLength":5000,"type":["string","null"]},"rateAmount":{"description":"Snapshot Verkaufssatz pro Stunde in Cent (read-only).","type":["integer","null"]},"costRateAmount":{"description":"Snapshot interner Kostensatz pro Stunde in Cent (read-only).","type":["integer","null"]},"source":{"type":["string","null"]},"invoiceItemId":{"type":["integer","null"]},"reversalOfId":{"type":["integer","null"]},"reversedByUlid":{"description":"ULID der aktiven Storno-Gegenbuchung zu DIESEM Eintrag (read-only, abgeleitet).","type":["string","null"]}}},"TimeEntry-time_entry.write":{"type":"object","description":"TimeEntry (04-03 §5/§8).\n- Dauer: durationMinutes ODER durationHours (S3-2); intern immer Minuten.\n- rateAmount/costRateAmount: read-only Snapshots.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Optional beim Anlegen: Default ist der eingeloggte Mitarbeiter (create_own).","type":["integer","null"]},"workItemId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"workItemUlid":{"maxLength":26,"description":"- Schreiben: Alternative zu workItemId — Work-Item per ULID referenzieren, serverseitig aufgelöst.","type":["string","null"]},"workDate":{"description":"Kalendertag (YYYY-MM-DD) in Mitarbeiter-TZ; Default heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"durationMinutes":{"minimum":0,"type":["integer","null"]},"durationHours":{"minimum":0,"description":"Eingabe-Alternative in Dezimalstunden (1,25 = 75 min); intern Minuten.","type":["number","null"]},"billable":{"description":"null beim Anlegen → Default-Auflösung (Kategorie → Projekttyp → global).","type":["boolean","null"]},"categoryId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"description":{"maxLength":5000,"type":["string","null"]},"rejectNote":{"maxLength":5000,"description":"Begründung für /reject (Z3); write-only, fließt ins TimesheetRejected-Event.","type":["string","null"]}}},"TimeEntry-time_entry.write.jsonMergePatch":{"type":"object","description":"TimeEntry (04-03 §5/§8).\n- Dauer: durationMinutes ODER durationHours (S3-2); intern immer Minuten.\n- rateAmount/costRateAmount: read-only Snapshots.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Optional beim Anlegen: Default ist der eingeloggte Mitarbeiter (create_own).","type":["integer","null"]},"workItemId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"workItemUlid":{"maxLength":26,"description":"- Schreiben: Alternative zu workItemId — Work-Item per ULID referenzieren, serverseitig aufgelöst.","type":["string","null"]},"workDate":{"description":"Kalendertag (YYYY-MM-DD) in Mitarbeiter-TZ; Default heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"durationMinutes":{"minimum":0,"type":["integer","null"]},"durationHours":{"minimum":0,"description":"Eingabe-Alternative in Dezimalstunden (1,25 = 75 min); intern Minuten.","type":["number","null"]},"billable":{"description":"null beim Anlegen → Default-Auflösung (Kategorie → Projekttyp → global).","type":["boolean","null"]},"categoryId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"description":{"maxLength":5000,"type":["string","null"]},"rejectNote":{"maxLength":5000,"description":"Begründung für /reject (Z3); write-only, fließt ins TimesheetRejected-Event.","type":["string","null"]}}},"TimeEntry.jsonld-time_entry.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"description":"Optional beim Anlegen: Default ist der eingeloggte Mitarbeiter (create_own).","type":["integer","null"]},"workItemId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"workItemUlid":{"maxLength":26,"description":"- Schreiben: Alternative zu workItemId — Work-Item per ULID referenzieren, serverseitig aufgelöst.","type":["string","null"]},"workItemRef":{"description":"Read-only Anzeige-Referenz des Work-Items (z.B. TASK-123).","type":["string","null"]},"workItemTitle":{"description":"Read-only Titel des Work-Items für Listen/Detailanzeige.","type":["string","null"]},"projectId":{"type":["integer","null"]},"workDate":{"description":"Kalendertag (YYYY-MM-DD) in Mitarbeiter-TZ; Default heute.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"startedAt":{"type":["string","null"]},"endedAt":{"type":["string","null"]},"durationMinutes":{"minimum":0,"type":["integer","null"]},"billableMinutes":{"type":["integer","null"]},"billable":{"description":"null beim Anlegen → Default-Auflösung (Kategorie → Projekttyp → global).","type":["boolean","null"]},"categoryId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"categoryName":{"description":"Read-only Name der Tätigkeits-Kategorie; spart Konsumenten den Katalog-Nachschlag.","type":["string","null"]},"status":{"type":["string","null"]},"description":{"maxLength":5000,"type":["string","null"]},"rateAmount":{"description":"Snapshot Verkaufssatz pro Stunde in Cent (read-only).","type":["integer","null"]},"costRateAmount":{"description":"Snapshot interner Kostensatz pro Stunde in Cent (read-only).","type":["integer","null"]},"source":{"type":["string","null"]},"invoiceItemId":{"type":["integer","null"]},"reversalOfId":{"type":["integer","null"]},"reversedByUlid":{"description":"ULID der aktiven Storno-Gegenbuchung zu DIESEM Eintrag (read-only, abgeleitet).","type":["string","null"]}}}],"description":"TimeEntry (04-03 §5/§8).\n- Dauer: durationMinutes ODER durationHours (S3-2); intern immer Minuten.\n- rateAmount/costRateAmount: read-only Snapshots."},"TimeReport-time_report.read":{"type":"object","description":"TimeReport (04-03 §4.4): erfasst/abrechenbar/fakturiert + Quote.\n- Filter: from/to/brandId/customerId/projectId/employeeId.\n- groupBy: project|customer|employee|brand|none.","properties":{"id":{"default":"all","type":"string"},"groupBy":{"default":"none","type":"string"},"groupId":{"type":["integer","null"]},"loggedMinutes":{"default":0,"type":"integer"},"billableMinutes":{"default":0,"type":"integer"},"invoicedMinutes":{"default":0,"type":"integer"},"billingQuotaPercent":{"description":"Abrechnungsquote in Prozent (fakturiert ÷ abrechenbar; Ziel > 95 %).","type":["number","null"]}}},"TimeReport.jsonld-time_report.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"default":"all","type":"string"},"groupBy":{"default":"none","type":"string"},"groupId":{"type":["integer","null"]},"loggedMinutes":{"default":0,"type":"integer"},"billableMinutes":{"default":0,"type":"integer"},"invoicedMinutes":{"default":0,"type":"integer"},"billingQuotaPercent":{"description":"Abrechnungsquote in Prozent (fakturiert ÷ abrechenbar; Ziel > 95 %).","type":["number","null"]}}}],"description":"TimeReport (04-03 §4.4): erfasst/abrechenbar/fakturiert + Quote.\n- Filter: from/to/brandId/customerId/projectId/employeeId.\n- groupBy: project|customer|employee|brand|none."},"TimeReportDefinition-timeReportDefinition.read":{"type":"object","description":"Gespeicherter Zeitreport (Doc 27 3.3/G19): wiederverwendbare Report-Definition mit relativem oder\nabsolutem Zeitfenster, Datenfiltern, Gruppierung, Rundung und Spaltenwahl; privat oder geteilt.\n\nAusführung über die `run`-Aktion — sie löst das relative Fenster gegen „heute\" auf und liefert die\ngerundeten Report-Zeilen (Rundung wirkt nur auf die Ausgabe, nie auf die erfassten Roh-Zeiten).","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"visibility":{"enum":["private","shared"],"description":"private = nur Ersteller; shared = alle Leser mit `time.report.view` im Marken-Scope.","default":"private","type":"string"},"relativePeriod":{"enum":["this_week","last_week","this_month","last_month","this_quarter","this_year","last_7_days","last_30_days","last_90_days"],"description":"Relativer Zeitfilter (z.B. `last_week`) — hat Vorrang vor dateFrom/dateTo.","type":["string","null"]},"dateFrom":{"type":["string","null"]},"dateTo":{"type":["string","null"]},"groupBy":{"enum":["none","project","customer","employee","brand"],"default":"none","type":"string"},"roundingIncrement":{"enum":[0,1,5,6,10,15,30,60],"description":"Rundungsschritt in Minuten (awork: 15/30/60; 0/1 = keine Rundung).","default":1,"type":"integer"},"roundingMode":{"enum":["none","up","down","nearest"],"default":"none","type":"string"},"filters":{"description":"Datenfilter (customerId/projectId/employeeId/categoryId/billable/…).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}},"columns":{"description":"Spaltenauswahl (leer = alle).","type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"createdBy":{"type":["string","null"]},"resolvedFrom":{"description":"Nur bei `run`: das aufgelöste Fenster + die gerundeten Zeilen.","type":["string","null"]},"resolvedTo":{"type":["string","null"]},"rows":{"description":"Report-Zeilen der `run`-Aktion: {groupId, groupLabel, loggedMinutes, billableMinutes,\ninvoicedMinutes, roundedMinutes, billingQuotaPercent}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["name"]},"TimeReportDefinition-timeReportDefinition.write":{"type":"object","description":"Gespeicherter Zeitreport (Doc 27 3.3/G19): wiederverwendbare Report-Definition mit relativem oder\nabsolutem Zeitfenster, Datenfiltern, Gruppierung, Rundung und Spaltenwahl; privat oder geteilt.\n\nAusführung über die `run`-Aktion — sie löst das relative Fenster gegen „heute\" auf und liefert die\ngerundeten Report-Zeilen (Rundung wirkt nur auf die Ausgabe, nie auf die erfassten Roh-Zeiten).","required":["name"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"visibility":{"enum":["private","shared"],"description":"private = nur Ersteller; shared = alle Leser mit `time.report.view` im Marken-Scope.","default":"private","type":"string"},"relativePeriod":{"enum":["this_week","last_week","this_month","last_month","this_quarter","this_year","last_7_days","last_30_days","last_90_days"],"description":"Relativer Zeitfilter (z.B. `last_week`) — hat Vorrang vor dateFrom/dateTo.","type":["string","null"]},"dateFrom":{"type":["string","null"]},"dateTo":{"type":["string","null"]},"groupBy":{"enum":["none","project","customer","employee","brand"],"default":"none","type":"string"},"roundingIncrement":{"enum":[0,1,5,6,10,15,30,60],"description":"Rundungsschritt in Minuten (awork: 15/30/60; 0/1 = keine Rundung).","default":1,"type":"integer"},"roundingMode":{"enum":["none","up","down","nearest"],"default":"none","type":"string"},"filters":{"description":"Datenfilter (customerId/projectId/employeeId/categoryId/billable/…).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}},"columns":{"description":"Spaltenauswahl (leer = alle).","type":["array","null"],"items":{"type":"string"}}}},"TimeReportDefinition-timeReportDefinition.write.jsonMergePatch":{"type":"object","description":"Gespeicherter Zeitreport (Doc 27 3.3/G19): wiederverwendbare Report-Definition mit relativem oder\nabsolutem Zeitfenster, Datenfiltern, Gruppierung, Rundung und Spaltenwahl; privat oder geteilt.\n\nAusführung über die `run`-Aktion — sie löst das relative Fenster gegen „heute\" auf und liefert die\ngerundeten Report-Zeilen (Rundung wirkt nur auf die Ausgabe, nie auf die erfassten Roh-Zeiten).","properties":{"name":{"maxLength":255,"default":"","type":"string"},"visibility":{"enum":["private","shared"],"description":"private = nur Ersteller; shared = alle Leser mit `time.report.view` im Marken-Scope.","default":"private","type":"string"},"relativePeriod":{"enum":["this_week","last_week","this_month","last_month","this_quarter","this_year","last_7_days","last_30_days","last_90_days"],"description":"Relativer Zeitfilter (z.B. `last_week`) — hat Vorrang vor dateFrom/dateTo.","type":["string","null"]},"dateFrom":{"type":["string","null"]},"dateTo":{"type":["string","null"]},"groupBy":{"enum":["none","project","customer","employee","brand"],"default":"none","type":"string"},"roundingIncrement":{"enum":[0,1,5,6,10,15,30,60],"description":"Rundungsschritt in Minuten (awork: 15/30/60; 0/1 = keine Rundung).","default":1,"type":"integer"},"roundingMode":{"enum":["none","up","down","nearest"],"default":"none","type":"string"},"filters":{"description":"Datenfilter (customerId/projectId/employeeId/categoryId/billable/…).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}},"columns":{"description":"Spaltenauswahl (leer = alle).","type":["array","null"],"items":{"type":"string"}}}},"TimeReportDefinition.jsonld-timeReportDefinition.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"visibility":{"enum":["private","shared"],"description":"private = nur Ersteller; shared = alle Leser mit `time.report.view` im Marken-Scope.","default":"private","type":"string"},"relativePeriod":{"enum":["this_week","last_week","this_month","last_month","this_quarter","this_year","last_7_days","last_30_days","last_90_days"],"description":"Relativer Zeitfilter (z.B. `last_week`) — hat Vorrang vor dateFrom/dateTo.","type":["string","null"]},"dateFrom":{"type":["string","null"]},"dateTo":{"type":["string","null"]},"groupBy":{"enum":["none","project","customer","employee","brand"],"default":"none","type":"string"},"roundingIncrement":{"enum":[0,1,5,6,10,15,30,60],"description":"Rundungsschritt in Minuten (awork: 15/30/60; 0/1 = keine Rundung).","default":1,"type":"integer"},"roundingMode":{"enum":["none","up","down","nearest"],"default":"none","type":"string"},"filters":{"description":"Datenfilter (customerId/projectId/employeeId/categoryId/billable/…).","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"null"}]}},"columns":{"description":"Spaltenauswahl (leer = alle).","type":["array","null"],"items":{"type":"string"}},"brandId":{"type":["integer","null"]},"createdBy":{"type":["string","null"]},"resolvedFrom":{"description":"Nur bei `run`: das aufgelöste Fenster + die gerundeten Zeilen.","type":["string","null"]},"resolvedTo":{"type":["string","null"]},"rows":{"description":"Report-Zeilen der `run`-Aktion: {groupId, groupLabel, loggedMinutes, billableMinutes,\ninvoicedMinutes, roundedMinutes, billingQuotaPercent}.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["name"]}],"description":"Gespeicherter Zeitreport (Doc 27 3.3/G19): wiederverwendbare Report-Definition mit relativem oder\nabsolutem Zeitfenster, Datenfiltern, Gruppierung, Rundung und Spaltenwahl; privat oder geteilt.\n\nAusführung über die `run`-Aktion — sie löst das relative Fenster gegen „heute\" auf und liefert die\ngerundeten Report-Zeilen (Rundung wirkt nur auf die Ausgabe, nie auf die erfassten Roh-Zeiten)."},"TimeRoundingRule-time_rounding.read":{"type":"object","description":"TimeRoundingRule (04-03 §6.2, Z1).\n- Bindung: projectId ODER contractId (Modul 05) ODER global (beide null).\n- Auflösung Projekt → Vertrag → Default: {@see \\Octi\\Plugin\\Time\\Service\\RoundingRuleResolver}.","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"description":"Projektgebundene Regel; null = vertragsgebunden oder globaler Default.","type":["integer","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"description":"Vertragsgebundene Regel (Modul 05); null = projektgebunden oder globaler Default.","type":["integer","null"]},"increment":{"minimum":0,"exclusiveMinimum":0,"maximum":480,"description":"Rundungsschritt in Minuten (<= 1 = keine Rundung).","default":1,"type":"integer"},"mode":{"enum":["none","up","down","nearest"],"description":"none|up|down|nearest.","default":"nearest","type":"string"},"active":{"default":true,"type":"boolean"}}},"TimeRoundingRule-time_rounding.write":{"type":"object","description":"TimeRoundingRule (04-03 §6.2, Z1).\n- Bindung: projectId ODER contractId (Modul 05) ODER global (beide null).\n- Auflösung Projekt → Vertrag → Default: {@see \\Octi\\Plugin\\Time\\Service\\RoundingRuleResolver}.","properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"description":"Projektgebundene Regel; null = vertragsgebunden oder globaler Default.","type":["integer","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"description":"Vertragsgebundene Regel (Modul 05); null = projektgebunden oder globaler Default.","type":["integer","null"]},"increment":{"minimum":0,"exclusiveMinimum":0,"maximum":480,"description":"Rundungsschritt in Minuten (<= 1 = keine Rundung).","default":1,"type":"integer"},"mode":{"enum":["none","up","down","nearest"],"description":"none|up|down|nearest.","default":"nearest","type":"string"},"active":{"default":true,"type":"boolean"}}},"TimeRoundingRule-time_rounding.write.jsonMergePatch":{"type":"object","description":"TimeRoundingRule (04-03 §6.2, Z1).\n- Bindung: projectId ODER contractId (Modul 05) ODER global (beide null).\n- Auflösung Projekt → Vertrag → Default: {@see \\Octi\\Plugin\\Time\\Service\\RoundingRuleResolver}.","properties":{"projectId":{"minimum":0,"exclusiveMinimum":0,"description":"Projektgebundene Regel; null = vertragsgebunden oder globaler Default.","type":["integer","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"description":"Vertragsgebundene Regel (Modul 05); null = projektgebunden oder globaler Default.","type":["integer","null"]},"increment":{"minimum":0,"exclusiveMinimum":0,"maximum":480,"description":"Rundungsschritt in Minuten (<= 1 = keine Rundung).","default":1,"type":"integer"},"mode":{"enum":["none","up","down","nearest"],"description":"none|up|down|nearest.","default":"nearest","type":"string"},"active":{"default":true,"type":"boolean"}}},"TimeRoundingRule.jsonld-time_rounding.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"description":"Projektgebundene Regel; null = vertragsgebunden oder globaler Default.","type":["integer","null"]},"contractId":{"minimum":0,"exclusiveMinimum":0,"description":"Vertragsgebundene Regel (Modul 05); null = projektgebunden oder globaler Default.","type":["integer","null"]},"increment":{"minimum":0,"exclusiveMinimum":0,"maximum":480,"description":"Rundungsschritt in Minuten (<= 1 = keine Rundung).","default":1,"type":"integer"},"mode":{"enum":["none","up","down","nearest"],"description":"none|up|down|nearest.","default":"nearest","type":"string"},"active":{"default":true,"type":"boolean"}}}],"description":"TimeRoundingRule (04-03 §6.2, Z1).\n- Bindung: projectId ODER contractId (Modul 05) ODER global (beide null).\n- Auflösung Projekt → Vertrag → Default: {@see \\Octi\\Plugin\\Time\\Service\\RoundingRuleResolver}."},"TimeWorkItemOption-time_work_item_option.read":{"type":"object","description":"Schlanke Work-Item-Auswahl für die Zeit-Schnellbuchung (Picker, inkl. numerischer id).\nSuche über q (Titel/Referenz); Recht = Zeit-Buchungsrecht.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische Work-Item-Id (read-only) für die direkte Buchungs-Referenz.","type":["integer","null"]},"ref":{"type":["string","null"]},"kind":{"type":["string","null"]},"title":{"type":["string","null"]},"projectId":{"type":["integer","null"]}}},"TimeWorkItemOption.jsonld-time_work_item_option.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Numerische Work-Item-Id (read-only) für die direkte Buchungs-Referenz.","type":["integer","null"]},"ref":{"type":["string","null"]},"kind":{"type":["string","null"]},"title":{"type":["string","null"]},"projectId":{"type":["integer","null"]}}}],"description":"Schlanke Work-Item-Auswahl für die Zeit-Schnellbuchung (Picker, inkl. numerischer id).\nSuche über q (Titel/Referenz); Recht = Zeit-Buchungsrecht."},"Timer-timer.read":{"type":"object","description":"Timer (04-03 §4.1/§5, S3-4/S3-5/S3-6).\n- Mehrere parallele, server-persistente Timer je Mitarbeiter; action: pause/resume/stop.\n- Stop erzeugt TimeEntry, ulid in createdEntryUlid.","properties":{"ulid":{"type":["string","null"]},"employeeId":{"description":"Optional beim Start: Default ist der eingeloggte Mitarbeiter.","type":["integer","null"]},"workItemId":{"minimum":0,"exclusiveMinimum":0,"description":"Optional: ohne WorkItem startet ein geparkter Timer; Zuordnung jederzeit per PATCH.","type":["integer","null"]},"needsAssignment":{"description":"Read-only: true, solange dem Timer kein WorkItem zugeordnet ist (nicht buchbar).","default":false,"type":"boolean"},"categoryId":{"type":["integer","null"]},"description":{"maxLength":1000,"type":["string","null"]},"startedAt":{"type":["string","null"]},"isPaused":{"default":false,"type":"boolean"},"accumulatedSeconds":{"default":0,"type":"integer"},"elapsedSeconds":{"default":0,"type":"integer"},"createdEntryUlid":{"description":"ulid der beim Stop erzeugten TimeEntry.","type":["string","null"]},"workItemStatusId":{"description":"Read-only, NUR in der Antwort des Starts (POST) gefuellt: Status des Work-Items NACH dem Start —\ndie Aufgabe kann in ihren Timer-Folgestatus gesprungen sein (Katalog-Regel, Owner 2026-08-25).","type":["string","null"]}}},"Timer-timer.write":{"type":"object","description":"Timer (04-03 §4.1/§5, S3-4/S3-5/S3-6).\n- Mehrere parallele, server-persistente Timer je Mitarbeiter; action: pause/resume/stop.\n- Stop erzeugt TimeEntry, ulid in createdEntryUlid.","properties":{"employeeId":{"description":"Optional beim Start: Default ist der eingeloggte Mitarbeiter.","type":["integer","null"]},"workItemId":{"minimum":0,"exclusiveMinimum":0,"description":"Optional: ohne WorkItem startet ein geparkter Timer; Zuordnung jederzeit per PATCH.","type":["integer","null"]},"categoryId":{"type":["integer","null"]},"description":{"maxLength":1000,"type":["string","null"]},"action":{"enum":["pause","resume","stop"],"description":"Steuerbefehl bei PATCH: pause|resume|stop.","type":["string","null"]}}},"Timer-timer.write.jsonMergePatch":{"type":"object","description":"Timer (04-03 §4.1/§5, S3-4/S3-5/S3-6).\n- Mehrere parallele, server-persistente Timer je Mitarbeiter; action: pause/resume/stop.\n- Stop erzeugt TimeEntry, ulid in createdEntryUlid.","properties":{"employeeId":{"description":"Optional beim Start: Default ist der eingeloggte Mitarbeiter.","type":["integer","null"]},"workItemId":{"minimum":0,"exclusiveMinimum":0,"description":"Optional: ohne WorkItem startet ein geparkter Timer; Zuordnung jederzeit per PATCH.","type":["integer","null"]},"categoryId":{"type":["integer","null"]},"description":{"maxLength":1000,"type":["string","null"]},"action":{"enum":["pause","resume","stop"],"description":"Steuerbefehl bei PATCH: pause|resume|stop.","type":["string","null"]}}},"Timer.jsonld-timer.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"description":"Optional beim Start: Default ist der eingeloggte Mitarbeiter.","type":["integer","null"]},"workItemId":{"minimum":0,"exclusiveMinimum":0,"description":"Optional: ohne WorkItem startet ein geparkter Timer; Zuordnung jederzeit per PATCH.","type":["integer","null"]},"needsAssignment":{"description":"Read-only: true, solange dem Timer kein WorkItem zugeordnet ist (nicht buchbar).","default":false,"type":"boolean"},"categoryId":{"type":["integer","null"]},"description":{"maxLength":1000,"type":["string","null"]},"startedAt":{"type":["string","null"]},"isPaused":{"default":false,"type":"boolean"},"accumulatedSeconds":{"default":0,"type":"integer"},"elapsedSeconds":{"default":0,"type":"integer"},"createdEntryUlid":{"description":"ulid der beim Stop erzeugten TimeEntry.","type":["string","null"]},"workItemStatusId":{"description":"Read-only, NUR in der Antwort des Starts (POST) gefuellt: Status des Work-Items NACH dem Start —\ndie Aufgabe kann in ihren Timer-Folgestatus gesprungen sein (Katalog-Regel, Owner 2026-08-25).","type":["string","null"]}}}],"description":"Timer (04-03 §4.1/§5, S3-4/S3-5/S3-6).\n- Mehrere parallele, server-persistente Timer je Mitarbeiter; action: pause/resume/stop.\n- Stop erzeugt TimeEntry, ulid in createdEntryUlid."},"Timesheet-timesheet.read":{"type":"object","description":"Timesheet-Genehmigung (04-03 §4.3/§5, Z2/Z3).\n- POST: Wochen-Einreichung (weekDate → Kalenderwoche).\n- PATCH action: approve/reject/reopen (PM-Genehmigungs-Inbox).","properties":{"ulid":{"type":["string","null"]},"employeeId":{"description":"Optional beim Einreichen: Default ist der eingeloggte Mitarbeiter.","type":["integer","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"status":{"type":["string","null"]},"approverId":{"type":["integer","null"]},"decidedAt":{"type":["string","null"]},"note":{"type":["string","null"]},"entryCount":{"default":0,"type":"integer"},"totalMinutes":{"default":0,"type":"integer"}}},"Timesheet-timesheet.write":{"type":"object","description":"Timesheet-Genehmigung (04-03 §4.3/§5, Z2/Z3).\n- POST: Wochen-Einreichung (weekDate → Kalenderwoche).\n- PATCH action: approve/reject/reopen (PM-Genehmigungs-Inbox).","properties":{"employeeId":{"description":"Optional beim Einreichen: Default ist der eingeloggte Mitarbeiter.","type":["integer","null"]},"weekDate":{"description":"Beliebiges Datum (YYYY-MM-DD) der einzureichenden Woche.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"note":{"type":["string","null"]},"action":{"enum":["approve","reject","reopen"],"description":"Steuerbefehl bei PATCH: approve|reject|reopen.","type":["string","null"]}}},"Timesheet-timesheet.write.jsonMergePatch":{"type":"object","description":"Timesheet-Genehmigung (04-03 §4.3/§5, Z2/Z3).\n- POST: Wochen-Einreichung (weekDate → Kalenderwoche).\n- PATCH action: approve/reject/reopen (PM-Genehmigungs-Inbox).","properties":{"employeeId":{"description":"Optional beim Einreichen: Default ist der eingeloggte Mitarbeiter.","type":["integer","null"]},"weekDate":{"description":"Beliebiges Datum (YYYY-MM-DD) der einzureichenden Woche.","externalDocs":{"url":"https://schema.org/Date"},"type":["string","null"]},"note":{"type":["string","null"]},"action":{"enum":["approve","reject","reopen"],"description":"Steuerbefehl bei PATCH: approve|reject|reopen.","type":["string","null"]}}},"Timesheet.jsonld-timesheet.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"employeeId":{"description":"Optional beim Einreichen: Default ist der eingeloggte Mitarbeiter.","type":["integer","null"]},"periodStart":{"type":["string","null"]},"periodEnd":{"type":["string","null"]},"status":{"type":["string","null"]},"approverId":{"type":["integer","null"]},"decidedAt":{"type":["string","null"]},"note":{"type":["string","null"]},"entryCount":{"default":0,"type":"integer"},"totalMinutes":{"default":0,"type":"integer"}}}],"description":"Timesheet-Genehmigung (04-03 §4.3/§5, Z2/Z3).\n- POST: Wochen-Einreichung (weekDate → Kalenderwoche).\n- PATCH action: approve/reject/reopen (PM-Genehmigungs-Inbox)."},"TrashItem":{"type":"object","description":"Papierkorb-Eintrag (Doc 26 5.6): gelöschter Datensatz der letzten 30 Tage. `GET /v1/trash` listet\nmarkenscharf + permission-gefiltert; `POST /v1/trash/{entityType}/{ulid}/restore` stellt wieder her.\nDie Zugriffskontrolle je Typ liegt im {@see \\App\\Platform\\Trash\\Service\\TrashService}.","properties":{"ulid":{"type":["string","null"]},"entityType":{"default":"","type":"string"},"typeLabel":{"type":["string","null"]},"title":{"type":["string","null"]},"subtitle":{"type":["string","null"]},"deletedAt":{"type":["string","null"],"format":"date-time"},"deletedBy":{"type":["string","null"]},"restored":{"description":"Nur in der Restore-Antwort gesetzt.","default":false,"type":"boolean"}}},"TrashItem-trash.read":{"type":"object","description":"Papierkorb-Eintrag (Doc 26 5.6): gelöschter Datensatz der letzten 30 Tage. `GET /v1/trash` listet\nmarkenscharf + permission-gefiltert; `POST /v1/trash/{entityType}/{ulid}/restore` stellt wieder her.\nDie Zugriffskontrolle je Typ liegt im {@see \\App\\Platform\\Trash\\Service\\TrashService}.","properties":{"ulid":{"type":["string","null"]},"entityType":{"default":"","type":"string"},"typeLabel":{"type":["string","null"]},"title":{"type":["string","null"]},"subtitle":{"type":["string","null"]},"deletedAt":{"type":["string","null"],"format":"date-time"},"deletedBy":{"type":["string","null"]},"restored":{"description":"Nur in der Restore-Antwort gesetzt.","default":false,"type":"boolean"}}},"TrashItem.jsonld-trash.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"entityType":{"default":"","type":"string"},"typeLabel":{"type":["string","null"]},"title":{"type":["string","null"]},"subtitle":{"type":["string","null"]},"deletedAt":{"type":["string","null"],"format":"date-time"},"deletedBy":{"type":["string","null"]},"restored":{"description":"Nur in der Restore-Antwort gesetzt.","default":false,"type":"boolean"}}}],"description":"Papierkorb-Eintrag (Doc 26 5.6): gelöschter Datensatz der letzten 30 Tage. `GET /v1/trash` listet\nmarkenscharf + permission-gefiltert; `POST /v1/trash/{entityType}/{ulid}/restore` stellt wieder her.\nDie Zugriffskontrolle je Typ liegt im {@see \\App\\Platform\\Trash\\Service\\TrashService}."},"UnitConversion-uom_conversion.read":{"type":"object","description":"Freie Umrechnungstabelle (04-30 §3/G4).\n- global (productId null) oder je Artikel, auch dimensionsübergreifend (\"1 stk = 250 g\").\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen.\n- Duplikat-Guard (from/to/product) im Processor → 409, da nullable product_id kein DB-Unique erlaubt.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"fromUnit":{"maxLength":20,"description":"Einheiten-Code der Quell-Einheit.","type":["string","null"]},"toUnit":{"maxLength":20,"description":"Einheiten-Code der Ziel-Einheit.","type":["string","null"]},"factor":{"description":"1 fromUnit = factor toUnit (decimal-String, > 0).","type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Artikelspezifisch (auch dimensionsübergreifend); weglassen = global.","type":["integer","null"]}}},"UnitConversion-uom_conversion.write":{"type":"object","description":"Freie Umrechnungstabelle (04-30 §3/G4).\n- global (productId null) oder je Artikel, auch dimensionsübergreifend (\"1 stk = 250 g\").\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen.\n- Duplikat-Guard (from/to/product) im Processor → 409, da nullable product_id kein DB-Unique erlaubt.","properties":{"fromUnit":{"maxLength":20,"description":"Einheiten-Code der Quell-Einheit.","type":["string","null"]},"toUnit":{"maxLength":20,"description":"Einheiten-Code der Ziel-Einheit.","type":["string","null"]},"factor":{"description":"1 fromUnit = factor toUnit (decimal-String, > 0).","type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Artikelspezifisch (auch dimensionsübergreifend); weglassen = global.","type":["integer","null"]}}},"UnitConversion-uom_conversion.write.jsonMergePatch":{"type":"object","description":"Freie Umrechnungstabelle (04-30 §3/G4).\n- global (productId null) oder je Artikel, auch dimensionsübergreifend (\"1 stk = 250 g\").\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen.\n- Duplikat-Guard (from/to/product) im Processor → 409, da nullable product_id kein DB-Unique erlaubt.","properties":{"fromUnit":{"maxLength":20,"description":"Einheiten-Code der Quell-Einheit.","type":["string","null"]},"toUnit":{"maxLength":20,"description":"Einheiten-Code der Ziel-Einheit.","type":["string","null"]},"factor":{"description":"1 fromUnit = factor toUnit (decimal-String, > 0).","type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Artikelspezifisch (auch dimensionsübergreifend); weglassen = global.","type":["integer","null"]}}},"UnitConversion.jsonld-uom_conversion.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only).","type":["integer","null"]},"fromUnit":{"maxLength":20,"description":"Einheiten-Code der Quell-Einheit.","type":["string","null"]},"toUnit":{"maxLength":20,"description":"Einheiten-Code der Ziel-Einheit.","type":["string","null"]},"factor":{"description":"1 fromUnit = factor toUnit (decimal-String, > 0).","type":["string","null"]},"productId":{"minimum":0,"exclusiveMinimum":0,"description":"Artikelspezifisch (auch dimensionsübergreifend); weglassen = global.","type":["integer","null"]}}}],"description":"Freie Umrechnungstabelle (04-30 §3/G4).\n- global (productId null) oder je Artikel, auch dimensionsübergreifend (\"1 stk = 250 g\").\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen.\n- Duplikat-Guard (from/to/product) im Processor → 409, da nullable product_id kein DB-Unique erlaubt."},"UnitOfMeasure-uom_unit.read":{"type":"object","description":"Mengeneinheiten-Stamm (04-30 §3/§7).\n- Dimension, Basisfaktor, Nachkommastellen; markenübergreifend (kein Brand-Scope).\n- Schlüssel = code (Muster SalesOrderStatus).\n- DELETE hart, aber 409 solange in Umrechnungstabelle referenziert.","required":["code"],"properties":{"code":{"maxLength":20,"type":["string","null"]},"ulid":{"type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"dimension":{"enum":["count","weight","volume","length","area","time"],"description":"count|weight|volume|length|area|time (Dimensionsschutz, 04-30 §6).","type":["string","null"]},"factorToBase":{"description":"Faktor auf die Basis-Einheit der Dimension (decimal-String, z. B. '0.001').","type":["string","null"]},"decimals":{"minimum":0,"maximum":6,"description":"Nachkommastellen für Eingabe/Anzeige (Stück 0, kg/l 3).","type":["integer","null"]},"active":{"type":["boolean","null"]}}},"UnitOfMeasure-uom_unit.write":{"type":"object","description":"Mengeneinheiten-Stamm (04-30 §3/§7).\n- Dimension, Basisfaktor, Nachkommastellen; markenübergreifend (kein Brand-Scope).\n- Schlüssel = code (Muster SalesOrderStatus).\n- DELETE hart, aber 409 solange in Umrechnungstabelle referenziert.","required":["code"],"properties":{"code":{"maxLength":20,"type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"dimension":{"enum":["count","weight","volume","length","area","time"],"description":"count|weight|volume|length|area|time (Dimensionsschutz, 04-30 §6).","type":["string","null"]},"factorToBase":{"description":"Faktor auf die Basis-Einheit der Dimension (decimal-String, z. B. '0.001').","type":["string","null"]},"decimals":{"minimum":0,"maximum":6,"description":"Nachkommastellen für Eingabe/Anzeige (Stück 0, kg/l 3).","type":["integer","null"]},"active":{"type":["boolean","null"]}}},"UnitOfMeasure-uom_unit.write.jsonMergePatch":{"type":"object","description":"Mengeneinheiten-Stamm (04-30 §3/§7).\n- Dimension, Basisfaktor, Nachkommastellen; markenübergreifend (kein Brand-Scope).\n- Schlüssel = code (Muster SalesOrderStatus).\n- DELETE hart, aber 409 solange in Umrechnungstabelle referenziert.","properties":{"code":{"maxLength":20,"type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"dimension":{"enum":["count","weight","volume","length","area","time"],"description":"count|weight|volume|length|area|time (Dimensionsschutz, 04-30 §6).","type":["string","null"]},"factorToBase":{"description":"Faktor auf die Basis-Einheit der Dimension (decimal-String, z. B. '0.001').","type":["string","null"]},"decimals":{"minimum":0,"maximum":6,"description":"Nachkommastellen für Eingabe/Anzeige (Stück 0, kg/l 3).","type":["integer","null"]},"active":{"type":["boolean","null"]}}},"UnitOfMeasure.jsonld-uom_unit.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["code"],"properties":{"code":{"maxLength":20,"type":["string","null"]},"ulid":{"type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"dimension":{"enum":["count","weight","volume","length","area","time"],"description":"count|weight|volume|length|area|time (Dimensionsschutz, 04-30 §6).","type":["string","null"]},"factorToBase":{"description":"Faktor auf die Basis-Einheit der Dimension (decimal-String, z. B. '0.001').","type":["string","null"]},"decimals":{"minimum":0,"maximum":6,"description":"Nachkommastellen für Eingabe/Anzeige (Stück 0, kg/l 3).","type":["integer","null"]},"active":{"type":["boolean","null"]}}}],"description":"Mengeneinheiten-Stamm (04-30 §3/§7).\n- Dimension, Basisfaktor, Nachkommastellen; markenübergreifend (kein Brand-Scope).\n- Schlüssel = code (Muster SalesOrderStatus).\n- DELETE hart, aber 409 solange in Umrechnungstabelle referenziert."},"UserAccount-user_account.create":{"type":"object","properties":{"email":{"maxLength":255,"description":"Login-Identifier. Beim Anlegen Pflicht; nachträglich änderbar (Eindeutigkeit prüft der Service).","type":["string","null"]},"displayName":{"maxLength":255,"type":["string","null"]},"locale":{"description":"UI-Sprache des Kontos — `null` = Browser-Erkennung.","type":["string","null"]},"roleId":{"description":"Markenübergreifende Rolle (Membership mit brandId = null).","type":["integer","null"]},"password":{"description":"Initialpasswort (Modus „Passwort jetzt setzen\") — gehasht, Konto sofort aktiv.","type":["string","null"]},"sendInvitation":{"description":"Modus „Einladung senden\": Konto wird pending angelegt, Setzen-Link per Mail versendet.","default":false,"type":"boolean"}}},"UserAccount-user_account.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"email":{"maxLength":255,"description":"Login-Identifier. Beim Anlegen Pflicht; nachträglich änderbar (Eindeutigkeit prüft der Service).","type":["string","null"]},"displayName":{"maxLength":255,"type":["string","null"]},"locale":{"description":"UI-Sprache des Kontos — `null` = Browser-Erkennung.","type":["string","null"]},"avatarUrl":{"type":["string","null"]},"active":{"default":false,"type":"boolean"},"lastLoginAt":{"type":["string","null"],"format":"date-time"},"roleNames":{"type":"array","items":{"type":"string"}},"roleId":{"description":"Markenübergreifende Rolle (Membership mit brandId = null).","type":["integer","null"]},"employeeUlid":{"maxLength":26,"description":"Verknüpfter Mitarbeiter (Personalstammdaten) — ULID.","type":["string","null"]},"employeeName":{"description":"Read-only Anzeige des verknüpften Mitarbeiters (Anzeige-/Vollname).","type":["string","null"]}}},"UserAccount-user_account.write.jsonMergePatch":{"type":"object","properties":{"email":{"maxLength":255,"description":"Login-Identifier. Beim Anlegen Pflicht; nachträglich änderbar (Eindeutigkeit prüft der Service).","type":["string","null"]},"displayName":{"maxLength":255,"type":["string","null"]},"locale":{"description":"UI-Sprache des Kontos — `null` = Browser-Erkennung.","type":["string","null"]},"active":{"default":false,"type":"boolean"},"roleId":{"description":"Markenübergreifende Rolle (Membership mit brandId = null).","type":["integer","null"]},"employeeUlid":{"maxLength":26,"description":"Verknüpfter Mitarbeiter (Personalstammdaten) — ULID.","type":["string","null"]},"newPassword":{"description":"Admin-Passwort-Reset: setzt ein neues Passwort direkt (Mindestlänge prüft die Policy).","type":["string","null"]},"resendInvitation":{"description":"Verschickt einen neuen Einladungs-/Setzen-Link und setzt das Konto auf `pending`.","default":false,"type":"boolean"}}},"UserAccount.jsonld-user_account.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"email":{"maxLength":255,"description":"Login-Identifier. Beim Anlegen Pflicht; nachträglich änderbar (Eindeutigkeit prüft der Service).","type":["string","null"]},"displayName":{"maxLength":255,"type":["string","null"]},"locale":{"description":"UI-Sprache des Kontos — `null` = Browser-Erkennung.","type":["string","null"]},"avatarUrl":{"type":["string","null"]},"active":{"default":false,"type":"boolean"},"lastLoginAt":{"type":["string","null"],"format":"date-time"},"roleNames":{"type":"array","items":{"type":"string"}},"roleId":{"description":"Markenübergreifende Rolle (Membership mit brandId = null).","type":["integer","null"]},"employeeUlid":{"maxLength":26,"description":"Verknüpfter Mitarbeiter (Personalstammdaten) — ULID.","type":["string","null"]},"employeeName":{"description":"Read-only Anzeige des verknüpften Mitarbeiters (Anzeige-/Vollname).","type":["string","null"]}}}]},"UserSavedView-saved_view.read":{"type":"object","description":"Gespeicherte Ansicht je Liste (Programm 21 AP 1.6).\n- Selbst-scoped: platform.saved_view.manage genügt für eigene; shared braucht zusätzlich platform.saved_view.share\n- IDOR-Schutz im State-Layer.","properties":{"ulid":{"type":["string","null"]},"viewKey":{"pattern":"^([a-z0-9][a-z0-9-]{0,60})$","description":"Listen-Kennung (kebab-slug). POST: Pflicht (Processor prüft). PATCH: sendet sie nicht -> kein NotBlank hier.","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"scope":{"enum":["personal","shared"],"description":"personal|shared (shared erfordert platform.saved_view.share).","type":["string","null"]},"ownerId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sort":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"columns":{"type":["array","null"],"items":{"type":"string"}},"sortOrder":{"type":["integer","null"]}},"required":["name"]},"UserSavedView-saved_view.write":{"type":"object","description":"Gespeicherte Ansicht je Liste (Programm 21 AP 1.6).\n- Selbst-scoped: platform.saved_view.manage genügt für eigene; shared braucht zusätzlich platform.saved_view.share\n- IDOR-Schutz im State-Layer.","properties":{"viewKey":{"pattern":"^([a-z0-9][a-z0-9-]{0,60})$","description":"Listen-Kennung (kebab-slug). POST: Pflicht (Processor prüft). PATCH: sendet sie nicht -> kein NotBlank hier.","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"scope":{"enum":["personal","shared"],"description":"personal|shared (shared erfordert platform.saved_view.share).","type":["string","null"]},"brandId":{"type":["integer","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sort":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"columns":{"type":["array","null"],"items":{"type":"string"}},"sortOrder":{"type":["integer","null"]}},"required":["name"]},"UserSavedView-saved_view.write.jsonMergePatch":{"type":"object","description":"Gespeicherte Ansicht je Liste (Programm 21 AP 1.6).\n- Selbst-scoped: platform.saved_view.manage genügt für eigene; shared braucht zusätzlich platform.saved_view.share\n- IDOR-Schutz im State-Layer.","properties":{"viewKey":{"pattern":"^([a-z0-9][a-z0-9-]{0,60})$","description":"Listen-Kennung (kebab-slug). POST: Pflicht (Processor prüft). PATCH: sendet sie nicht -> kein NotBlank hier.","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"scope":{"enum":["personal","shared"],"description":"personal|shared (shared erfordert platform.saved_view.share).","type":["string","null"]},"brandId":{"type":["integer","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sort":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"columns":{"type":["array","null"],"items":{"type":"string"}},"sortOrder":{"type":["integer","null"]}}},"UserSavedView.jsonld-saved_view.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"viewKey":{"pattern":"^([a-z0-9][a-z0-9-]{0,60})$","description":"Listen-Kennung (kebab-slug). POST: Pflicht (Processor prüft). PATCH: sendet sie nicht -> kein NotBlank hier.","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"scope":{"enum":["personal","shared"],"description":"personal|shared (shared erfordert platform.saved_view.share).","type":["string","null"]},"ownerId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"filters":{"type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sort":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"columns":{"type":["array","null"],"items":{"type":"string"}},"sortOrder":{"type":["integer","null"]}},"required":["name"]}],"description":"Gespeicherte Ansicht je Liste (Programm 21 AP 1.6).\n- Selbst-scoped: platform.saved_view.manage genügt für eigene; shared braucht zusätzlich platform.saved_view.share\n- IDOR-Schutz im State-Layer."},"UserUiPreference-ui_pref.read":{"type":"object","description":"Persönliche UI-Präferenzen des Users (z.B. `nav.groupOrder`).\n- Nur eigene Präferenzen; Recht `platform.ui_preference.manage`, State-Layer hart\n  User-scoped (IDOR-fest, Muster NotificationPreference).\n- POST: Upsert je `prefKey`. DELETE: Reset auf Default.\n- Meldungen der `#[Assert\\Callback]`-Rümpfe sind KATALOG-SCHLÜSSEL (Domain `validators`), kein\n  Klartext: der ConstraintViolationBuilder übersetzt seine Meldung, ein Satz als ID kommt\n  unverändert zurück und stünde für API-/MCP-Clients in jeder Sprache deutsch da (Audit R41-15).\n  Wächter: {@see \\App\\Tests\\Unit\\I18n\\ValidatorCatalogReachableTest}.","properties":{"ulid":{"type":["string","null"]},"prefKey":{"default":"","type":"string"},"value":{"description":"Präferenz-Wert; Struktur hängt von `prefKey` ab (z.B. `nav.groupOrder`: Liste Gruppen-Keys).","type":"array","items":{"type":["string","null"]}}},"required":["prefKey"]},"UserUiPreference-ui_pref.write":{"type":"object","description":"Persönliche UI-Präferenzen des Users (z.B. `nav.groupOrder`).\n- Nur eigene Präferenzen; Recht `platform.ui_preference.manage`, State-Layer hart\n  User-scoped (IDOR-fest, Muster NotificationPreference).\n- POST: Upsert je `prefKey`. DELETE: Reset auf Default.\n- Meldungen der `#[Assert\\Callback]`-Rümpfe sind KATALOG-SCHLÜSSEL (Domain `validators`), kein\n  Klartext: der ConstraintViolationBuilder übersetzt seine Meldung, ein Satz als ID kommt\n  unverändert zurück und stünde für API-/MCP-Clients in jeder Sprache deutsch da (Audit R41-15).\n  Wächter: {@see \\App\\Tests\\Unit\\I18n\\ValidatorCatalogReachableTest}.","required":["prefKey"],"properties":{"prefKey":{"default":"","type":"string"},"value":{"description":"Präferenz-Wert; Struktur hängt von `prefKey` ab (z.B. `nav.groupOrder`: Liste Gruppen-Keys).","type":"array","items":{"type":["string","null"]}}}},"UserUiPreference-ui_pref.write.jsonMergePatch":{"type":"object","description":"Persönliche UI-Präferenzen des Users (z.B. `nav.groupOrder`).\n- Nur eigene Präferenzen; Recht `platform.ui_preference.manage`, State-Layer hart\n  User-scoped (IDOR-fest, Muster NotificationPreference).\n- POST: Upsert je `prefKey`. DELETE: Reset auf Default.\n- Meldungen der `#[Assert\\Callback]`-Rümpfe sind KATALOG-SCHLÜSSEL (Domain `validators`), kein\n  Klartext: der ConstraintViolationBuilder übersetzt seine Meldung, ein Satz als ID kommt\n  unverändert zurück und stünde für API-/MCP-Clients in jeder Sprache deutsch da (Audit R41-15).\n  Wächter: {@see \\App\\Tests\\Unit\\I18n\\ValidatorCatalogReachableTest}.","properties":{"prefKey":{"default":"","type":"string"},"value":{"description":"Präferenz-Wert; Struktur hängt von `prefKey` ab (z.B. `nav.groupOrder`: Liste Gruppen-Keys).","type":"array","items":{"type":["string","null"]}}}},"UserUiPreference.jsonld-ui_pref.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"prefKey":{"default":"","type":"string"},"value":{"description":"Präferenz-Wert; Struktur hängt von `prefKey` ab (z.B. `nav.groupOrder`: Liste Gruppen-Keys).","type":"array","items":{"type":["string","null"]}}},"required":["prefKey"]}],"description":"Persönliche UI-Präferenzen des Users (z.B. `nav.groupOrder`).\n- Nur eigene Präferenzen; Recht `platform.ui_preference.manage`, State-Layer hart\n  User-scoped (IDOR-fest, Muster NotificationPreference).\n- POST: Upsert je `prefKey`. DELETE: Reset auf Default.\n- Meldungen der `#[Assert\\Callback]`-Rümpfe sind KATALOG-SCHLÜSSEL (Domain `validators`), kein\n  Klartext: der ConstraintViolationBuilder übersetzt seine Meldung, ein Satz als ID kommt\n  unverändert zurück und stünde für API-/MCP-Clients in jeder Sprache deutsch da (Audit R41-15).\n  Wächter: {@see \\App\\Tests\\Unit\\I18n\\ValidatorCatalogReachableTest}."},"Utilization-utilization.read":{"type":"object","description":"Planungsboard / Auslastungs-Heatmap (04-09 §5, §6.3) — read-only.\nZeile je Mitarbeiter; cells je Periode: geplant/verfügbar/ist, utilizationPct, severity (ok/idle/warn/critical).\nFilter: from/to/granularity/brandId/employeeId(mehrfach)/includeFreelancers.","properties":{"key":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"name":{"type":["string","null"]},"external":{"type":["boolean","null"]},"granularity":{"type":["string","null"]},"cells":{"description":"je Periode: key/plannedHours/allocationHours/taskWorkloadHours/\navailableHours/actualHours/utilizationPct/planVsActualHours/severity.\n`plannedHours` = max(allocationHours, taskWorkloadHours) — die\nDoppelzähl-Regel der aufgabenbasierten Workload (Doc 27 4.1/E4)","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Utilization.jsonld-utilization.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"key":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"name":{"type":["string","null"]},"external":{"type":["boolean","null"]},"granularity":{"type":["string","null"]},"cells":{"description":"je Periode: key/plannedHours/allocationHours/taskWorkloadHours/\navailableHours/actualHours/utilizationPct/planVsActualHours/severity.\n`plannedHours` = max(allocationHours, taskWorkloadHours) — die\nDoppelzähl-Regel der aufgabenbasierten Workload (Doc 27 4.1/E4)","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Planungsboard / Auslastungs-Heatmap (04-09 §5, §6.3) — read-only.\nZeile je Mitarbeiter; cells je Periode: geplant/verfügbar/ist, utilizationPct, severity (ok/idle/warn/critical).\nFilter: from/to/granularity/brandId/employeeId(mehrfach)/includeFreelancers."},"VatIdCheck-vat_id_check.read":{"type":"object","description":"USt-IdNr.-Prüfung gegen VIES und ihr Protokoll (Doc 25 AP 10.2, Spec 04-51 §3).\n\n**Die Liste ist ein Nachweis, kein Verlauf.** Wer innergemeinschaftlich steuerfrei fakturiert,\nmuss belegen können, dass die Nummer im Zeitpunkt der Leistung gültig war (§ 6a Abs. 4 UStG) —\ndafür steht die Bestätigungsnummer (`requestIdentifier`) an jeder qualifizierten Abfrage.\n\nErgebnisse sind drei, nicht zwei: `valid`, `invalid` und `unavailable`. Der dritte ist eine\nStörung des fremden Dienstes und wird NIE wie „ungültig\" behandelt.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"vatId":{"minLength":4,"maxLength":20,"description":"Vollständige USt-IdNr. inkl. Länderpräfix (`NL123456789B01`); Leer- und Sonderzeichen werden entfernt.","type":["string","null"]},"partnerId":{"description":"Geschäftspartner (Customer-Id), zu dem geprüft wird; optional.","type":["integer","null"]},"countryCode":{"type":["string","null"]},"result":{"description":"`valid` | `invalid` | `unavailable`.","type":["string","null"]},"traderName":{"type":["string","null"]},"traderAddress":{"type":["string","null"]},"requestIdentifier":{"description":"Konsultationsnummer der qualifizierten Abfrage — DER Nachweis gegenüber der Finanzverwaltung.","type":["string","null"]},"errorMessage":{"description":"Stoerungsgrund als SCHLUESSEL `code` bzw. `code:detail`\n({@see \\Octi\\Plugin\\International\\Contract\\VatIdCheckError}, Audit R43-54) — nie ein\nfertiger Satz: geschrieben wird ohne Leser, aufgeloest wird in dessen Sprache\n(`international.vatIdCheck.<code>`). Bestandszeilen tragen weiter deutschen Klartext, den\ndie Maske unveraendert durchreicht.","type":["string","null"]},"checkedAt":{"type":["string","null"]}}},"VatIdCheck-vat_id_check.write":{"type":"object","description":"USt-IdNr.-Prüfung gegen VIES und ihr Protokoll (Doc 25 AP 10.2, Spec 04-51 §3).\n\n**Die Liste ist ein Nachweis, kein Verlauf.** Wer innergemeinschaftlich steuerfrei fakturiert,\nmuss belegen können, dass die Nummer im Zeitpunkt der Leistung gültig war (§ 6a Abs. 4 UStG) —\ndafür steht die Bestätigungsnummer (`requestIdentifier`) an jeder qualifizierten Abfrage.\n\nErgebnisse sind drei, nicht zwei: `valid`, `invalid` und `unavailable`. Der dritte ist eine\nStörung des fremden Dienstes und wird NIE wie „ungültig\" behandelt.","properties":{"vatId":{"minLength":4,"maxLength":20,"description":"Vollständige USt-IdNr. inkl. Länderpräfix (`NL123456789B01`); Leer- und Sonderzeichen werden entfernt.","type":["string","null"]},"partnerId":{"description":"Geschäftspartner (Customer-Id), zu dem geprüft wird; optional.","type":["integer","null"]},"refresh":{"description":"Erzwingt eine echte Abfrage, auch wenn eine gültige Bestätigung in ihrer Frist liegt.","type":["boolean","null"]}}},"VatIdCheck.jsonld-vat_id_check.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"vatId":{"minLength":4,"maxLength":20,"description":"Vollständige USt-IdNr. inkl. Länderpräfix (`NL123456789B01`); Leer- und Sonderzeichen werden entfernt.","type":["string","null"]},"partnerId":{"description":"Geschäftspartner (Customer-Id), zu dem geprüft wird; optional.","type":["integer","null"]},"countryCode":{"type":["string","null"]},"result":{"description":"`valid` | `invalid` | `unavailable`.","type":["string","null"]},"traderName":{"type":["string","null"]},"traderAddress":{"type":["string","null"]},"requestIdentifier":{"description":"Konsultationsnummer der qualifizierten Abfrage — DER Nachweis gegenüber der Finanzverwaltung.","type":["string","null"]},"errorMessage":{"description":"Stoerungsgrund als SCHLUESSEL `code` bzw. `code:detail`\n({@see \\Octi\\Plugin\\International\\Contract\\VatIdCheckError}, Audit R43-54) — nie ein\nfertiger Satz: geschrieben wird ohne Leser, aufgeloest wird in dessen Sprache\n(`international.vatIdCheck.<code>`). Bestandszeilen tragen weiter deutschen Klartext, den\ndie Maske unveraendert durchreicht.","type":["string","null"]},"checkedAt":{"type":["string","null"]}}}],"description":"USt-IdNr.-Prüfung gegen VIES und ihr Protokoll (Doc 25 AP 10.2, Spec 04-51 §3).\n\n**Die Liste ist ein Nachweis, kein Verlauf.** Wer innergemeinschaftlich steuerfrei fakturiert,\nmuss belegen können, dass die Nummer im Zeitpunkt der Leistung gültig war (§ 6a Abs. 4 UStG) —\ndafür steht die Bestätigungsnummer (`requestIdentifier`) an jeder qualifizierten Abfrage.\n\nErgebnisse sind drei, nicht zwei: `valid`, `invalid` und `unavailable`. Der dritte ist eine\nStörung des fremden Dienstes und wird NIE wie „ungültig\" behandelt."},"VisibilityPolicy-visibility_policy.read":{"type":"object","description":"Sichtbarkeits-Regel je Entity-Typ/Marke (Doc 26 5.2). Konfiguration nur `platform.settings.manage`.","properties":{"ulid":{"type":["string","null"]},"entityType":{"maxLength":40,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"mode":{"enum":["all","owner_only","owner_and_team"],"default":"all","type":"string"}},"required":["entityType"]},"VisibilityPolicy-visibility_policy.write":{"type":"object","description":"Sichtbarkeits-Regel je Entity-Typ/Marke (Doc 26 5.2). Konfiguration nur `platform.settings.manage`.","required":["entityType"],"properties":{"entityType":{"maxLength":40,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"mode":{"enum":["all","owner_only","owner_and_team"],"default":"all","type":"string"}}},"VisibilityPolicy-visibility_policy.write.jsonMergePatch":{"type":"object","description":"Sichtbarkeits-Regel je Entity-Typ/Marke (Doc 26 5.2). Konfiguration nur `platform.settings.manage`.","properties":{"entityType":{"maxLength":40,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"mode":{"enum":["all","owner_only","owner_and_team"],"default":"all","type":"string"}}},"VisibilityPolicy.jsonld-visibility_policy.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"entityType":{"maxLength":40,"default":"","type":"string"},"brandId":{"type":["integer","null"]},"mode":{"enum":["all","owner_only","owner_and_team"],"default":"all","type":"string"}},"required":["entityType"]}],"description":"Sichtbarkeits-Regel je Entity-Typ/Marke (Doc 26 5.2). Konfiguration nur `platform.settings.manage`."},"VisibilityTargetResource-visibility_target.read":{"type":"object","description":"Regelbare Datensatz-Typen für Sichtbarkeits-Regeln (Doc 26 5.2/5.3, SPI `app.visibility.target`).\nRead-only-Katalog: speist die Typ-Auswahl der Verwaltungsmaske und macht sie für MCP/Automation\nauffindbar. Typen deaktivierter Plugins fehlen (fail-closed).","properties":{"entityType":{"description":"Datensatz-Typ-Schlüssel (identisch mit `entityType` der Regel).","default":"","type":"string"},"label":{"description":"Übersetzungs-Key des Anzeigenamens.","default":"","type":"string"},"bypassPermission":{"description":"Recht, das die Regel umgeht („alles sehen\").","default":"","type":"string"}}},"VisibilityTargetResource.jsonld-visibility_target.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"entityType":{"description":"Datensatz-Typ-Schlüssel (identisch mit `entityType` der Regel).","default":"","type":"string"},"label":{"description":"Übersetzungs-Key des Anzeigenamens.","default":"","type":"string"},"bypassPermission":{"description":"Recht, das die Regel umgeht („alles sehen\").","default":"","type":"string"}}}],"description":"Regelbare Datensatz-Typen für Sichtbarkeits-Regeln (Doc 26 5.2/5.3, SPI `app.visibility.target`).\nRead-only-Katalog: speist die Typ-Auswahl der Verwaltungsmaske und macht sie für MCP/Automation\nauffindbar. Typen deaktivierter Plugins fehlen (fail-closed)."},"Voucher-voucher.read":{"type":"object","description":"Gutschein-Verwaltung (Doc 25 AP 6.3, Spec 04-45 §6).\n\n**Der Code darf leer bleiben** — dann erzeugt ihn der Server (`codeCount` legt eine ganze\nSerie an). Von Hand vergebene Codes sind in der Praxis raten- oder tippbar; ein erzeugter\nCode kommt aus einem Zeichenvorrat ohne verwechselbare Zeichen und aus einer kryptografischen\nQuelle.\n\nDie EINLÖSUNG steht nicht hier, sondern am Auftrag\n(`POST /v1/sales-orders/{ulid}/redeem-voucher`): eingelöst wird auf einem Beleg, und das Recht\ndafür ist das Auftragsrecht.","properties":{"ulid":{"type":["string","null"]},"code":{"maxLength":40,"description":"Einlöse-Code; leer lassen = Server erzeugt ihn.","type":["string","null"]},"label":{"maxLength":160,"description":"Interne Bezeichnung („Newsletter-Herbst\").","type":["string","null"]},"kind":{"enum":["discount","credit"],"description":"Art des Gutscheins — sie bindet den Einlöse-Kanal (Audit R46-12):\n`discount` = Rabattgutschein, mindert die Bemessungsgrundlage, NUR am Auftrag;\n`credit` = gekauftes Guthaben (Mehrzweckgutschein), ist eine Zahlung, NUR an der Kasse.","type":["string","null"]},"rateType":{"enum":["amount","percent"],"description":"`amount` (fester Wert in Cent, mit Restwert) oder `percent` (Basispunkte, 1000 = 10 %).","type":["string","null"]},"valueAmount":{"minimum":0,"exclusiveMinimum":0,"description":"Ausgabewert: Cent (amount) bzw. Basispunkte (percent).","type":["integer","null"]},"remainingAmount":{"description":"Restwert in Cent (read-only — Ergebnis der Einlösungen); null bei `percent`.","type":["integer","null"]},"maxDiscountAmount":{"minimum":0,"description":"Höchstbetrag je Einlösung in Cent; null = ungedeckelt.","type":["integer","null"]},"minOrderAmount":{"minimum":0,"description":"Mindest-Belegwert (netto, Cent), ab dem der Gutschein greift.","type":["integer","null"]},"customerId":{"minimum":0,"description":"Personalisierung; null = für jeden Kunden.","type":["integer","null"]},"brandId":{"minimum":0,"description":"Marken-Scope; null = markenübergreifend.","type":["integer","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]},"maxRedemptions":{"minimum":0,"description":"Höchstzahl der Einlösungen; null = unbegrenzt.","type":["integer","null"]},"redemptionCount":{"description":"Bisherige Einlösungen (read-only).","type":["integer","null"]},"active":{"type":["boolean","null"]},"redeemable":{"description":"Heute einlösbar? (read-only — fasst Sperre, Fenster und Kontingent zusammen).","type":["boolean","null"]},"redemptions":{"description":"Offene Einlösungen dieses Gutscheins (read-only, nur Item-Sicht) — je Eintrag\n`subjectType`, `subjectUlid`, `amountApplied`, `redeemedAt`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"Voucher-voucher.write":{"type":"object","description":"Gutschein-Verwaltung (Doc 25 AP 6.3, Spec 04-45 §6).\n\n**Der Code darf leer bleiben** — dann erzeugt ihn der Server (`codeCount` legt eine ganze\nSerie an). Von Hand vergebene Codes sind in der Praxis raten- oder tippbar; ein erzeugter\nCode kommt aus einem Zeichenvorrat ohne verwechselbare Zeichen und aus einer kryptografischen\nQuelle.\n\nDie EINLÖSUNG steht nicht hier, sondern am Auftrag\n(`POST /v1/sales-orders/{ulid}/redeem-voucher`): eingelöst wird auf einem Beleg, und das Recht\ndafür ist das Auftragsrecht.","properties":{"code":{"maxLength":40,"description":"Einlöse-Code; leer lassen = Server erzeugt ihn.","type":["string","null"]},"codeCount":{"minimum":1,"maximum":500,"description":"Nur bei Anlage: Anzahl zu erzeugender Codes (Serie). Default 1, Höchstwert 500.","type":["integer","null"]},"label":{"maxLength":160,"description":"Interne Bezeichnung („Newsletter-Herbst\").","type":["string","null"]},"kind":{"enum":["discount","credit"],"description":"Art des Gutscheins — sie bindet den Einlöse-Kanal (Audit R46-12):\n`discount` = Rabattgutschein, mindert die Bemessungsgrundlage, NUR am Auftrag;\n`credit` = gekauftes Guthaben (Mehrzweckgutschein), ist eine Zahlung, NUR an der Kasse.","type":["string","null"]},"rateType":{"enum":["amount","percent"],"description":"`amount` (fester Wert in Cent, mit Restwert) oder `percent` (Basispunkte, 1000 = 10 %).","type":["string","null"]},"valueAmount":{"minimum":0,"exclusiveMinimum":0,"description":"Ausgabewert: Cent (amount) bzw. Basispunkte (percent).","type":["integer","null"]},"maxDiscountAmount":{"minimum":0,"description":"Höchstbetrag je Einlösung in Cent; null = ungedeckelt.","type":["integer","null"]},"minOrderAmount":{"minimum":0,"description":"Mindest-Belegwert (netto, Cent), ab dem der Gutschein greift.","type":["integer","null"]},"customerId":{"minimum":0,"description":"Personalisierung; null = für jeden Kunden.","type":["integer","null"]},"brandId":{"minimum":0,"description":"Marken-Scope; null = markenübergreifend.","type":["integer","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]},"maxRedemptions":{"minimum":0,"description":"Höchstzahl der Einlösungen; null = unbegrenzt.","type":["integer","null"]},"active":{"type":["boolean","null"]}}},"Voucher-voucher.write.jsonMergePatch":{"type":"object","description":"Gutschein-Verwaltung (Doc 25 AP 6.3, Spec 04-45 §6).\n\n**Der Code darf leer bleiben** — dann erzeugt ihn der Server (`codeCount` legt eine ganze\nSerie an). Von Hand vergebene Codes sind in der Praxis raten- oder tippbar; ein erzeugter\nCode kommt aus einem Zeichenvorrat ohne verwechselbare Zeichen und aus einer kryptografischen\nQuelle.\n\nDie EINLÖSUNG steht nicht hier, sondern am Auftrag\n(`POST /v1/sales-orders/{ulid}/redeem-voucher`): eingelöst wird auf einem Beleg, und das Recht\ndafür ist das Auftragsrecht.","properties":{"code":{"maxLength":40,"description":"Einlöse-Code; leer lassen = Server erzeugt ihn.","type":["string","null"]},"codeCount":{"minimum":1,"maximum":500,"description":"Nur bei Anlage: Anzahl zu erzeugender Codes (Serie). Default 1, Höchstwert 500.","type":["integer","null"]},"label":{"maxLength":160,"description":"Interne Bezeichnung („Newsletter-Herbst\").","type":["string","null"]},"kind":{"enum":["discount","credit"],"description":"Art des Gutscheins — sie bindet den Einlöse-Kanal (Audit R46-12):\n`discount` = Rabattgutschein, mindert die Bemessungsgrundlage, NUR am Auftrag;\n`credit` = gekauftes Guthaben (Mehrzweckgutschein), ist eine Zahlung, NUR an der Kasse.","type":["string","null"]},"rateType":{"enum":["amount","percent"],"description":"`amount` (fester Wert in Cent, mit Restwert) oder `percent` (Basispunkte, 1000 = 10 %).","type":["string","null"]},"valueAmount":{"minimum":0,"exclusiveMinimum":0,"description":"Ausgabewert: Cent (amount) bzw. Basispunkte (percent).","type":["integer","null"]},"maxDiscountAmount":{"minimum":0,"description":"Höchstbetrag je Einlösung in Cent; null = ungedeckelt.","type":["integer","null"]},"minOrderAmount":{"minimum":0,"description":"Mindest-Belegwert (netto, Cent), ab dem der Gutschein greift.","type":["integer","null"]},"customerId":{"minimum":0,"description":"Personalisierung; null = für jeden Kunden.","type":["integer","null"]},"brandId":{"minimum":0,"description":"Marken-Scope; null = markenübergreifend.","type":["integer","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]},"maxRedemptions":{"minimum":0,"description":"Höchstzahl der Einlösungen; null = unbegrenzt.","type":["integer","null"]},"active":{"type":["boolean","null"]}}},"Voucher.jsonld-voucher.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"code":{"maxLength":40,"description":"Einlöse-Code; leer lassen = Server erzeugt ihn.","type":["string","null"]},"label":{"maxLength":160,"description":"Interne Bezeichnung („Newsletter-Herbst\").","type":["string","null"]},"kind":{"enum":["discount","credit"],"description":"Art des Gutscheins — sie bindet den Einlöse-Kanal (Audit R46-12):\n`discount` = Rabattgutschein, mindert die Bemessungsgrundlage, NUR am Auftrag;\n`credit` = gekauftes Guthaben (Mehrzweckgutschein), ist eine Zahlung, NUR an der Kasse.","type":["string","null"]},"rateType":{"enum":["amount","percent"],"description":"`amount` (fester Wert in Cent, mit Restwert) oder `percent` (Basispunkte, 1000 = 10 %).","type":["string","null"]},"valueAmount":{"minimum":0,"exclusiveMinimum":0,"description":"Ausgabewert: Cent (amount) bzw. Basispunkte (percent).","type":["integer","null"]},"remainingAmount":{"description":"Restwert in Cent (read-only — Ergebnis der Einlösungen); null bei `percent`.","type":["integer","null"]},"maxDiscountAmount":{"minimum":0,"description":"Höchstbetrag je Einlösung in Cent; null = ungedeckelt.","type":["integer","null"]},"minOrderAmount":{"minimum":0,"description":"Mindest-Belegwert (netto, Cent), ab dem der Gutschein greift.","type":["integer","null"]},"customerId":{"minimum":0,"description":"Personalisierung; null = für jeden Kunden.","type":["integer","null"]},"brandId":{"minimum":0,"description":"Marken-Scope; null = markenübergreifend.","type":["integer","null"]},"validFrom":{"type":["string","null"]},"validTo":{"type":["string","null"]},"maxRedemptions":{"minimum":0,"description":"Höchstzahl der Einlösungen; null = unbegrenzt.","type":["integer","null"]},"redemptionCount":{"description":"Bisherige Einlösungen (read-only).","type":["integer","null"]},"active":{"type":["boolean","null"]},"redeemable":{"description":"Heute einlösbar? (read-only — fasst Sperre, Fenster und Kontingent zusammen).","type":["boolean","null"]},"redemptions":{"description":"Offene Einlösungen dieses Gutscheins (read-only, nur Item-Sicht) — je Eintrag\n`subjectType`, `subjectUlid`, `amountApplied`, `redeemedAt`.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Gutschein-Verwaltung (Doc 25 AP 6.3, Spec 04-45 §6).\n\n**Der Code darf leer bleiben** — dann erzeugt ihn der Server (`codeCount` legt eine ganze\nSerie an). Von Hand vergebene Codes sind in der Praxis raten- oder tippbar; ein erzeugter\nCode kommt aus einem Zeichenvorrat ohne verwechselbare Zeichen und aus einer kryptografischen\nQuelle.\n\nDie EINLÖSUNG steht nicht hier, sondern am Auftrag\n(`POST /v1/sales-orders/{ulid}/redeem-voucher`): eingelöst wird auf einem Beleg, und das Recht\ndafür ist das Auftragsrecht."},"Warehouse-warehouse.read":{"type":"object","description":"Lagerort-Stammdaten (04-25 §8, API-First).\nCRUD über `warehouses.warehouse.*`; ohne Brand-Scope (Modul-Konvention).\nGenau EIN Default-Lager wird im Processor erzwungen (andere werden zurückgesetzt).\nULID-Requirement verhindert Kollision mit dem Literal-Segment `replenishment-suggestions`.","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, FK-lose Referenzen).","type":["integer","null"]},"code":{"maxLength":30,"description":"Eindeutiger Lager-Code (max. 30 Zeichen).","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"address":{"description":"Adresse als strukturierte Daten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"description":"Default-Lager (genau eines): empfängt Buchungen ohne expliziten Lager-Bezug.","type":["boolean","null"]},"active":{"type":["boolean","null"]},"priority":{"description":"Regelbasierte Lagerauswahl: höher gewinnt, wenn kein Default gesetzt ist.","type":["integer","null"]},"valuationMethod":{"enum":["fifo","average"],"description":"Bestandsbewertung dieses Lagers: fifo | average.","type":["string","null"]},"putawayStrategy":{"enum":["random_free","name_asc","name_desc","sort_asc","sort_desc"],"description":"Reihenfolge der FREIEN Plätze im Einlagerungs-Vorschlag (Doc 25 AP 4.8):\n`random_free` · `name_asc` · `name_desc` · `sort_asc` (Default) · `sort_desc`.","type":["string","null"]}}},"Warehouse-warehouse.write":{"type":"object","description":"Lagerort-Stammdaten (04-25 §8, API-First).\nCRUD über `warehouses.warehouse.*`; ohne Brand-Scope (Modul-Konvention).\nGenau EIN Default-Lager wird im Processor erzwungen (andere werden zurückgesetzt).\nULID-Requirement verhindert Kollision mit dem Literal-Segment `replenishment-suggestions`.","properties":{"code":{"maxLength":30,"description":"Eindeutiger Lager-Code (max. 30 Zeichen).","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"address":{"description":"Adresse als strukturierte Daten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"description":"Default-Lager (genau eines): empfängt Buchungen ohne expliziten Lager-Bezug.","type":["boolean","null"]},"active":{"type":["boolean","null"]},"priority":{"description":"Regelbasierte Lagerauswahl: höher gewinnt, wenn kein Default gesetzt ist.","type":["integer","null"]},"valuationMethod":{"enum":["fifo","average"],"description":"Bestandsbewertung dieses Lagers: fifo | average.","type":["string","null"]},"putawayStrategy":{"enum":["random_free","name_asc","name_desc","sort_asc","sort_desc"],"description":"Reihenfolge der FREIEN Plätze im Einlagerungs-Vorschlag (Doc 25 AP 4.8):\n`random_free` · `name_asc` · `name_desc` · `sort_asc` (Default) · `sort_desc`.","type":["string","null"]}}},"Warehouse-warehouse.write.jsonMergePatch":{"type":"object","description":"Lagerort-Stammdaten (04-25 §8, API-First).\nCRUD über `warehouses.warehouse.*`; ohne Brand-Scope (Modul-Konvention).\nGenau EIN Default-Lager wird im Processor erzwungen (andere werden zurückgesetzt).\nULID-Requirement verhindert Kollision mit dem Literal-Segment `replenishment-suggestions`.","properties":{"code":{"maxLength":30,"description":"Eindeutiger Lager-Code (max. 30 Zeichen).","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"address":{"description":"Adresse als strukturierte Daten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"description":"Default-Lager (genau eines): empfängt Buchungen ohne expliziten Lager-Bezug.","type":["boolean","null"]},"active":{"type":["boolean","null"]},"priority":{"description":"Regelbasierte Lagerauswahl: höher gewinnt, wenn kein Default gesetzt ist.","type":["integer","null"]},"valuationMethod":{"enum":["fifo","average"],"description":"Bestandsbewertung dieses Lagers: fifo | average.","type":["string","null"]},"putawayStrategy":{"enum":["random_free","name_asc","name_desc","sort_asc","sort_desc"],"description":"Reihenfolge der FREIEN Plätze im Einlagerungs-Vorschlag (Doc 25 AP 4.8):\n`random_free` · `name_asc` · `name_desc` · `sort_asc` (Default) · `sort_desc`.","type":["string","null"]}}},"Warehouse.jsonld-warehouse.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, FK-lose Referenzen).","type":["integer","null"]},"code":{"maxLength":30,"description":"Eindeutiger Lager-Code (max. 30 Zeichen).","type":["string","null"]},"name":{"maxLength":100,"type":["string","null"]},"address":{"description":"Adresse als strukturierte Daten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"isDefault":{"description":"Default-Lager (genau eines): empfängt Buchungen ohne expliziten Lager-Bezug.","type":["boolean","null"]},"active":{"type":["boolean","null"]},"priority":{"description":"Regelbasierte Lagerauswahl: höher gewinnt, wenn kein Default gesetzt ist.","type":["integer","null"]},"valuationMethod":{"enum":["fifo","average"],"description":"Bestandsbewertung dieses Lagers: fifo | average.","type":["string","null"]},"putawayStrategy":{"enum":["random_free","name_asc","name_desc","sort_asc","sort_desc"],"description":"Reihenfolge der FREIEN Plätze im Einlagerungs-Vorschlag (Doc 25 AP 4.8):\n`random_free` · `name_asc` · `name_desc` · `sort_asc` (Default) · `sort_desc`.","type":["string","null"]}}}],"description":"Lagerort-Stammdaten (04-25 §8, API-First).\nCRUD über `warehouses.warehouse.*`; ohne Brand-Scope (Modul-Konvention).\nGenau EIN Default-Lager wird im Processor erzwungen (andere werden zurückgesetzt).\nULID-Requirement verhindert Kollision mit dem Literal-Segment `replenishment-suggestions`."},"WarehouseBin-warehouse_bin.read":{"type":"object","description":"Lagerplätze/Bins eines Lagerorts (04-25 §4/§5, M2).\nCRUD unter `/v1/warehouses/{warehouseUlid}/bins`; Liste sortiert nach `pickPriority` (M6).\n`warehouseUlid` wird in den State-Klassen aufgelöst (DTO-Resource, FK-los, kein Doctrine-Link).","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, für binId-Zuordnungen).","type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"code":{"maxLength":30,"description":"Lagerplatz-Code, je Lager eindeutig (max. 30 Zeichen).","type":["string","null"]},"type":{"enum":["pick","reserve","inbound","clarification","returns","retail"],"description":"Platzart (Doc 25 AP 4.7): `pick` (Default) · `reserve` · `inbound` · `clarification` ·\n`returns` · `retail`. Der Nachschub füllt `pick` aus `reserve`.","type":["string","null"]},"zone":{"maxLength":30,"type":["string","null"]},"aisle":{"maxLength":30,"type":["string","null"]},"shelf":{"maxLength":30,"type":["string","null"]},"pickPriority":{"description":"Kommissionier-Reihenfolge: niedriger = früher picken.","type":["integer","null"]}}},"WarehouseBin-warehouse_bin.write":{"type":"object","description":"Lagerplätze/Bins eines Lagerorts (04-25 §4/§5, M2).\nCRUD unter `/v1/warehouses/{warehouseUlid}/bins`; Liste sortiert nach `pickPriority` (M6).\n`warehouseUlid` wird in den State-Klassen aufgelöst (DTO-Resource, FK-los, kein Doctrine-Link).","properties":{"code":{"maxLength":30,"description":"Lagerplatz-Code, je Lager eindeutig (max. 30 Zeichen).","type":["string","null"]},"type":{"enum":["pick","reserve","inbound","clarification","returns","retail"],"description":"Platzart (Doc 25 AP 4.7): `pick` (Default) · `reserve` · `inbound` · `clarification` ·\n`returns` · `retail`. Der Nachschub füllt `pick` aus `reserve`.","type":["string","null"]},"zone":{"maxLength":30,"type":["string","null"]},"aisle":{"maxLength":30,"type":["string","null"]},"shelf":{"maxLength":30,"type":["string","null"]},"pickPriority":{"description":"Kommissionier-Reihenfolge: niedriger = früher picken.","type":["integer","null"]}}},"WarehouseBin-warehouse_bin.write.jsonMergePatch":{"type":"object","description":"Lagerplätze/Bins eines Lagerorts (04-25 §4/§5, M2).\nCRUD unter `/v1/warehouses/{warehouseUlid}/bins`; Liste sortiert nach `pickPriority` (M6).\n`warehouseUlid` wird in den State-Klassen aufgelöst (DTO-Resource, FK-los, kein Doctrine-Link).","properties":{"code":{"maxLength":30,"description":"Lagerplatz-Code, je Lager eindeutig (max. 30 Zeichen).","type":["string","null"]},"type":{"enum":["pick","reserve","inbound","clarification","returns","retail"],"description":"Platzart (Doc 25 AP 4.7): `pick` (Default) · `reserve` · `inbound` · `clarification` ·\n`returns` · `retail`. Der Nachschub füllt `pick` aus `reserve`.","type":["string","null"]},"zone":{"maxLength":30,"type":["string","null"]},"aisle":{"maxLength":30,"type":["string","null"]},"shelf":{"maxLength":30,"type":["string","null"]},"pickPriority":{"description":"Kommissionier-Reihenfolge: niedriger = früher picken.","type":["integer","null"]}}},"WarehouseBin.jsonld-warehouse_bin.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only, für binId-Zuordnungen).","type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"code":{"maxLength":30,"description":"Lagerplatz-Code, je Lager eindeutig (max. 30 Zeichen).","type":["string","null"]},"type":{"enum":["pick","reserve","inbound","clarification","returns","retail"],"description":"Platzart (Doc 25 AP 4.7): `pick` (Default) · `reserve` · `inbound` · `clarification` ·\n`returns` · `retail`. Der Nachschub füllt `pick` aus `reserve`.","type":["string","null"]},"zone":{"maxLength":30,"type":["string","null"]},"aisle":{"maxLength":30,"type":["string","null"]},"shelf":{"maxLength":30,"type":["string","null"]},"pickPriority":{"description":"Kommissionier-Reihenfolge: niedriger = früher picken.","type":["integer","null"]}}}],"description":"Lagerplätze/Bins eines Lagerorts (04-25 §4/§5, M2).\nCRUD unter `/v1/warehouses/{warehouseUlid}/bins`; Liste sortiert nach `pickPriority` (M6).\n`warehouseUlid` wird in den State-Klassen aufgelöst (DTO-Resource, FK-los, kein Doctrine-Link)."},"WarehouseStock-warehouse_stock.read":{"type":"object","description":"Bestandssicht eines Lagerorts (04-25 §5): read-only, mit Produktname/SKU-Anreicherung.\nBuchungen NICHT hier — nur über Kernel-Inventory-SPI bzw. Umlagerungs-Aktionen (P-1).","properties":{"ulid":{"type":["string","null"]},"warehouseId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"productName":{"description":"Produktname aus dem Katalog (product-Plugin); null, wenn das Produkt fehlt.","type":["string","null"]},"sku":{"type":["string","null"]},"onHand":{"description":"Physischer Bestand in diesem Lager.","type":["integer","null"]},"reserved":{"description":"Lagerortbezogen reservierter Bestand.","type":["integer","null"]},"available":{"description":"Verfügbar = onHand − reserved.","type":["integer","null"]},"binId":{"description":"Optionale Lagerplatz-Zuordnung (BinLocation-ID).","type":["integer","null"]},"avgCostAmount":{"description":"Gleitender Durchschnitts-Einstandspreis in Cent (valuationMethod=average).","type":["integer","null"]},"unitCostAmount":{"description":"Einstand JE EINHEIT nach dem Bewertungsverfahren DIESES Lagers, in Cent (R41-34):\n`average` → der fortgeschriebene Durchschnitt, `fifo` → der gewichtete Einstand der offenen\nBewertungsschichten. `null` heisst UNBEKANNT, nicht 0,00 €.","type":["integer","null"]}}},"WarehouseStock.jsonld-warehouse_stock.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"warehouseId":{"type":["integer","null"]},"productId":{"type":["integer","null"]},"productName":{"description":"Produktname aus dem Katalog (product-Plugin); null, wenn das Produkt fehlt.","type":["string","null"]},"sku":{"type":["string","null"]},"onHand":{"description":"Physischer Bestand in diesem Lager.","type":["integer","null"]},"reserved":{"description":"Lagerortbezogen reservierter Bestand.","type":["integer","null"]},"available":{"description":"Verfügbar = onHand − reserved.","type":["integer","null"]},"binId":{"description":"Optionale Lagerplatz-Zuordnung (BinLocation-ID).","type":["integer","null"]},"avgCostAmount":{"description":"Gleitender Durchschnitts-Einstandspreis in Cent (valuationMethod=average).","type":["integer","null"]},"unitCostAmount":{"description":"Einstand JE EINHEIT nach dem Bewertungsverfahren DIESES Lagers, in Cent (R41-34):\n`average` → der fortgeschriebene Durchschnitt, `fifo` → der gewichtete Einstand der offenen\nBewertungsschichten. `null` heisst UNBEKANNT, nicht 0,00 €.","type":["integer","null"]}}}],"description":"Bestandssicht eines Lagerorts (04-25 §5): read-only, mit Produktname/SKU-Anreicherung.\nBuchungen NICHT hier — nur über Kernel-Inventory-SPI bzw. Umlagerungs-Aktionen (P-1)."},"WarehouseStockValue-warehouse_stock_value.read":{"type":"object","description":"Bestandswert EINES Lagers (Systemaudit `R41-34`, Entscheidung `ENT-R41-04`).\n\nDas Pendant zu `/v1/product-stock-value` — sobald mehr als ein Lager geführt wird, ist die\nGesamtsumme aus OctiProduct nicht mehr auf ein Lager herunterzubrechen; genau das ist aber die\nFrage, für die man ein Multilager einschaltet.\n\n**Die wichtigste Zahl hier ist `unvaluedProducts`** — wie beim Gesamtreport. Ein Bestandswert,\nder die Artikel ohne bekannten Einstandspreis stillschweigend als 0 mitzählt, sieht vollständig\naus und ist es nicht; das fällt genau dann auf, wenn er gegen die Buchhaltung gestellt wird.\n\nBeide Bewertungsverfahren zählen: im FIFO-Lager kommt der Wert aus den Bewertungsschichten, nicht\naus `avgCostAmount` (das dort gar nicht gepflegt wird) — Einzelheiten im Provider.\n\nMarken-Schnitt: bewusst KEINER. Weder `Warehouse` noch `wh_stock` tragen eine `brandId` (Lager\nsind markenlose Stammdaten, {@see \\Octi\\Plugin\\MultiWarehouse\\State\\WarehouseCollectionProvider});\nein Schnitt nur an dieser einen Stelle wäre keine Sicherheit, sondern eine Abweichung von der\nBestandsliste nebenan. Der Zugang bindet am Recht `warehouses.stock.*` — demselben, das die\nBestandsliste dieses Lagers freigibt.","properties":{"warehouseUlid":{"description":"ULID des Lagers — der Report trägt keine eigene Kennung.","default":"","type":"string"},"warehouseId":{"description":"Interne Lager-Id (die Bestandszeilen referenzieren FK-los darüber).","type":["integer","null"]},"warehouseName":{"type":["string","null"]},"valuationMethod":{"description":"Bewertungsverfahren des Lagers (`average` | `fifo`) — es entscheidet, WORAUS der Wert kommt:\ndem fortgeschriebenen Durchschnitt an der Bestandszeile oder den offenen FIFO-Schichten.","type":["string","null"]},"totalValueAmount":{"description":"Summe über alle BEWERTETEN Bestandszeilen dieses Lagers, in Cent.","default":0,"type":"integer"},"valuedProducts":{"description":"Bestandszeilen mit Bestand und bekanntem Einstandspreis.","default":0,"type":"integer"},"unvaluedProducts":{"description":"Bestandszeilen MIT Bestand, aber OHNE bekannten Einstandspreis — die Lücke im Wert.","default":0,"type":"integer"},"unvaluedOnHand":{"description":"Stückzahl in den unbewerteten Zeilen — damit die Lücke einzuordnen ist.","default":0,"type":"integer"},"lines":{"description":"Einzelzeilen, absteigend nach Wert (gekappt, {@see WarehouseStockValueReportProvider}).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}},"WarehouseStockValue.jsonld-warehouse_stock_value.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"warehouseUlid":{"description":"ULID des Lagers — der Report trägt keine eigene Kennung.","default":"","type":"string"},"warehouseId":{"description":"Interne Lager-Id (die Bestandszeilen referenzieren FK-los darüber).","type":["integer","null"]},"warehouseName":{"type":["string","null"]},"valuationMethod":{"description":"Bewertungsverfahren des Lagers (`average` | `fifo`) — es entscheidet, WORAUS der Wert kommt:\ndem fortgeschriebenen Durchschnitt an der Bestandszeile oder den offenen FIFO-Schichten.","type":["string","null"]},"totalValueAmount":{"description":"Summe über alle BEWERTETEN Bestandszeilen dieses Lagers, in Cent.","default":0,"type":"integer"},"valuedProducts":{"description":"Bestandszeilen mit Bestand und bekanntem Einstandspreis.","default":0,"type":"integer"},"unvaluedProducts":{"description":"Bestandszeilen MIT Bestand, aber OHNE bekannten Einstandspreis — die Lücke im Wert.","default":0,"type":"integer"},"unvaluedOnHand":{"description":"Stückzahl in den unbewerteten Zeilen — damit die Lücke einzuordnen ist.","default":0,"type":"integer"},"lines":{"description":"Einzelzeilen, absteigend nach Wert (gekappt, {@see WarehouseStockValueReportProvider}).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}]}}}}}],"description":"Bestandswert EINES Lagers (Systemaudit `R41-34`, Entscheidung `ENT-R41-04`).\n\nDas Pendant zu `/v1/product-stock-value` — sobald mehr als ein Lager geführt wird, ist die\nGesamtsumme aus OctiProduct nicht mehr auf ein Lager herunterzubrechen; genau das ist aber die\nFrage, für die man ein Multilager einschaltet.\n\n**Die wichtigste Zahl hier ist `unvaluedProducts`** — wie beim Gesamtreport. Ein Bestandswert,\nder die Artikel ohne bekannten Einstandspreis stillschweigend als 0 mitzählt, sieht vollständig\naus und ist es nicht; das fällt genau dann auf, wenn er gegen die Buchhaltung gestellt wird.\n\nBeide Bewertungsverfahren zählen: im FIFO-Lager kommt der Wert aus den Bewertungsschichten, nicht\naus `avgCostAmount` (das dort gar nicht gepflegt wird) — Einzelheiten im Provider.\n\nMarken-Schnitt: bewusst KEINER. Weder `Warehouse` noch `wh_stock` tragen eine `brandId` (Lager\nsind markenlose Stammdaten, {@see \\Octi\\Plugin\\MultiWarehouse\\State\\WarehouseCollectionProvider});\nein Schnitt nur an dieser einen Stelle wäre keine Sicherheit, sondern eine Abweichung von der\nBestandsliste nebenan. Der Zugang bindet am Recht `warehouses.stock.*` — demselben, das die\nBestandsliste dieses Lagers freigibt."},"Webhook-webhook.read":{"type":"object","description":"API-Resource für ausgehende Webhooks (04-00 §4.9). CRUD über `platform.webhook.manage`.\n- SSRF-Validierung verbindlich serverseitig in {@see WebhookProcessor} (Hosts lösen dynamisch auf); Assert-Regeln hier nur erste Verteidigungslinie.\n- `secret` beim Lesen write-only (nie ausgespielt).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"url":{"maxLength":500,"format":"uri","externalDocs":{"url":"https://schema.org/url"},"default":"","type":"string"},"eventTypes":{"description":"Abonnierte Event-Typen; leer/null => alle Events. Wildcard-Präfix erlaubt (\"crm.*\").","type":["array","null"],"items":{"type":"string"}},"hasSecret":{"description":"True, sobald ein Secret hinterlegt ist (das Secret selbst wird nie zurückgegeben).","default":false,"type":"boolean"},"active":{"default":true,"type":"boolean"},"brandId":{"type":["integer","null"]},"lastTriggeredAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name","url"]},"Webhook-webhook.write":{"type":"object","description":"API-Resource für ausgehende Webhooks (04-00 §4.9). CRUD über `platform.webhook.manage`.\n- SSRF-Validierung verbindlich serverseitig in {@see WebhookProcessor} (Hosts lösen dynamisch auf); Assert-Regeln hier nur erste Verteidigungslinie.\n- `secret` beim Lesen write-only (nie ausgespielt).","required":["name","url"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"url":{"maxLength":500,"format":"uri","externalDocs":{"url":"https://schema.org/url"},"default":"","type":"string"},"eventTypes":{"description":"Abonnierte Event-Typen; leer/null => alle Events. Wildcard-Präfix erlaubt (\"crm.*\").","type":["array","null"],"items":{"type":"string"}},"secret":{"minLength":16,"maxLength":255,"description":"Signatur-Secret (write-only). Beim Anlegen optional — wird dann serverseitig erzeugt.","type":["string","null"]},"active":{"default":true,"type":"boolean"},"brandId":{"type":["integer","null"]}}},"Webhook-webhook.write.jsonMergePatch":{"type":"object","description":"API-Resource für ausgehende Webhooks (04-00 §4.9). CRUD über `platform.webhook.manage`.\n- SSRF-Validierung verbindlich serverseitig in {@see WebhookProcessor} (Hosts lösen dynamisch auf); Assert-Regeln hier nur erste Verteidigungslinie.\n- `secret` beim Lesen write-only (nie ausgespielt).","properties":{"name":{"maxLength":255,"default":"","type":"string"},"url":{"maxLength":500,"format":"uri","externalDocs":{"url":"https://schema.org/url"},"default":"","type":"string"},"eventTypes":{"description":"Abonnierte Event-Typen; leer/null => alle Events. Wildcard-Präfix erlaubt (\"crm.*\").","type":["array","null"],"items":{"type":"string"}},"secret":{"minLength":16,"maxLength":255,"description":"Signatur-Secret (write-only). Beim Anlegen optional — wird dann serverseitig erzeugt.","type":["string","null"]},"active":{"default":true,"type":"boolean"},"brandId":{"type":["integer","null"]}}},"Webhook.jsonld-webhook.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":255,"default":"","type":"string"},"url":{"maxLength":500,"format":"uri","externalDocs":{"url":"https://schema.org/url"},"default":"","type":"string"},"eventTypes":{"description":"Abonnierte Event-Typen; leer/null => alle Events. Wildcard-Präfix erlaubt (\"crm.*\").","type":["array","null"],"items":{"type":"string"}},"hasSecret":{"description":"True, sobald ein Secret hinterlegt ist (das Secret selbst wird nie zurückgegeben).","default":false,"type":"boolean"},"active":{"default":true,"type":"boolean"},"brandId":{"type":["integer","null"]},"lastTriggeredAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name","url"]}],"description":"API-Resource für ausgehende Webhooks (04-00 §4.9). CRUD über `platform.webhook.manage`.\n- SSRF-Validierung verbindlich serverseitig in {@see WebhookProcessor} (Hosts lösen dynamisch auf); Assert-Regeln hier nur erste Verteidigungslinie.\n- `secret` beim Lesen write-only (nie ausgespielt)."},"WebhookEventCatalog-webhook_event_catalog.read":{"type":"object","description":"Read-only Vorschlags-Katalog abonnierbarer Webhook-Event-Keys (Programm 21, AP 5.6/DIII-10).\n- Backend-getrieben (Typeahead statt Freitext); Plugin-Events erscheinen ohne Core-Edit, deaktivierte Plugins verschwinden ({@see \\App\\Platform\\Integration\\Service\\WebhookEventCatalog}).\n- Wertebereich discoverbar für API-/MCP-Clients (P-1/P-2). Freitext/Wildcards (`crm.*`) bleiben zulässig — Angebot, keine Whitelist.","properties":{"id":{"description":"Singleton-Pseudo-Identifier (es gibt genau eine Katalog-Zeile).","default":"default","type":"string"},"events":{"description":"Abonnierbare Event-Keys (`{modul}.{ereignis}`), aufsteigend sortiert, Enablement-gefiltert.","type":"array","items":{"type":"string"}}}},"WebhookEventCatalog.jsonld-webhook_event_catalog.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Singleton-Pseudo-Identifier (es gibt genau eine Katalog-Zeile).","default":"default","type":"string"},"events":{"description":"Abonnierbare Event-Keys (`{modul}.{ereignis}`), aufsteigend sortiert, Enablement-gefiltert.","type":"array","items":{"type":"string"}}}}],"description":"Read-only Vorschlags-Katalog abonnierbarer Webhook-Event-Keys (Programm 21, AP 5.6/DIII-10).\n- Backend-getrieben (Typeahead statt Freitext); Plugin-Events erscheinen ohne Core-Edit, deaktivierte Plugins verschwinden ({@see \\App\\Platform\\Integration\\Service\\WebhookEventCatalog}).\n- Wertebereich discoverbar für API-/MCP-Clients (P-1/P-2). Freitext/Wildcards (`crm.*`) bleiben zulässig — Angebot, keine Whitelist."},"WorkItem-workitem.read":{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — u. a. entityId für den polymorphen Benutzerfeld-Editor.","type":["integer","null"]},"ref":{"type":["string","null"]},"customerCode":{"description":"Dedizierte, kundenseitige Vorgangsnummer (brand-abhängig, nur Tickets) — read-only, serverseitig vergeben.","type":["string","null"]},"kind":{"enum":["task","ticket"],"default":"task","type":"string"},"title":{"maxLength":1000,"default":"","type":"string"},"description":{"type":["string","null"]},"statusId":{"maxLength":50,"type":["string","null"]},"priorityId":{"maxLength":50,"type":["string","null"]},"assigneeIds":{"type":["array","null"],"items":{"type":"integer"}},"watcherIds":{"description":"Watcher = User-IDs, benachrichtigt bei Kommentaren/Statuswechseln.","type":["array","null"],"items":{"type":"integer"}},"startAt":{"description":"Geplanter Start (Doc 27 G1) — bildet mit dueDate die Gantt/Timeline-Spanne.","type":["string","null"],"format":"date-time"},"dueDate":{"type":["string","null"],"format":"date-time"},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectUlid":{"description":"Projekt-Kontext (read-only, nur Item-Detail): Name+ULID, da projectId nur numerische PK ist\n(kein Identifier des ULID-adressierten Projekts).","type":["string","null"]},"projectName":{"type":["string","null"]},"listId":{"minimum":0,"exclusiveMinimum":0,"description":"Aufgabenlisten-Mitgliedschaft (numerische WorkItemList-ID); null = keine Liste.","type":["integer","null"]},"position":{"minimum":0,"description":"Sortierposition in der Liste (0-basiert je listId-Bucket, bei listId=null je Projekt).","type":["integer","null"]},"parentUlid":{"maxLength":26,"type":["string","null"]},"tags":{"description":"Schlagwörter des Vorgangs. Geschrieben wird über den Zuordnungs-Dienst: beim Speichern ersetzt der Wert die GANZE Liste (fehlende werden angelegt, überzählige entfernt), beim Anlegen kommen sie additiv dazu — was eine Automation auf die Anlage hin vergibt, bleibt erhalten. TagAssigned/TagRemoved feuern nur bei echtem Wechsel und lösen die daran hängenden Regeln aus.","type":["array","null"],"items":{"type":"string"}},"estimateMinutes":{"minimum":0,"type":["integer","null"]},"trackedMinutes":{"description":"Gebuchte Minuten (Summe der Zeitbuchungen, Storni gegengerechnet) — read-only.","type":["integer","null"]},"recurrenceRule":{"pattern":"^(.*(^\\d{1,3}:(days|weeks|months)$).*)$","description":"Wiederholregel \"<intervall>:<einheit>\" (days|weeks|months), z.B. \"1:weeks\".","type":["string","null"]},"recurrenceLastSpawnedAt":{"description":"Wann diese Serien-Instanz ihren Nachfolger erzeugt hat (Idempotenz-Marker, read-only).","type":["string","null"],"format":"date-time"},"definitionOfDone":{"maxItems":100,"description":"Definition-of-Done-Checkliste [{text, done}]. Processor normalisiert Einträge, verwirft Unbrauchbares.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}},"source":{"default":"manual","type":"string"},"visibility":{"enum":["normal","private"],"description":"Sichtbarkeit (Doc 27 0.2): normal|private — privat = nur Ersteller + Zuweisungs-Kreis.","default":"normal","type":"string"},"archivedAt":{"description":"Soft-Archiv-Zeitpunkt (read-only); null = aktiv. Schreiben nur über archive/unarchive-Action.","type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"createdBy":{"type":["string","null"]},"timeline":{"description":"Zusammengeführter Verlauf (Events+Nachrichten), aufsteigend, nur Item-Sicht.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"timelineTotal":{"description":"Gesamtzahl aller Timeline-Einträge des Vorgangs (Events + Nachrichten); nur Item-Sicht.","type":["integer","null"]},"timelineHasMore":{"description":"true, wenn die eingebettete Timeline gekürzt ist und ältere Einträge über /v1/work-item-timeline nachzuladen sind.","type":["boolean","null"]},"isBlocked":{"description":"Computed: true bei mind. einer blocked_by-Abhängigkeit auf ein NICHT erledigtes Work-Item\n(done/cancelled bzw. solved/closed). Reiner Hinweis — Status-Wechsel bleibt erlaubt.","default":false,"type":"boolean"},"dependencies":{"description":"Abhängigkeiten dieses Items (es ist der Blockierte): \"dieses Item blocked_by X\". Nur Item-Sicht.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"dependents":{"description":"Abhängige Work-Items (dieses Item ist Blockierender): \"X blocked_by dieses Item\". Struktur wie $dependencies.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"scheduleWarnings":{"description":"Computed: Terminierungs-Hinweise der Schedule-Links FS/SS/FF/SF, wenn deren Schranke verletzt ist.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["kind","title"]},"WorkItem-workitem.write":{"type":"object","required":["kind","title"],"properties":{"kind":{"enum":["task","ticket"],"default":"task","type":"string"},"title":{"maxLength":1000,"default":"","type":"string"},"description":{"type":["string","null"]},"statusId":{"maxLength":50,"type":["string","null"]},"priorityId":{"maxLength":50,"type":["string","null"]},"assigneeIds":{"type":["array","null"],"items":{"type":"integer"}},"watcherIds":{"description":"Watcher = User-IDs, benachrichtigt bei Kommentaren/Statuswechseln.","type":["array","null"],"items":{"type":"integer"}},"startAt":{"description":"Geplanter Start (Doc 27 G1) — bildet mit dueDate die Gantt/Timeline-Spanne.","type":["string","null"],"format":"date-time"},"dueDate":{"type":["string","null"],"format":"date-time"},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"listId":{"minimum":0,"exclusiveMinimum":0,"description":"Aufgabenlisten-Mitgliedschaft (numerische WorkItemList-ID); null = keine Liste.","type":["integer","null"]},"position":{"minimum":0,"description":"Sortierposition in der Liste (0-basiert je listId-Bucket, bei listId=null je Projekt).","type":["integer","null"]},"parentUlid":{"maxLength":26,"type":["string","null"]},"tags":{"description":"Schlagwörter des Vorgangs. Geschrieben wird über den Zuordnungs-Dienst: beim Speichern ersetzt der Wert die GANZE Liste (fehlende werden angelegt, überzählige entfernt), beim Anlegen kommen sie additiv dazu — was eine Automation auf die Anlage hin vergibt, bleibt erhalten. TagAssigned/TagRemoved feuern nur bei echtem Wechsel und lösen die daran hängenden Regeln aus.","type":["array","null"],"items":{"type":"string"}},"estimateMinutes":{"minimum":0,"type":["integer","null"]},"recurrenceRule":{"pattern":"^(.*(^\\d{1,3}:(days|weeks|months)$).*)$","description":"Wiederholregel \"<intervall>:<einheit>\" (days|weeks|months), z.B. \"1:weeks\".","type":["string","null"]},"definitionOfDone":{"maxItems":100,"description":"Definition-of-Done-Checkliste [{text, done}]. Processor normalisiert Einträge, verwirft Unbrauchbares.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}},"visibility":{"enum":["normal","private"],"description":"Sichtbarkeit (Doc 27 0.2): normal|private — privat = nur Ersteller + Zuweisungs-Kreis.","default":"normal","type":"string"},"targetUlid":{"description":"Nur Action-Input für POST …/dependencies: ULID des blockierenden Ziel-Work-Items.","type":["string","null"]},"type":{"enum":["blocked_by","finish_to_start","start_to_start","finish_to_finish","start_to_finish"],"description":"Nur Action-Input für POST …/dependencies: Beziehungstyp (Default 'blocked_by'; sonst\nfinish_to_start | start_to_start | finish_to_finish | start_to_finish).","type":["string","null"]},"lagDays":{"minimum":-365,"maximum":365,"description":"Nur Action-Input für POST …/dependencies: Lead/Lag in Tagen (-365..365; positiv = Verzug,\nnegativ = Vorlauf). Nur für die Terminierungstypen FS/SS/FF/SF wirksam, Default 0.","type":["integer","null"]},"commentBody":{"description":"Nur Action-Input für POST …/comments: interner Kommentartext (HTML, serverseitig bereinigt).","type":["string","null"]},"commentAttachmentIds":{"description":"Nur Action-Input für POST …/comments: ULIDs bestehender DMS-Dateien für den Kommentar.","type":["array","null"],"items":{"type":"string"}}}},"WorkItem-workitem.write.jsonMergePatch":{"type":"object","properties":{"kind":{"enum":["task","ticket"],"default":"task","type":"string"},"title":{"maxLength":1000,"default":"","type":"string"},"description":{"type":["string","null"]},"statusId":{"maxLength":50,"type":["string","null"]},"priorityId":{"maxLength":50,"type":["string","null"]},"assigneeIds":{"type":["array","null"],"items":{"type":"integer"}},"watcherIds":{"description":"Watcher = User-IDs, benachrichtigt bei Kommentaren/Statuswechseln.","type":["array","null"],"items":{"type":"integer"}},"startAt":{"description":"Geplanter Start (Doc 27 G1) — bildet mit dueDate die Gantt/Timeline-Spanne.","type":["string","null"],"format":"date-time"},"dueDate":{"type":["string","null"],"format":"date-time"},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"listId":{"minimum":0,"exclusiveMinimum":0,"description":"Aufgabenlisten-Mitgliedschaft (numerische WorkItemList-ID); null = keine Liste.","type":["integer","null"]},"position":{"minimum":0,"description":"Sortierposition in der Liste (0-basiert je listId-Bucket, bei listId=null je Projekt).","type":["integer","null"]},"parentUlid":{"maxLength":26,"type":["string","null"]},"tags":{"description":"Schlagwörter des Vorgangs. Geschrieben wird über den Zuordnungs-Dienst: beim Speichern ersetzt der Wert die GANZE Liste (fehlende werden angelegt, überzählige entfernt), beim Anlegen kommen sie additiv dazu — was eine Automation auf die Anlage hin vergibt, bleibt erhalten. TagAssigned/TagRemoved feuern nur bei echtem Wechsel und lösen die daran hängenden Regeln aus.","type":["array","null"],"items":{"type":"string"}},"estimateMinutes":{"minimum":0,"type":["integer","null"]},"recurrenceRule":{"pattern":"^(.*(^\\d{1,3}:(days|weeks|months)$).*)$","description":"Wiederholregel \"<intervall>:<einheit>\" (days|weeks|months), z.B. \"1:weeks\".","type":["string","null"]},"definitionOfDone":{"maxItems":100,"description":"Definition-of-Done-Checkliste [{text, done}]. Processor normalisiert Einträge, verwirft Unbrauchbares.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}},"visibility":{"enum":["normal","private"],"description":"Sichtbarkeit (Doc 27 0.2): normal|private — privat = nur Ersteller + Zuweisungs-Kreis.","default":"normal","type":"string"},"targetUlid":{"description":"Nur Action-Input für POST …/dependencies: ULID des blockierenden Ziel-Work-Items.","type":["string","null"]},"type":{"enum":["blocked_by","finish_to_start","start_to_start","finish_to_finish","start_to_finish"],"description":"Nur Action-Input für POST …/dependencies: Beziehungstyp (Default 'blocked_by'; sonst\nfinish_to_start | start_to_start | finish_to_finish | start_to_finish).","type":["string","null"]},"lagDays":{"minimum":-365,"maximum":365,"description":"Nur Action-Input für POST …/dependencies: Lead/Lag in Tagen (-365..365; positiv = Verzug,\nnegativ = Vorlauf). Nur für die Terminierungstypen FS/SS/FF/SF wirksam, Default 0.","type":["integer","null"]},"commentBody":{"description":"Nur Action-Input für POST …/comments: interner Kommentartext (HTML, serverseitig bereinigt).","type":["string","null"]},"commentAttachmentIds":{"description":"Nur Action-Input für POST …/comments: ULIDs bestehender DMS-Dateien für den Kommentar.","type":["array","null"],"items":{"type":"string"}}}},"WorkItem.jsonld-workitem.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"description":"Interne numerische ID (read-only) — u. a. entityId für den polymorphen Benutzerfeld-Editor.","type":["integer","null"]},"ref":{"type":["string","null"]},"customerCode":{"description":"Dedizierte, kundenseitige Vorgangsnummer (brand-abhängig, nur Tickets) — read-only, serverseitig vergeben.","type":["string","null"]},"kind":{"enum":["task","ticket"],"default":"task","type":"string"},"title":{"maxLength":1000,"default":"","type":"string"},"description":{"type":["string","null"]},"statusId":{"maxLength":50,"type":["string","null"]},"priorityId":{"maxLength":50,"type":["string","null"]},"assigneeIds":{"type":["array","null"],"items":{"type":"integer"}},"watcherIds":{"description":"Watcher = User-IDs, benachrichtigt bei Kommentaren/Statuswechseln.","type":["array","null"],"items":{"type":"integer"}},"startAt":{"description":"Geplanter Start (Doc 27 G1) — bildet mit dueDate die Gantt/Timeline-Spanne.","type":["string","null"],"format":"date-time"},"dueDate":{"type":["string","null"],"format":"date-time"},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"customerId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"projectUlid":{"description":"Projekt-Kontext (read-only, nur Item-Detail): Name+ULID, da projectId nur numerische PK ist\n(kein Identifier des ULID-adressierten Projekts).","type":["string","null"]},"projectName":{"type":["string","null"]},"listId":{"minimum":0,"exclusiveMinimum":0,"description":"Aufgabenlisten-Mitgliedschaft (numerische WorkItemList-ID); null = keine Liste.","type":["integer","null"]},"position":{"minimum":0,"description":"Sortierposition in der Liste (0-basiert je listId-Bucket, bei listId=null je Projekt).","type":["integer","null"]},"parentUlid":{"maxLength":26,"type":["string","null"]},"tags":{"description":"Schlagwörter des Vorgangs. Geschrieben wird über den Zuordnungs-Dienst: beim Speichern ersetzt der Wert die GANZE Liste (fehlende werden angelegt, überzählige entfernt), beim Anlegen kommen sie additiv dazu — was eine Automation auf die Anlage hin vergibt, bleibt erhalten. TagAssigned/TagRemoved feuern nur bei echtem Wechsel und lösen die daran hängenden Regeln aus.","type":["array","null"],"items":{"type":"string"}},"estimateMinutes":{"minimum":0,"type":["integer","null"]},"trackedMinutes":{"description":"Gebuchte Minuten (Summe der Zeitbuchungen, Storni gegengerechnet) — read-only.","type":["integer","null"]},"recurrenceRule":{"pattern":"^(.*(^\\d{1,3}:(days|weeks|months)$).*)$","description":"Wiederholregel \"<intervall>:<einheit>\" (days|weeks|months), z.B. \"1:weeks\".","type":["string","null"]},"recurrenceLastSpawnedAt":{"description":"Wann diese Serien-Instanz ihren Nachfolger erzeugt hat (Idempotenz-Marker, read-only).","type":["string","null"],"format":"date-time"},"definitionOfDone":{"maxItems":100,"description":"Definition-of-Done-Checkliste [{text, done}]. Processor normalisiert Einträge, verwirft Unbrauchbares.","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]}}},"source":{"default":"manual","type":"string"},"visibility":{"enum":["normal","private"],"description":"Sichtbarkeit (Doc 27 0.2): normal|private — privat = nur Ersteller + Zuweisungs-Kreis.","default":"normal","type":"string"},"archivedAt":{"description":"Soft-Archiv-Zeitpunkt (read-only); null = aktiv. Schreiben nur über archive/unarchive-Action.","type":["string","null"],"format":"date-time"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"createdBy":{"type":["string","null"]},"timeline":{"description":"Zusammengeführter Verlauf (Events+Nachrichten), aufsteigend, nur Item-Sicht.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"timelineTotal":{"description":"Gesamtzahl aller Timeline-Einträge des Vorgangs (Events + Nachrichten); nur Item-Sicht.","type":["integer","null"]},"timelineHasMore":{"description":"true, wenn die eingebettete Timeline gekürzt ist und ältere Einträge über /v1/work-item-timeline nachzuladen sind.","type":["boolean","null"]},"isBlocked":{"description":"Computed: true bei mind. einer blocked_by-Abhängigkeit auf ein NICHT erledigtes Work-Item\n(done/cancelled bzw. solved/closed). Reiner Hinweis — Status-Wechsel bleibt erlaubt.","default":false,"type":"boolean"},"dependencies":{"description":"Abhängigkeiten dieses Items (es ist der Blockierte): \"dieses Item blocked_by X\". Nur Item-Sicht.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"dependents":{"description":"Abhängige Work-Items (dieses Item ist Blockierender): \"X blocked_by dieses Item\". Struktur wie $dependencies.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"scheduleWarnings":{"description":"Computed: Terminierungs-Hinweise der Schedule-Links FS/SS/FF/SF, wenn deren Schranke verletzt ist.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"required":["kind","title"]}]},"WorkItemAttachment-wi_attachment.read":{"type":"object","description":"Anhang auf Vorgangs-Ebene: referenziert bestehende DMS-Datei (kein Upload hier),\nsicht-/herunterladbar am Work-Item (task/ticket).\n\nsecurity prüft nur Katalog-Permission — Brand-Scope/IDOR + Datei-Berechtigung setzen\n{@see WorkItemAttachmentProvider}/{@see WorkItemAttachmentProcessor} durch.\n\ndownloadUrl = abgesicherte Datei-Download-Route; storagePath wird NIE exponiert.","properties":{"ulid":{"type":["string","null"]},"workItemUlid":{"maxLength":26,"description":"Ziel-Work-Item (ULID) — beim Anhängen erforderlich; bei der Liste der Pflichtfilter.","type":["string","null"]},"fileUlid":{"maxLength":26,"description":"Anzuhängende bestehende DMS-Datei (ULID) — beim Anhängen erforderlich.","type":["string","null"]},"caption":{"maxLength":255,"type":["string","null"]},"originalName":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"addedByType":{"description":"human | portal | system — wer den Anhang gesetzt hat.","type":["string","null"]},"downloadUrl":{"description":"Abgesicherte Download-Route der Datei (kein storagePath).","type":["string","null"]},"createdAt":{"type":["string","null"]}}},"WorkItemAttachment-wi_attachment.write":{"type":"object","description":"Anhang auf Vorgangs-Ebene: referenziert bestehende DMS-Datei (kein Upload hier),\nsicht-/herunterladbar am Work-Item (task/ticket).\n\nsecurity prüft nur Katalog-Permission — Brand-Scope/IDOR + Datei-Berechtigung setzen\n{@see WorkItemAttachmentProvider}/{@see WorkItemAttachmentProcessor} durch.\n\ndownloadUrl = abgesicherte Datei-Download-Route; storagePath wird NIE exponiert.","properties":{"workItemUlid":{"maxLength":26,"description":"Ziel-Work-Item (ULID) — beim Anhängen erforderlich; bei der Liste der Pflichtfilter.","type":["string","null"]},"fileUlid":{"maxLength":26,"description":"Anzuhängende bestehende DMS-Datei (ULID) — beim Anhängen erforderlich.","type":["string","null"]},"caption":{"maxLength":255,"type":["string","null"]}}},"WorkItemAttachment.jsonld-wi_attachment.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"workItemUlid":{"maxLength":26,"description":"Ziel-Work-Item (ULID) — beim Anhängen erforderlich; bei der Liste der Pflichtfilter.","type":["string","null"]},"fileUlid":{"maxLength":26,"description":"Anzuhängende bestehende DMS-Datei (ULID) — beim Anhängen erforderlich.","type":["string","null"]},"caption":{"maxLength":255,"type":["string","null"]},"originalName":{"type":["string","null"]},"mimeType":{"type":["string","null"]},"sizeBytes":{"type":["integer","null"]},"addedByType":{"description":"human | portal | system — wer den Anhang gesetzt hat.","type":["string","null"]},"downloadUrl":{"description":"Abgesicherte Download-Route der Datei (kein storagePath).","type":["string","null"]},"createdAt":{"type":["string","null"]}}}],"description":"Anhang auf Vorgangs-Ebene: referenziert bestehende DMS-Datei (kein Upload hier),\nsicht-/herunterladbar am Work-Item (task/ticket).\n\nsecurity prüft nur Katalog-Permission — Brand-Scope/IDOR + Datei-Berechtigung setzen\n{@see WorkItemAttachmentProvider}/{@see WorkItemAttachmentProcessor} durch.\n\ndownloadUrl = abgesicherte Datei-Download-Route; storagePath wird NIE exponiert."},"WorkItemLink-workitemlink.read":{"type":"object","description":"Verknüpfung zweier Vorgänge (Ticket ⇄ Aufgabe oder beliebige Work-Items), 04-04 §3/§4.5.\nPersistiert über bestehende {@see \\App\\WorkItem\\Entity\\WorkItemLink}-Tabelle, kein Umkopieren.\n\nCollection bidirektional, Pflicht-Filter `?workItemUlid=…`: liefert ALLE Links des Anker-Vorgangs\n(Quelle oder Ziel); `relatedUlid` ist beim Lesen stets der jeweils ANDERE Vorgang.\nLeisten-Felder `related*` (Doc 43): Priorität/Zuständiger/Kanal/SLA/letzte Nachricht/Zähler des\nGegen-Vorgangs — genug für die Strang-Leiste der Aufgabenseite ohne N Ticket-Abrufe.","properties":{"ulid":{"type":["string","null"]},"workItemUlid":{"maxLength":26,"description":"Anker-Vorgang: Pflicht beim Anlegen, Pflicht-Filter der Collection.","type":["string","null"]},"relatedUlid":{"maxLength":26,"description":"Gegen-Vorgang. Beim Lesen IMMER der „andere\" Vorgang relativ zum Anker.","type":["string","null"]},"linkType":{"enum":["relates","causes","duplicate"],"default":"relates","type":"string"},"direction":{"description":"'outgoing' (Anker → Gegen-Vorgang) oder 'incoming' (Gegen-Vorgang → Anker).","type":["string","null"]},"relatedRef":{"type":["string","null"]},"relatedTitle":{"type":["string","null"]},"relatedKind":{"description":"task | ticket — steuert das Sprungziel (/work-items vs. /tickets) im Frontend.","type":["string","null"]},"relatedStatusId":{"type":["string","null"]},"relatedPriorityId":{"type":["string","null"]},"relatedOwnerId":{"description":"Primärer Bearbeiter (User-ID) des Gegen-Vorgangs.","type":["integer","null"]},"relatedChannel":{"description":"Kanal des Gegen-Vorgangs (Ticket: mail/whatsapp/portal/…).","type":["string","null"]},"relatedClosedAt":{"type":["string","null"]},"relatedResolvedAt":{"type":["string","null"]},"relatedFirstResponseDueAt":{"type":["string","null"]},"relatedResolutionDueAt":{"type":["string","null"]},"relatedFirstRespondedAt":{"type":["string","null"]},"relatedSlaBreached":{"description":"SLA gerissen (Reaktion ODER Lösung) — wie TicketCollectionProvider.","default":false,"type":"boolean"},"relatedUpdatedAt":{"type":["string","null"]},"relatedLastMessageAt":{"description":"Zeitpunkt der jüngsten Nachricht des Gegen-Vorgangs (WorkItemMessage: sentAt ?? createdAt).","type":["string","null"]},"relatedLastMessageDirection":{"description":"Richtung der jüngsten Nachricht (in|out|internal) — „wartet auf uns\" = offen ∧ letzte Richtung in.","type":["string","null"]},"relatedMessageCount":{"description":"Nachrichten-Zahl des Gegen-Vorgangs (eine GROUP-BY-Query, kein N+1).","default":0,"type":"integer"}},"required":["workItemUlid","relatedUlid"]},"WorkItemLink-workitemlink.write":{"type":"object","description":"Verknüpfung zweier Vorgänge (Ticket ⇄ Aufgabe oder beliebige Work-Items), 04-04 §3/§4.5.\nPersistiert über bestehende {@see \\App\\WorkItem\\Entity\\WorkItemLink}-Tabelle, kein Umkopieren.\n\nCollection bidirektional, Pflicht-Filter `?workItemUlid=…`: liefert ALLE Links des Anker-Vorgangs\n(Quelle oder Ziel); `relatedUlid` ist beim Lesen stets der jeweils ANDERE Vorgang.\nLeisten-Felder `related*` (Doc 43): Priorität/Zuständiger/Kanal/SLA/letzte Nachricht/Zähler des\nGegen-Vorgangs — genug für die Strang-Leiste der Aufgabenseite ohne N Ticket-Abrufe.","required":["workItemUlid","relatedUlid"],"properties":{"workItemUlid":{"maxLength":26,"description":"Anker-Vorgang: Pflicht beim Anlegen, Pflicht-Filter der Collection.","type":["string","null"]},"relatedUlid":{"maxLength":26,"description":"Gegen-Vorgang. Beim Lesen IMMER der „andere\" Vorgang relativ zum Anker.","type":["string","null"]},"linkType":{"enum":["relates","causes","duplicate"],"default":"relates","type":"string"}}},"WorkItemLink.jsonld-workitemlink.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"workItemUlid":{"maxLength":26,"description":"Anker-Vorgang: Pflicht beim Anlegen, Pflicht-Filter der Collection.","type":["string","null"]},"relatedUlid":{"maxLength":26,"description":"Gegen-Vorgang. Beim Lesen IMMER der „andere\" Vorgang relativ zum Anker.","type":["string","null"]},"linkType":{"enum":["relates","causes","duplicate"],"default":"relates","type":"string"},"direction":{"description":"'outgoing' (Anker → Gegen-Vorgang) oder 'incoming' (Gegen-Vorgang → Anker).","type":["string","null"]},"relatedRef":{"type":["string","null"]},"relatedTitle":{"type":["string","null"]},"relatedKind":{"description":"task | ticket — steuert das Sprungziel (/work-items vs. /tickets) im Frontend.","type":["string","null"]},"relatedStatusId":{"type":["string","null"]},"relatedPriorityId":{"type":["string","null"]},"relatedOwnerId":{"description":"Primärer Bearbeiter (User-ID) des Gegen-Vorgangs.","type":["integer","null"]},"relatedChannel":{"description":"Kanal des Gegen-Vorgangs (Ticket: mail/whatsapp/portal/…).","type":["string","null"]},"relatedClosedAt":{"type":["string","null"]},"relatedResolvedAt":{"type":["string","null"]},"relatedFirstResponseDueAt":{"type":["string","null"]},"relatedResolutionDueAt":{"type":["string","null"]},"relatedFirstRespondedAt":{"type":["string","null"]},"relatedSlaBreached":{"description":"SLA gerissen (Reaktion ODER Lösung) — wie TicketCollectionProvider.","default":false,"type":"boolean"},"relatedUpdatedAt":{"type":["string","null"]},"relatedLastMessageAt":{"description":"Zeitpunkt der jüngsten Nachricht des Gegen-Vorgangs (WorkItemMessage: sentAt ?? createdAt).","type":["string","null"]},"relatedLastMessageDirection":{"description":"Richtung der jüngsten Nachricht (in|out|internal) — „wartet auf uns\" = offen ∧ letzte Richtung in.","type":["string","null"]},"relatedMessageCount":{"description":"Nachrichten-Zahl des Gegen-Vorgangs (eine GROUP-BY-Query, kein N+1).","default":0,"type":"integer"}},"required":["workItemUlid","relatedUlid"]}],"description":"Verknüpfung zweier Vorgänge (Ticket ⇄ Aufgabe oder beliebige Work-Items), 04-04 §3/§4.5.\nPersistiert über bestehende {@see \\App\\WorkItem\\Entity\\WorkItemLink}-Tabelle, kein Umkopieren.\n\nCollection bidirektional, Pflicht-Filter `?workItemUlid=…`: liefert ALLE Links des Anker-Vorgangs\n(Quelle oder Ziel); `relatedUlid` ist beim Lesen stets der jeweils ANDERE Vorgang.\nLeisten-Felder `related*` (Doc 43): Priorität/Zuständiger/Kanal/SLA/letzte Nachricht/Zähler des\nGegen-Vorgangs — genug für die Strang-Leiste der Aufgabenseite ohne N Ticket-Abrufe."},"WorkItemList-workitemlist.read":{"type":"object","description":"Aufgabenliste (Gruppierung von WorkItems, kind=task). Lesen: workitem.read; Verwalten: workitem.list.manage.\n\nIdentifier ist ulid; numerische id zusätzlich read-only, weil {@see WorkItemResource::$listId}\ndie numerische ID referenziert (vgl. projectId-Konvention).","properties":{"id":{"description":"Numerische ID (read-only). Referenziert von WorkItem.listId.","type":["integer","null"]},"ulid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"color":{"maxLength":7,"type":["string","null"]},"description":{"maxLength":500,"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"description":"null = globale Liste, sonst projektbezogen.","type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"customerVisible":{"description":"Im Kundenportal sichtbar? Default false (intern).","type":["boolean","null"]},"externalVisible":{"description":"Für externe Mitwirkende sichtbar? Default false (Doc 27 Stufe 7, E-4).","type":["boolean","null"]},"archived":{"description":"Archiviert? Steuert {@see \\App\\WorkItem\\Entity\\WorkItemList::$archivedAt}.","type":["boolean","null"]},"taskCount":{"description":"Anzahl zugeordneter (nicht gelöschter) Aufgaben — computed, read-only.","default":0,"type":"integer"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]},"WorkItemList-workitemlist.write":{"type":"object","description":"Aufgabenliste (Gruppierung von WorkItems, kind=task). Lesen: workitem.read; Verwalten: workitem.list.manage.\n\nIdentifier ist ulid; numerische id zusätzlich read-only, weil {@see WorkItemResource::$listId}\ndie numerische ID referenziert (vgl. projectId-Konvention).","required":["name"],"properties":{"name":{"maxLength":255,"default":"","type":"string"},"color":{"maxLength":7,"type":["string","null"]},"description":{"maxLength":500,"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"description":"null = globale Liste, sonst projektbezogen.","type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"customerVisible":{"description":"Im Kundenportal sichtbar? Default false (intern).","type":["boolean","null"]},"externalVisible":{"description":"Für externe Mitwirkende sichtbar? Default false (Doc 27 Stufe 7, E-4).","type":["boolean","null"]},"archived":{"description":"Archiviert? Steuert {@see \\App\\WorkItem\\Entity\\WorkItemList::$archivedAt}.","type":["boolean","null"]}}},"WorkItemList-workitemlist.write.jsonMergePatch":{"type":"object","description":"Aufgabenliste (Gruppierung von WorkItems, kind=task). Lesen: workitem.read; Verwalten: workitem.list.manage.\n\nIdentifier ist ulid; numerische id zusätzlich read-only, weil {@see WorkItemResource::$listId}\ndie numerische ID referenziert (vgl. projectId-Konvention).","properties":{"name":{"maxLength":255,"default":"","type":"string"},"color":{"maxLength":7,"type":["string","null"]},"description":{"maxLength":500,"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"description":"null = globale Liste, sonst projektbezogen.","type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"customerVisible":{"description":"Im Kundenportal sichtbar? Default false (intern).","type":["boolean","null"]},"externalVisible":{"description":"Für externe Mitwirkende sichtbar? Default false (Doc 27 Stufe 7, E-4).","type":["boolean","null"]},"archived":{"description":"Archiviert? Steuert {@see \\App\\WorkItem\\Entity\\WorkItemList::$archivedAt}.","type":["boolean","null"]}}},"WorkItemList.jsonld-workitemlist.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Numerische ID (read-only). Referenziert von WorkItem.listId.","type":["integer","null"]},"ulid":{"type":["string","null"]},"name":{"maxLength":255,"default":"","type":"string"},"color":{"maxLength":7,"type":["string","null"]},"description":{"maxLength":500,"type":["string","null"]},"projectId":{"minimum":0,"exclusiveMinimum":0,"description":"null = globale Liste, sonst projektbezogen.","type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"sortOrder":{"type":["integer","null"]},"customerVisible":{"description":"Im Kundenportal sichtbar? Default false (intern).","type":["boolean","null"]},"externalVisible":{"description":"Für externe Mitwirkende sichtbar? Default false (Doc 27 Stufe 7, E-4).","type":["boolean","null"]},"archived":{"description":"Archiviert? Steuert {@see \\App\\WorkItem\\Entity\\WorkItemList::$archivedAt}.","type":["boolean","null"]},"taskCount":{"description":"Anzahl zugeordneter (nicht gelöschter) Aufgaben — computed, read-only.","default":0,"type":"integer"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["name"]}],"description":"Aufgabenliste (Gruppierung von WorkItems, kind=task). Lesen: workitem.read; Verwalten: workitem.list.manage.\n\nIdentifier ist ulid; numerische id zusätzlich read-only, weil {@see WorkItemResource::$listId}\ndie numerische ID referenziert (vgl. projectId-Konvention)."},"WorkItemTimeline-workitem_timeline.read":{"type":"object","description":"Paginierte, sichtbarkeitsgefilterte Unified-Timeline EINES Vorgangs: Events+Nachrichten,\nnormalisiert über {@see \\App\\WorkItem\\Service\\WorkItemTimelineAssembler}. Kanonische Quelle\nfür Frontend-Timeline ({@see WorkItemTimeline.vue}, conversations-Store).\n\nPflicht-Filter `?workItemUlid=…`: erzwingt Marken-Scope (IDOR) im Provider.\nDefault-Sortierung neueste zuerst (`?order[occurredAt]=asc` kehrt um).\n\n`?scope=own|linked` (Doc 43, ENT-TASKCOMM-01): `linked` = EIN Verlauf über den Vorgang UND die\nNachrichten aller über {@see \\App\\WorkItem\\Entity\\WorkItemLink} verbundenen Tickets — jede Zeile\nträgt ihre Herkunft (`source*`). Kein zweiter Aggregat-Pfad, kein clientseitiges Mischen.","properties":{"id":{"description":"Eintrags-ULID (Event- bzw. Message-ULID); Identifier des Timeline-Eintrags.","default":"","type":"string"},"kind":{"description":"'event' | 'message'.","default":"message","type":"string"},"type":{"default":"","type":"string"},"channel":{"description":"Kanal (mail/portal/whatsapp/internal/…); null bei Events.","type":["string","null"]},"direction":{"description":"in | out | internal; null bei Events.","type":["string","null"]},"visibility":{"description":"internal | customer.","default":"internal","type":"string"},"occurredAt":{"type":["string","null"]},"subject":{"type":["string","null"]},"body":{"type":["string","null"]},"bodyFormat":{"type":["string","null"]},"authorId":{"description":"Autor (User-ID) der Nachricht; null bei Events/externen Absendern.","type":["integer","null"]},"contactId":{"description":"Externer Teilnehmer (Contact-ID).","type":["integer","null"]},"fromEmail":{"type":["string","null"]},"isInternal":{"default":true,"type":"boolean"},"attachmentIds":{"type":["array","null"],"items":{"type":"string"}},"attachments":{"description":"Aufgelöste Anhang-Metadaten zu {@see $attachmentIds} — Frontend rendert direkt herunterladbar (kein storagePath).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"mentionedUserIds":{"type":["array","null"],"items":{"type":"integer"}},"actorType":{"description":"Akteurstyp eines Events (human|ai|automation|system); null bei Nachrichten.","type":["string","null"]},"actorId":{"description":"Akteur-ULID eines Events; null bei Nachrichten.","type":["string","null"]},"payload":{"description":"Strukturierte Event-Zusatzdaten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sourceWorkItemUlid":{"description":"ULID des Vorgangs, aus dem die Zeile stammt (Anker oder verknüpftes Ticket).","type":["string","null"]},"sourceRef":{"description":"Ref (T-1042 / A-17) des Quell-Vorgangs.","type":["string","null"]},"sourceKind":{"description":"task | ticket.","type":["string","null"]},"sourceTitle":{"type":["string","null"]},"sourceChannel":{"description":"Kanal des Quell-Vorgangs (Ticket: mail/whatsapp/…); null bei Aufgaben.","type":["string","null"]},"origin":{"description":"event | work_item_message | communication — bei `communication` ist `id` die Communication-ULID.","default":"work_item_message","type":"string"},"pinned":{"default":false,"type":"boolean"},"externalVisible":{"description":"Für externe Mitwirkende sichtbar (Doc 27 Stufe 7).","default":true,"type":"boolean"},"reactions":{"description":"Emoji → User-IDs (Doc 27 0.3); null ohne Reaktionen.","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"integer"}}},"myReactions":{"description":"Emojis des aktuellen Nutzers.","type":["array","null"],"items":{"type":"string"}},"createdBy":{"description":"Anleger-ULID des Beitrags (Blameable) — Grundlage der Bearbeiten-Berechtigung im Frontend.","type":["string","null"]},"relatedTicketUlid":{"description":"Ticket, in das eine Kundennachricht der Aufgabe geroutet wurde (Router-Breadcrumb).","type":["string","null"]},"meta":{"description":"Freie Metadaten eines Unified-Messaging-Beitrags (z. B. `documentRef {kind, ulid, number}` beim Beleg-Versand).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"deliveryStatus":{"description":"Zustell-Zustand der jüngsten OutboundDelivery eines Kanal-Beitrags (pending|sent|failed|suppressed); null ohne Versand.","type":["string","null"]},"deliveryRecipient":{"description":"Empfänger der jüngsten OutboundDelivery.","type":["string","null"]}}},"WorkItemTimeline.jsonld-workitem_timeline.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"description":"Eintrags-ULID (Event- bzw. Message-ULID); Identifier des Timeline-Eintrags.","default":"","type":"string"},"kind":{"description":"'event' | 'message'.","default":"message","type":"string"},"type":{"default":"","type":"string"},"channel":{"description":"Kanal (mail/portal/whatsapp/internal/…); null bei Events.","type":["string","null"]},"direction":{"description":"in | out | internal; null bei Events.","type":["string","null"]},"visibility":{"description":"internal | customer.","default":"internal","type":"string"},"occurredAt":{"type":["string","null"]},"subject":{"type":["string","null"]},"body":{"type":["string","null"]},"bodyFormat":{"type":["string","null"]},"authorId":{"description":"Autor (User-ID) der Nachricht; null bei Events/externen Absendern.","type":["integer","null"]},"contactId":{"description":"Externer Teilnehmer (Contact-ID).","type":["integer","null"]},"fromEmail":{"type":["string","null"]},"isInternal":{"default":true,"type":"boolean"},"attachmentIds":{"type":["array","null"],"items":{"type":"string"}},"attachments":{"description":"Aufgelöste Anhang-Metadaten zu {@see $attachmentIds} — Frontend rendert direkt herunterladbar (kein storagePath).","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]}}},"mentionedUserIds":{"type":["array","null"],"items":{"type":"integer"}},"actorType":{"description":"Akteurstyp eines Events (human|ai|automation|system); null bei Nachrichten.","type":["string","null"]},"actorId":{"description":"Akteur-ULID eines Events; null bei Nachrichten.","type":["string","null"]},"payload":{"description":"Strukturierte Event-Zusatzdaten.","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"sourceWorkItemUlid":{"description":"ULID des Vorgangs, aus dem die Zeile stammt (Anker oder verknüpftes Ticket).","type":["string","null"]},"sourceRef":{"description":"Ref (T-1042 / A-17) des Quell-Vorgangs.","type":["string","null"]},"sourceKind":{"description":"task | ticket.","type":["string","null"]},"sourceTitle":{"type":["string","null"]},"sourceChannel":{"description":"Kanal des Quell-Vorgangs (Ticket: mail/whatsapp/…); null bei Aufgaben.","type":["string","null"]},"origin":{"description":"event | work_item_message | communication — bei `communication` ist `id` die Communication-ULID.","default":"work_item_message","type":"string"},"pinned":{"default":false,"type":"boolean"},"externalVisible":{"description":"Für externe Mitwirkende sichtbar (Doc 27 Stufe 7).","default":true,"type":"boolean"},"reactions":{"description":"Emoji → User-IDs (Doc 27 0.3); null ohne Reaktionen.","type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"integer"}}},"myReactions":{"description":"Emojis des aktuellen Nutzers.","type":["array","null"],"items":{"type":"string"}},"createdBy":{"description":"Anleger-ULID des Beitrags (Blameable) — Grundlage der Bearbeiten-Berechtigung im Frontend.","type":["string","null"]},"relatedTicketUlid":{"description":"Ticket, in das eine Kundennachricht der Aufgabe geroutet wurde (Router-Breadcrumb).","type":["string","null"]},"meta":{"description":"Freie Metadaten eines Unified-Messaging-Beitrags (z. B. `documentRef {kind, ulid, number}` beim Beleg-Versand).","type":["object","null"],"additionalProperties":{"type":["string","null"]}},"deliveryStatus":{"description":"Zustell-Zustand der jüngsten OutboundDelivery eines Kanal-Beitrags (pending|sent|failed|suppressed); null ohne Versand.","type":["string","null"]},"deliveryRecipient":{"description":"Empfänger der jüngsten OutboundDelivery.","type":["string","null"]}}}],"description":"Paginierte, sichtbarkeitsgefilterte Unified-Timeline EINES Vorgangs: Events+Nachrichten,\nnormalisiert über {@see \\App\\WorkItem\\Service\\WorkItemTimelineAssembler}. Kanonische Quelle\nfür Frontend-Timeline ({@see WorkItemTimeline.vue}, conversations-Store).\n\nPflicht-Filter `?workItemUlid=…`: erzwingt Marken-Scope (IDOR) im Provider.\nDefault-Sortierung neueste zuerst (`?order[occurredAt]=asc` kehrt um).\n\n`?scope=own|linked` (Doc 43, ENT-TASKCOMM-01): `linked` = EIN Verlauf über den Vorgang UND die\nNachrichten aller über {@see \\App\\WorkItem\\Entity\\WorkItemLink} verbundenen Tickets — jede Zeile\nträgt ihre Herkunft (`source*`). Kein zweiter Aggregat-Pfad, kein clientseitiges Mischen."},"WorkforceAttendanceDay-workforce_day.read":{"type":"object","description":"Tagesarbeitszeit (04-32 §8) — Liste/Detail Anwesenheitstage; Aktionen approve/correct.\nKennzahlen read-only, aggregiert aus Stempelungen.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"employeeId":{"type":["integer","null"]},"workDate":{"type":["string","null"]},"status":{"type":["string","null"]},"grossMinutes":{"type":["integer","null"]},"breakMinutes":{"type":["integer","null"]},"netMinutes":{"type":["integer","null"]},"targetMinutes":{"type":["integer","null"]},"balanceMinutes":{"description":"Saldo Netto − Soll in Minuten (Über-/Unterstunden).","type":["integer","null"]},"firstInAt":{"type":["string","null"]},"lastOutAt":{"type":["string","null"]},"openSegment":{"type":["boolean","null"]},"complianceFlags":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"approverId":{"type":["integer","null"]},"decidedAt":{"type":["string","null"]},"decisionNote":{"maxLength":255,"type":["string","null"]},"brandId":{"type":["integer","null"]},"periodLocked":{"description":"Zeitraum gesperrt (04-32 Stufe E)? Read-only; UI blendet dann Aktionen aus (API liefert sonst 422).","type":["boolean","null"]}}},"WorkforceAttendanceDay-workforce_day.write":{"type":"object","description":"Tagesarbeitszeit (04-32 §8) — Liste/Detail Anwesenheitstage; Aktionen approve/correct.\nKennzahlen read-only, aggregiert aus Stempelungen.","properties":{"decisionNote":{"maxLength":255,"type":["string","null"]},"action":{"enum":["add","reverse"],"type":["string","null"]},"reason":{"maxLength":255,"type":["string","null"]},"type":{"enum":["clock_in","clock_out","break_start","break_end"],"description":"Nachtrag (action=add): Stempel-Typ.","type":["string","null"]},"occurredAt":{"description":"Nachtrag (action=add): Zeitpunkt.","type":["string","null"]},"eventUlid":{"description":"Gegenbuchung (action=reverse): ULID der zu stornierenden Stempelung.","type":["string","null"]}}},"WorkforceAttendanceDay.jsonld-workforce_day.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"employeeId":{"type":["integer","null"]},"workDate":{"type":["string","null"]},"status":{"type":["string","null"]},"grossMinutes":{"type":["integer","null"]},"breakMinutes":{"type":["integer","null"]},"netMinutes":{"type":["integer","null"]},"targetMinutes":{"type":["integer","null"]},"balanceMinutes":{"description":"Saldo Netto − Soll in Minuten (Über-/Unterstunden).","type":["integer","null"]},"firstInAt":{"type":["string","null"]},"lastOutAt":{"type":["string","null"]},"openSegment":{"type":["boolean","null"]},"complianceFlags":{"type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"approverId":{"type":["integer","null"]},"decidedAt":{"type":["string","null"]},"decisionNote":{"maxLength":255,"type":["string","null"]},"brandId":{"type":["integer","null"]},"periodLocked":{"description":"Zeitraum gesperrt (04-32 Stufe E)? Read-only; UI blendet dann Aktionen aus (API liefert sonst 422).","type":["boolean","null"]}}}],"description":"Tagesarbeitszeit (04-32 §8) — Liste/Detail Anwesenheitstage; Aktionen approve/correct.\nKennzahlen read-only, aggregiert aus Stempelungen."},"WorkforceAttendanceEvent-workforce_event.read":{"type":"object","description":"Stempelung (04-32 §8): Live-Stempeln, idempotenter Offline-Sync, Liste der Stempelungen.\nAnwesenheitszeit — bewusst getrennt von Projektzeit (src/Time).","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"employeeId":{"type":["integer","null"]},"workDate":{"type":["string","null"]},"type":{"enum":["clock_in","clock_out","break_start","break_end"],"type":["string","null"]},"occurredAt":{"type":["string","null"]},"source":{"type":["string","null"]},"clientEventId":{"maxLength":64,"description":"Idempotenz-Anker der Offline-Erfassung.","type":["string","null"]},"latitude":{"pattern":"^(.*(^-?(?:90(?:\\.0{1,7})?|[0-8]?\\d(?:\\.\\d{1,7})?)$).*)$","description":"Breitengrad (decimal(10,7)): ±90, max. 7 Nachkommastellen — Muster begrenzt die Feldbreite (kein DB-Overflow-500).","type":["string","null"]},"longitude":{"pattern":"^(.*(^-?(?:180(?:\\.0{1,7})?|1[0-7]\\d(?:\\.\\d{1,7})?|\\d{1,2}(?:\\.\\d{1,7})?)$).*)$","description":"Längengrad (decimal(10,7)): ±180, max. 7 Nachkommastellen.","type":["string","null"]},"gpsAccuracy":{"type":["integer","null"]},"deviceId":{"maxLength":64,"type":["string","null"]},"note":{"maxLength":255,"type":["string","null"]},"reversalOfId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"syncedCount":{"description":"Nur in der Sync-Antwort: Anzahl neu übernommener Stempelungen.","type":["integer","null"]}}},"WorkforceAttendanceEvent-workforce_event.write":{"type":"object","description":"Stempelung (04-32 §8): Live-Stempeln, idempotenter Offline-Sync, Liste der Stempelungen.\nAnwesenheitszeit — bewusst getrennt von Projektzeit (src/Time).","properties":{"type":{"enum":["clock_in","clock_out","break_start","break_end"],"type":["string","null"]},"occurredAt":{"type":["string","null"]},"source":{"type":["string","null"]},"clientEventId":{"maxLength":64,"description":"Idempotenz-Anker der Offline-Erfassung.","type":["string","null"]},"latitude":{"pattern":"^(.*(^-?(?:90(?:\\.0{1,7})?|[0-8]?\\d(?:\\.\\d{1,7})?)$).*)$","description":"Breitengrad (decimal(10,7)): ±90, max. 7 Nachkommastellen — Muster begrenzt die Feldbreite (kein DB-Overflow-500).","type":["string","null"]},"longitude":{"pattern":"^(.*(^-?(?:180(?:\\.0{1,7})?|1[0-7]\\d(?:\\.\\d{1,7})?|\\d{1,2}(?:\\.\\d{1,7})?)$).*)$","description":"Längengrad (decimal(10,7)): ±180, max. 7 Nachkommastellen.","type":["string","null"]},"gpsAccuracy":{"type":["integer","null"]},"deviceId":{"maxLength":64,"type":["string","null"]},"note":{"maxLength":255,"type":["string","null"]},"events":{"description":"Nur Sync-Operation: Liste offline erfasster Stempelungen\n({type, occurredAt, clientEventId, source?, latitude?, longitude?, gpsAccuracy?, deviceId?, note?}).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"WorkforceAttendanceEvent.jsonld-workforce_event.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"employeeId":{"type":["integer","null"]},"workDate":{"type":["string","null"]},"type":{"enum":["clock_in","clock_out","break_start","break_end"],"type":["string","null"]},"occurredAt":{"type":["string","null"]},"source":{"type":["string","null"]},"clientEventId":{"maxLength":64,"description":"Idempotenz-Anker der Offline-Erfassung.","type":["string","null"]},"latitude":{"pattern":"^(.*(^-?(?:90(?:\\.0{1,7})?|[0-8]?\\d(?:\\.\\d{1,7})?)$).*)$","description":"Breitengrad (decimal(10,7)): ±90, max. 7 Nachkommastellen — Muster begrenzt die Feldbreite (kein DB-Overflow-500).","type":["string","null"]},"longitude":{"pattern":"^(.*(^-?(?:180(?:\\.0{1,7})?|1[0-7]\\d(?:\\.\\d{1,7})?|\\d{1,2}(?:\\.\\d{1,7})?)$).*)$","description":"Längengrad (decimal(10,7)): ±180, max. 7 Nachkommastellen.","type":["string","null"]},"gpsAccuracy":{"type":["integer","null"]},"deviceId":{"maxLength":64,"type":["string","null"]},"note":{"maxLength":255,"type":["string","null"]},"reversalOfId":{"type":["integer","null"]},"brandId":{"type":["integer","null"]},"syncedCount":{"description":"Nur in der Sync-Antwort: Anzahl neu übernommener Stempelungen.","type":["integer","null"]}}}],"description":"Stempelung (04-32 §8): Live-Stempeln, idempotenter Offline-Sync, Liste der Stempelungen.\nAnwesenheitszeit — bewusst getrennt von Projektzeit (src/Time)."},"WorkforceClockState-workforce_clock_state.read":{"type":"object","description":"Stempel-Zustand des angemeldeten Mitarbeiters (04-32 §8) fürs Widget + heutige Tages-Aggregation.\nEin-Element-Collection (Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}).","properties":{"id":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"state":{"description":"out | working | on_break","type":["string","null"]},"lastEventAt":{"description":"Zeitpunkt der jüngsten (nicht gegengebuchten) Stempelung.","type":["string","null"]},"workDate":{"type":["string","null"]},"todayGrossMinutes":{"type":["integer","null"]},"todayBreakMinutes":{"type":["integer","null"]},"todayNetMinutes":{"type":["integer","null"]},"todayTargetMinutes":{"type":["integer","null"]}}},"WorkforceClockState.jsonld-workforce_clock_state.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"employeeId":{"type":["integer","null"]},"state":{"description":"out | working | on_break","type":["string","null"]},"lastEventAt":{"description":"Zeitpunkt der jüngsten (nicht gegengebuchten) Stempelung.","type":["string","null"]},"workDate":{"type":["string","null"]},"todayGrossMinutes":{"type":["integer","null"]},"todayBreakMinutes":{"type":["integer","null"]},"todayNetMinutes":{"type":["integer","null"]},"todayTargetMinutes":{"type":["integer","null"]}}}],"description":"Stempel-Zustand des angemeldeten Mitarbeiters (04-32 §8) fürs Widget + heutige Tages-Aggregation.\nEin-Element-Collection (Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource})."},"WorkforcePayrollExport-workforce_payroll.read":{"type":"object","description":"Monatlicher Lohn-Export (04-32 Stufe E, Recht `workforce.export.payroll`).\n\n - `GET /v1/workforce/payroll-export` — Lohnart-Zeilen als JSON (gleiche Daten wie Datei-Download, P-1/P-2).\n - `GET /v1/workforce/payroll-export/file` — Download DATEV-LODAS (Default) oder CSV.\n\nQuelle: freigegebene Anwesenheitstage + Konto-Deltas + genehmigte bezahlte Abwesenheiten\n({@see \\Octi\\Plugin\\Workforce\\Service\\PayrollExportService}). Ungesperrter Monat → Warnung,\nkein Blocker. Marken-IDOR: fremde `brandId` → 404.","properties":{"ulid":{"description":"Synthetische ULID (Aggregat-Antwort ohne Entity — Muster Shift-Publish).","type":["string","null"]},"month":{"description":"Kalendermonat `YYYY-MM`.","type":["string","null"]},"brandId":{"description":"Angeforderte Marke (`null` = gesamter Marken-Scope des Aufrufers).","type":["integer","null"]},"locked":{"description":"Ist der komplette Monat im angeforderten Scope zeitraum-gesperrt?","type":["boolean","null"]},"warnings":{"description":"Warnungen (z. B. „Monat noch nicht gesperrt\") — bewusst kein Blocker.","type":["array","null"],"items":{"type":"string"}},"rows":{"description":"Lohnart-Zeilen: Mitarbeiter × Lohnart mit Wert (Stunden industriell bzw. Tage).","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}]}}}}},"WorkforcePayrollExport.jsonld-workforce_payroll.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"description":"Synthetische ULID (Aggregat-Antwort ohne Entity — Muster Shift-Publish).","type":["string","null"]},"month":{"description":"Kalendermonat `YYYY-MM`.","type":["string","null"]},"brandId":{"description":"Angeforderte Marke (`null` = gesamter Marken-Scope des Aufrufers).","type":["integer","null"]},"locked":{"description":"Ist der komplette Monat im angeforderten Scope zeitraum-gesperrt?","type":["boolean","null"]},"warnings":{"description":"Warnungen (z. B. „Monat noch nicht gesperrt\") — bewusst kein Blocker.","type":["array","null"],"items":{"type":"string"}},"rows":{"description":"Lohnart-Zeilen: Mitarbeiter × Lohnart mit Wert (Stunden industriell bzw. Tage).","type":["array","null"],"items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}]}}}}}],"description":"Monatlicher Lohn-Export (04-32 Stufe E, Recht `workforce.export.payroll`).\n\n - `GET /v1/workforce/payroll-export` — Lohnart-Zeilen als JSON (gleiche Daten wie Datei-Download, P-1/P-2).\n - `GET /v1/workforce/payroll-export/file` — Download DATEV-LODAS (Default) oder CSV.\n\nQuelle: freigegebene Anwesenheitstage + Konto-Deltas + genehmigte bezahlte Abwesenheiten\n({@see \\Octi\\Plugin\\Workforce\\Service\\PayrollExportService}). Ungesperrter Monat → Warnung,\nkein Blocker. Marken-IDOR: fremde `brandId` → 404."},"WorkforcePeriodLock-workforce_period_lock.read":{"type":"object","description":"Zeitraum-Sperre Lohnabrechnung (04-32 Stufe E, „Monatsabschluss\"): Marke × Zeitraum friert\nAnwesenheits-/Konto-/Schicht-Schreibpfade ein (422).\n\n - Anlegen: `workforce.period_lock.manage`, per Monat oder freiem Zeitraum.\n - Aufheben: separates Recht `workforce.period_lock.release` (Soft-Delete, Audit).\n - Marken-IDOR: fremde Marke → 404; `brandId = null` nur für markenübergreifende Rechteinhaber.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Marke der Sperre; `null` = alle Marken (nur markenübergreifend anlegbar).","type":["integer","null"]},"periodStart":{"description":"Erster gesperrter Tag (`Y-m-d`, einschließlich).","type":["string","null"]},"periodEnd":{"description":"Letzter gesperrter Tag (`Y-m-d`, einschließlich).","type":["string","null"]},"note":{"maxLength":255,"type":["string","null"]},"lockedAt":{"description":"Gesperrt am (read-only).","type":["string","null"]},"lockedBy":{"description":"Gesperrt von (User-ULID, read-only — Blameable).","type":["string","null"]}}},"WorkforcePeriodLock-workforce_period_lock.write":{"type":"object","description":"Zeitraum-Sperre Lohnabrechnung (04-32 Stufe E, „Monatsabschluss\"): Marke × Zeitraum friert\nAnwesenheits-/Konto-/Schicht-Schreibpfade ein (422).\n\n - Anlegen: `workforce.period_lock.manage`, per Monat oder freiem Zeitraum.\n - Aufheben: separates Recht `workforce.period_lock.release` (Soft-Delete, Audit).\n - Marken-IDOR: fremde Marke → 404; `brandId = null` nur für markenübergreifende Rechteinhaber.","properties":{"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Marke der Sperre; `null` = alle Marken (nur markenübergreifend anlegbar).","type":["integer","null"]},"month":{"pattern":"^(.*(^\\d{4}-(0[1-9]|1[0-2])$).*)$","description":"Komfort-Eingabe `YYYY-MM` — setzt periodStart/periodEnd auf Monatsgrenzen, übersteuert diese.","type":["string","null"]},"periodStart":{"description":"Erster gesperrter Tag (`Y-m-d`, einschließlich).","type":["string","null"]},"periodEnd":{"description":"Letzter gesperrter Tag (`Y-m-d`, einschließlich).","type":["string","null"]},"note":{"maxLength":255,"type":["string","null"]}}},"WorkforcePeriodLock.jsonld-workforce_period_lock.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"brandId":{"minimum":0,"exclusiveMinimum":0,"description":"Marke der Sperre; `null` = alle Marken (nur markenübergreifend anlegbar).","type":["integer","null"]},"periodStart":{"description":"Erster gesperrter Tag (`Y-m-d`, einschließlich).","type":["string","null"]},"periodEnd":{"description":"Letzter gesperrter Tag (`Y-m-d`, einschließlich).","type":["string","null"]},"note":{"maxLength":255,"type":["string","null"]},"lockedAt":{"description":"Gesperrt am (read-only).","type":["string","null"]},"lockedBy":{"description":"Gesperrt von (User-ULID, read-only — Blameable).","type":["string","null"]}}}],"description":"Zeitraum-Sperre Lohnabrechnung (04-32 Stufe E, „Monatsabschluss\"): Marke × Zeitraum friert\nAnwesenheits-/Konto-/Schicht-Schreibpfade ein (422).\n\n - Anlegen: `workforce.period_lock.manage`, per Monat oder freiem Zeitraum.\n - Aufheben: separates Recht `workforce.period_lock.release` (Soft-Delete, Audit).\n - Marken-IDOR: fremde Marke → 404; `brandId = null` nur für markenübergreifende Rechteinhaber."},"WorkforceShift-workforce_shift.read":{"type":"object","description":"Schichtplan (04-32 Stufe D): Wochen-Abfrage, CRUD (`workforce.shift.manage`), Publish\n(`workforce.shift.publish`) mit Mitarbeiter-Benachrichtigung.\n\n - Mitarbeiter sehen nur VERÖFFENTLICHTE Schichten.\n - Konflikt-Checks: harte Konflikte → 422, Warnungen im Feld `warnings`.\n - Marken-IDOR: fremde Marke → 404.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"workDate":{"description":"Starttag der Schicht (`Y-m-d`, Wandzeit des Mitarbeiters).","type":["string","null"]},"templateId":{"minimum":0,"exclusiveMinimum":0,"description":"Vorlage: Zeiten/Pause werden beim Anlegen KOPIERT (explizite Zeiten übersteuern).","type":["integer","null"]},"templateName":{"description":"Name der Vorlage (read-only, aufgelöst).","type":["string","null"]},"color":{"description":"Chip-Farbe der Vorlage (read-only, aufgelöst).","type":["string","null"]},"startTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Beginn als Wandzeit `HH:MM`.","type":["string","null"]},"endTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Ende als Wandzeit `HH:MM`; Ende <= Beginn bedeutet Schichtende am Folgetag.","type":["string","null"]},"breakMinutes":{"minimum":0,"type":["integer","null"]},"status":{"description":"planned | published (harter Workflow-Zustand — Publish nur über `POST .../publish`).","type":["string","null"]},"note":{"maxLength":255,"type":["string","null"]},"overnight":{"description":"Über-Mitternacht-Schicht (read-only, abgeleitet).","type":["boolean","null"]},"publishedAt":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"warnings":{"description":"Nicht-blockierende Konflikt-Warnungen (Halbtags-Abwesenheit, Feiertag) — transient,\nnur in POST/PATCH-Antwort.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"publishedCount":{"description":"Nur in der Publish-Antwort: Anzahl veröffentlichter Schichten.","type":["integer","null"]},"notifiedEmployees":{"description":"Nur in der Publish-Antwort: Anzahl benachrichtigter Mitarbeiter.","type":["integer","null"]}}},"WorkforceShift-workforce_shift.write":{"type":"object","description":"Schichtplan (04-32 Stufe D): Wochen-Abfrage, CRUD (`workforce.shift.manage`), Publish\n(`workforce.shift.publish`) mit Mitarbeiter-Benachrichtigung.\n\n - Mitarbeiter sehen nur VERÖFFENTLICHTE Schichten.\n - Konflikt-Checks: harte Konflikte → 422, Warnungen im Feld `warnings`.\n - Marken-IDOR: fremde Marke → 404.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"workDate":{"description":"Starttag der Schicht (`Y-m-d`, Wandzeit des Mitarbeiters).","type":["string","null"]},"templateId":{"minimum":0,"exclusiveMinimum":0,"description":"Vorlage: Zeiten/Pause werden beim Anlegen KOPIERT (explizite Zeiten übersteuern).","type":["integer","null"]},"startTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Beginn als Wandzeit `HH:MM`.","type":["string","null"]},"endTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Ende als Wandzeit `HH:MM`; Ende <= Beginn bedeutet Schichtende am Folgetag.","type":["string","null"]},"breakMinutes":{"minimum":0,"type":["integer","null"]},"note":{"maxLength":255,"type":["string","null"]},"from":{"description":"Nur publish: Zeitraum-Beginn (`Y-m-d`).","type":["string","null"]},"to":{"description":"Nur publish: Zeitraum-Ende (`Y-m-d`, einschließlich).","type":["string","null"]}}},"WorkforceShift-workforce_shift.write.jsonMergePatch":{"type":"object","description":"Schichtplan (04-32 Stufe D): Wochen-Abfrage, CRUD (`workforce.shift.manage`), Publish\n(`workforce.shift.publish`) mit Mitarbeiter-Benachrichtigung.\n\n - Mitarbeiter sehen nur VERÖFFENTLICHTE Schichten.\n - Konflikt-Checks: harte Konflikte → 422, Warnungen im Feld `warnings`.\n - Marken-IDOR: fremde Marke → 404.","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"workDate":{"description":"Starttag der Schicht (`Y-m-d`, Wandzeit des Mitarbeiters).","type":["string","null"]},"templateId":{"minimum":0,"exclusiveMinimum":0,"description":"Vorlage: Zeiten/Pause werden beim Anlegen KOPIERT (explizite Zeiten übersteuern).","type":["integer","null"]},"startTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Beginn als Wandzeit `HH:MM`.","type":["string","null"]},"endTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Ende als Wandzeit `HH:MM`; Ende <= Beginn bedeutet Schichtende am Folgetag.","type":["string","null"]},"breakMinutes":{"minimum":0,"type":["integer","null"]},"note":{"maxLength":255,"type":["string","null"]},"from":{"description":"Nur publish: Zeitraum-Beginn (`Y-m-d`).","type":["string","null"]},"to":{"description":"Nur publish: Zeitraum-Ende (`Y-m-d`, einschließlich).","type":["string","null"]}}},"WorkforceShift.jsonld-workforce_shift.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"workDate":{"description":"Starttag der Schicht (`Y-m-d`, Wandzeit des Mitarbeiters).","type":["string","null"]},"templateId":{"minimum":0,"exclusiveMinimum":0,"description":"Vorlage: Zeiten/Pause werden beim Anlegen KOPIERT (explizite Zeiten übersteuern).","type":["integer","null"]},"templateName":{"description":"Name der Vorlage (read-only, aufgelöst).","type":["string","null"]},"color":{"description":"Chip-Farbe der Vorlage (read-only, aufgelöst).","type":["string","null"]},"startTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Beginn als Wandzeit `HH:MM`.","type":["string","null"]},"endTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Ende als Wandzeit `HH:MM`; Ende <= Beginn bedeutet Schichtende am Folgetag.","type":["string","null"]},"breakMinutes":{"minimum":0,"type":["integer","null"]},"status":{"description":"planned | published (harter Workflow-Zustand — Publish nur über `POST .../publish`).","type":["string","null"]},"note":{"maxLength":255,"type":["string","null"]},"overnight":{"description":"Über-Mitternacht-Schicht (read-only, abgeleitet).","type":["boolean","null"]},"publishedAt":{"type":["string","null"]},"brandId":{"type":["integer","null"]},"warnings":{"description":"Nicht-blockierende Konflikt-Warnungen (Halbtags-Abwesenheit, Feiertag) — transient,\nnur in POST/PATCH-Antwort.","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":"string"}}},"publishedCount":{"description":"Nur in der Publish-Antwort: Anzahl veröffentlichter Schichten.","type":["integer","null"]},"notifiedEmployees":{"description":"Nur in der Publish-Antwort: Anzahl benachrichtigter Mitarbeiter.","type":["integer","null"]}}}],"description":"Schichtplan (04-32 Stufe D): Wochen-Abfrage, CRUD (`workforce.shift.manage`), Publish\n(`workforce.shift.publish`) mit Mitarbeiter-Benachrichtigung.\n\n - Mitarbeiter sehen nur VERÖFFENTLICHTE Schichten.\n - Konflikt-Checks: harte Konflikte → 422, Warnungen im Feld `warnings`.\n - Marken-IDOR: fremde Marke → 404."},"WorkforceShiftTemplate-workforce_shift_tpl.read":{"type":"object","description":"Schichtvorlagen (04-32 Stufe D): benannte Zeitfenster (Wandzeit, ggf. über Mitternacht) + Farbe,\nStandard-Pause, optionaler Arbeitsbereich.\n\n - Lesen: alle Schichtplan-Sichten; Pflege: `workforce.shift.manage`.\n - Marken-IDOR: fremde Marke → 404.","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":100,"type":["string","null"]},"startTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Beginn als Wandzeit `HH:MM`.","type":["string","null"]},"endTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Ende als Wandzeit `HH:MM`; Ende <= Beginn bedeutet Schichtende am Folgetag.","type":["string","null"]},"breakMinutes":{"minimum":0,"type":["integer","null"]},"color":{"maxLength":20,"type":["string","null"]},"area":{"maxLength":100,"description":"Optionaler Arbeitsbereich/Standort (Crewmeister-Vorbild).","type":["string","null"]},"active":{"type":["boolean","null"]},"overnight":{"description":"Über-Mitternacht-Vorlage (read-only, abgeleitet).","type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"WorkforceShiftTemplate-workforce_shift_tpl.write":{"type":"object","description":"Schichtvorlagen (04-32 Stufe D): benannte Zeitfenster (Wandzeit, ggf. über Mitternacht) + Farbe,\nStandard-Pause, optionaler Arbeitsbereich.\n\n - Lesen: alle Schichtplan-Sichten; Pflege: `workforce.shift.manage`.\n - Marken-IDOR: fremde Marke → 404.","properties":{"name":{"maxLength":100,"type":["string","null"]},"startTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Beginn als Wandzeit `HH:MM`.","type":["string","null"]},"endTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Ende als Wandzeit `HH:MM`; Ende <= Beginn bedeutet Schichtende am Folgetag.","type":["string","null"]},"breakMinutes":{"minimum":0,"type":["integer","null"]},"color":{"maxLength":20,"type":["string","null"]},"area":{"maxLength":100,"description":"Optionaler Arbeitsbereich/Standort (Crewmeister-Vorbild).","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"WorkforceShiftTemplate-workforce_shift_tpl.write.jsonMergePatch":{"type":"object","description":"Schichtvorlagen (04-32 Stufe D): benannte Zeitfenster (Wandzeit, ggf. über Mitternacht) + Farbe,\nStandard-Pause, optionaler Arbeitsbereich.\n\n - Lesen: alle Schichtplan-Sichten; Pflege: `workforce.shift.manage`.\n - Marken-IDOR: fremde Marke → 404.","properties":{"name":{"maxLength":100,"type":["string","null"]},"startTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Beginn als Wandzeit `HH:MM`.","type":["string","null"]},"endTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Ende als Wandzeit `HH:MM`; Ende <= Beginn bedeutet Schichtende am Folgetag.","type":["string","null"]},"breakMinutes":{"minimum":0,"type":["integer","null"]},"color":{"maxLength":20,"type":["string","null"]},"area":{"maxLength":100,"description":"Optionaler Arbeitsbereich/Standort (Crewmeister-Vorbild).","type":["string","null"]},"active":{"type":["boolean","null"]},"brandId":{"type":["integer","null"]}}},"WorkforceShiftTemplate.jsonld-workforce_shift_tpl.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"ulid":{"type":["string","null"]},"id":{"type":["integer","null"]},"name":{"maxLength":100,"type":["string","null"]},"startTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Beginn als Wandzeit `HH:MM`.","type":["string","null"]},"endTime":{"pattern":"^(.*(^([01]\\d|2[0-3]):[0-5]\\d$).*)$","description":"Ende als Wandzeit `HH:MM`; Ende <= Beginn bedeutet Schichtende am Folgetag.","type":["string","null"]},"breakMinutes":{"minimum":0,"type":["integer","null"]},"color":{"maxLength":20,"type":["string","null"]},"area":{"maxLength":100,"description":"Optionaler Arbeitsbereich/Standort (Crewmeister-Vorbild).","type":["string","null"]},"active":{"type":["boolean","null"]},"overnight":{"description":"Über-Mitternacht-Vorlage (read-only, abgeleitet).","type":["boolean","null"]},"brandId":{"type":["integer","null"]}}}],"description":"Schichtvorlagen (04-32 Stufe D): benannte Zeitfenster (Wandzeit, ggf. über Mitternacht) + Farbe,\nStandard-Pause, optionaler Arbeitsbereich.\n\n - Lesen: alle Schichtplan-Sichten; Pflege: `workforce.shift.manage`.\n - Marken-IDOR: fremde Marke → 404."},"WorkforceWorkTimeAccount-workforce_account.read":{"type":"object","description":"Arbeitszeitkonto (04-32 §B): Saldo + jüngste Ledger-Buchungen (eigener Mitarbeiter oder\n`?employeeId` mit `view_any`) + manuelle Korrektur (`.../adjust`).\nEin-Element-Collection (Muster ClockState/LicenseSummary).","properties":{"id":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"balanceMinutes":{"description":"Kontosaldo in Minuten (positiv = Überstunden).","type":["integer","null"]},"ledger":{"description":"Jüngste Buchungen ({ulid, postedOn, type, minutes, sourceRef, note}).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"WorkforceWorkTimeAccount-workforce_account.write":{"type":"object","description":"Arbeitszeitkonto (04-32 §B): Saldo + jüngste Ledger-Buchungen (eigener Mitarbeiter oder\n`?employeeId` mit `view_any`) + manuelle Korrektur (`.../adjust`).\nEin-Element-Collection (Muster ClockState/LicenseSummary).","properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"minutes":{"description":"Nur für .../adjust: vorzeichenbehaftete Korrektur-Minuten.","type":["integer","null"]},"note":{"maxLength":255,"description":"Nur für .../adjust: Begründung.","type":["string","null"]}}},"WorkforceWorkTimeAccount.jsonld-workforce_account.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","properties":{"id":{"type":["string","null"]},"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"balanceMinutes":{"description":"Kontosaldo in Minuten (positiv = Überstunden).","type":["integer","null"]},"ledger":{"description":"Jüngste Buchungen ({ulid, postedOn, type, minutes, sourceRef, note}).","type":["array","null"],"items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}}],"description":"Arbeitszeitkonto (04-32 §B): Saldo + jüngste Ledger-Buchungen (eigener Mitarbeiter oder\n`?employeeId` mit `view_any`) + manuelle Korrektur (`.../adjust`).\nEin-Element-Collection (Muster ClockState/LicenseSummary)."},"WorkloadAutofix-workloadautofix.read":{"type":"object","description":"Umplanungs-Vorschläge bei Überlast (Doc 27 5.3) — **Vorschau, dann Bestätigung**.\n\n`…/workload-autofix` rechnet die überbuchten Tage aus und schlägt Verschiebungen vor, ohne etwas\nzu ändern. Erst `…/workload-autofix/apply` schreibt die vom Nutzer bestätigten Verschiebungen —\nund auch dann nur an Aufgaben, die dem Mitarbeiter zugewiesen sind.","required":["employeeId"],"properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"overloads":{"description":"Überbuchte Tage im Zeitraum — entstehen OHNE KI und sind daher immer belastbar.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"suggestions":{"description":"Vorgeschlagene Verschiebungen (leer ohne konfigurierte KI oder ohne plausiblen Vorschlag).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"appliedMoves":{"description":"Anzahl tatsächlich verschobener Aufgaben (`apply`).","type":["integer","null"]}}},"WorkloadAutofix-workloadautofix.write":{"type":"object","description":"Umplanungs-Vorschläge bei Überlast (Doc 27 5.3) — **Vorschau, dann Bestätigung**.\n\n`…/workload-autofix` rechnet die überbuchten Tage aus und schlägt Verschiebungen vor, ohne etwas\nzu ändern. Erst `…/workload-autofix/apply` schreibt die vom Nutzer bestätigten Verschiebungen —\nund auch dann nur an Aufgaben, die dem Mitarbeiter zugewiesen sind.","required":["employeeId"],"properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"from":{"description":"Betrachteter Zeitraum (Y-m-d); Default: heute bis in 30 Tagen.","type":["string","null"]},"to":{"type":["string","null"]},"moves":{"description":"Zu übernehmende Verschiebungen (nur `apply`) — die vom Nutzer bestätigte Teilmenge der Vorschau.","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}}}},"WorkloadAutofix.jsonld-workloadautofix.read":{"allOf":[{"$ref":"#/components/schemas/HydraItemBaseSchema"},{"type":"object","required":["employeeId"],"properties":{"employeeId":{"minimum":0,"exclusiveMinimum":0,"type":["integer","null"]},"overloads":{"description":"Überbuchte Tage im Zeitraum — entstehen OHNE KI und sind daher immer belastbar.","type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]}}},"suggestions":{"description":"Vorgeschlagene Verschiebungen (leer ohne konfigurierte KI oder ohne plausiblen Vorschlag).","type":"array","items":{"type":"object","additionalProperties":{"type":["string","null"]}}},"appliedMoves":{"description":"Anzahl tatsächlich verschobener Aufgaben (`apply`).","type":["integer","null"]}}}],"description":"Umplanungs-Vorschläge bei Überlast (Doc 27 5.3) — **Vorschau, dann Bestätigung**.\n\n`…/workload-autofix` rechnet die überbuchten Tage aus und schlägt Verschiebungen vor, ohne etwas\nzu ändern. Erst `…/workload-autofix/apply` schreibt die vom Nutzer bestätigten Verschiebungen —\nund auch dann nur an Aufgaben, die dem Mitarbeiter zugewiesen sind."}},"responses":{},"parameters":{},"examples":{},"requestBodies":{},"headers":{},"securitySchemes":{"Bearer":{"type":"apiKey","description":"Value for the Authorization header parameter.","name":"Authorization","in":"header"}}},"security":[{"Bearer":[]}],"tags":[{"name":"HrHolidayCalendar","description":"Feiertagskalender je Region (04-08 §6.2, H5).\n- Core-Plattform-Stammdaten, nicht pluginfähig: speist OctiHr/OctiTime/OctiPlanning.\n- `holidays`: Feiertagsliste (Datum/Name/halber Tag); PATCH ersetzt sie vollständig."},{"name":"AssistantAgent","description":"AI-Workspace-Agent (Doc 30 W5): user-baubare Konfiguration. Nutzer-eigen (Ownership im Provider/\nProcessor); Teilen über `visibility`. `platform.assistant.manage` regelt Governance (Approval,\n`whitelisted`-Autonomie), nicht das bloße Anlegen eigener Agenten."},{"name":"AssistantAgentRun","description":"Agenten-Lauf (Doc 30 W7): startet einen Agenten in einem Thread bzw. löst ein Schreib-Confirm ein.\nAntwort ist die (finale) Assistenten-Nachricht ODER — bei einer schreibenden Aktion — eine Vorschau\nmit signiertem Confirm-Token (`needsConfirm=true`), das über `/run-confirm` eingelöst wird."},{"name":"AssistantMessage","description":"AI-Workspace-Nachricht (Doc 30 W1). POST = Chat-Senden: erzeugt die Nutzer-Nachricht, ruft das\nGateway (Budget/Audit automatisch) und gibt die Assistenten-Antwort zurück. Zugriff strikt über den\nbesitzenden Thread (IDOR-Schutz im Provider/Processor)."},{"name":"AssistantModel","description":"Wählbares Chat-Modell (Doc 30 W3). Read-only Katalog aus {@see \\App\\Platform\\LlmGateway\\AiProviderCatalog}\n(+ „Automatisch\"). `key` = \"provider:model\" bzw. \"auto\"; wird als AssistantThread.modelRoute gespeichert."},{"name":"AssistantRun","description":"LAUF-EINSICHT eines Agenten-Laufs (Doc 41 B-04/ENT-KIH-03): Schritt-für-Schritt-Aufriss mit\nWerkzeugname, Argumenten, Begründung, Dauer und Kosten — plus der Sub-Läufe, an die delegiert wurde.\n\nDER BEFUND: das Datenmodell trug all das längst (`parentRunId`, `depth`, `status`, `stepCount`,\n`costCents`, Zeitstempel), die Ressource deklarierte aber NUR zwei POST-Operationen. Ein Lauf war\nüber die API nicht abrufbar — „warum hat der Agent das getan\" damit auch nicht beantwortbar.\n\nSichtbarkeit: strikt der eigene Lauf (über den besitzenden Staff-Thread). Ein fremder Lauf\nantwortet 403, ein unbekannter 404."},{"name":"AssistantSkill","description":"AI-Workspace-Skill/-Prompt (Doc 30 W6). Bibliotheks-Baustein: system/provider-geseedet (create-only\ngesynct, mit `platform.assistant.manage` änderbar und über `reset` zurückdrehbar) ODER user-angelegt\n(nutzer-eigen, teilbar über `visibility`)."},{"name":"AssistantSpace","description":"AI-Workspace-Space (Doc 30 W2). Nutzer-eigen; Sichtbarkeit über Provider/Processor-Ownership erzwungen\n(kein `platform.assistant.manage` — das ist Governance für Agenten/Skills, Stufe 4+)."},{"name":"AssistantThread","description":"AI-Workspace-Thread (Doc 30 W1). Strikt nutzer-eigen (IDOR-Schutz im Provider/Processor).\nItem-GET liefert den Verlauf (`messages`) mit (Gruppe assistant_thread:item)."},{"name":"AssistantTool","description":"Verfügbares Agenten-Werkzeug (Doc 30 W5/W7): read-only Katalog der kuratierten MCP-Commands für den\nAgent-Builder (Whitelist-Auswahl). `key` = Werkzeug-Schlüssel; `mode` = read/write."},{"name":"AssistantUsage","description":"Nutzungs-/Kontingent-Ansicht (Doc 30 W10). Read-only: KI-Verbrauch (heute/Monat, global + eigener)\ngegen die Budget-Limits `ai.budget.*`. Aus den vorhandenen Audit-Kosten (kein zweiter Zählpfad)."},{"name":"AuditLogEntry","description":"Resource 'AuditLogEntry' operations."},{"name":"ApiToken","description":"API-/MCP-Zugriffstoken (PAT). Verwaltung nur `platform.api_token.manage`.\n- plainToken nur in POST-Antwort (Gruppe api_token:secret), nie in Liste/Item\n- Identifier: ULID (Enumerationsschutz)\n- /revoke deaktiviert (Zeile bleibt) vs. Delete entfernt endgültig."},{"name":"Member","description":"Resource 'Member' operations."},{"name":"PermissionCatalog","description":"Resource 'PermissionCatalog' operations."},{"name":"Role","description":"Resource 'Role' operations."},{"name":"UserAccount","description":"Resource 'UserAccount' operations."},{"name":"AutomationCatalog","description":"Read-only Katalog des Automation-Authorings (P-3): welche Trigger-Schlüssel\n({@see \\App\\Platform\\Automation\\Engine\\TriggerCatalogProviderInterface}), Action-Typen\n({@see \\App\\Platform\\Automation\\Action\\AutomationActionInterface}) und Bedingungs-Operatoren\n({@see \\App\\Platform\\Automation\\Engine\\ConditionOperatorInterface}) aktuell wählbar sind —\naggregiert aus getaggten Providern (Core + aktive Plugins), plus KI-Use-Case-Vorschläge für\n`run_ai` ({@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}).\n\nMacht Authoring-Dropdowns backend-getrieben: Plugin-Trigger/-Actions erscheinen ohne Core-Edit,\ndeaktivierte Plugins verschwinden. Labels liefert NICHT das Backend — SPA übersetzt per\nKonvention `automation.<trigger|action|aiUseCase>.<lowerCamelCase(key)>` (unbekannte Schlüssel\nzeigen Roh-Key). Wertebereich für API-/MCP-Clients discoverbar (P-1/P-2)."},{"name":"AutomationResource","description":"Authoring-Ressource der Automation-Engine (P-1/P-3): CRUD inkl. Trigger-Konfiguration\n(triggerEvent), Bedingungs-Baum (conditions), geordneter Schritte (steps).\n\nMarken-Scope (IDOR): subjektlose Katalog-Gates (read/manage) sichern Collection + Create; die\nobjektbezogene, marken-scoped Prüfung erfolgt im State-Layer gegen die geladene Entität —\nmit `hasPermission($user, PERM, $brandId)` ({@see \\App\\Platform\\Automation\\Security\\AutomationPermissions}),\nbewusst NICHT mit `isGranted()`: die affirmative Strategie ließe den BrandScopeVoter ein DENY übersteuern."},{"name":"AutomationRun","description":"LAUF-EINSICHT einer Automation (Doc 41 B-04): Status, Trigger, Kosten und das Schritt-Protokoll.\n\nDER BEFUND: `AutomationRun` führt seit jeher ein `log`-Array mit jedem Schritt und seinem Ergebnis\n— abrufbar war es über keine Ressource. Wer wissen wollte, warum ein Lauf scheiterte, brauchte\nDB-Zugriff.\n\nMarken-Schnitt hängt am RECHT `automation.read`, nicht an der bloßen Mitgliedschaft (R28-SEC-01)."},{"name":"AutomationTestResult","description":"Ergebnis eines synchronen Automation-Testlaufs (Programm 21, AP 5.6/DIII-5): führt die Automation\nsofort als Dry-Run aus (keine Seiteneffekte) und liefert das Schritt-Protokoll direkt zurück —\nstatt wie `/run` nur asynchron einzuplanen. Optional `sampleFields` für realistische Bedingungen/\nPlatzhalter. Immer Dry-Run — schreibt nie fachliche Daten."},{"name":"BrainAsk","description":"„Frag das Brain\" (CompanyBrain B8, Doc 29): lesende, zitierte Antwort über den einen Kontext-Pfad.\n`ROLE_USER` — die Sichtbarkeit der Quellen wird im Builder über die Permission-Tags des Nutzers\nerzwungen (kein zusätzliches Recht nötig). Automatisch MCP-erreichbar (OpenAPI → operations.json)."},{"name":"BrainContextPreview","description":"Test-Konsole des Brain-Steuerungs-Bereichs (CompanyBrain B6, Doc 29): Dry-Run des komponierten Kontexts\nje Use-Case + Beispiel-Frage — Blöcke, Scores, Token-Schätzung, OHNE LLM-Call. Gate `platform.brain.manage`."},{"name":"BrainEmbedBackfill","description":"Nachziehen fehlender CompanyBrain-Einbettungen — API-/MCP-Pendant zu `brain:embed-backfill`\n(Audit R30, P-1/P-2).\n\nDER BEFUND, DEN DAS SCHLIESST: `/v1/brain/health` weist `chunks.pending` und `coveragePct`\nprominent aus, und der Gesundheits-Tab zeigte sie an — es gab aber unter `/api/v1` keine einzige\nOperation, die den Rückstand auflöst. Die Oberfläche zeigte ein Problem, das sie nicht beheben\nkonnte; ohne SSH blieb der Brain dauerhaft semantisch blind ({@see\n\\App\\Platform\\Brain\\Service\\BrainRetriever} degradiert still auf rein lexikalische Treffer).\n\nLauf asynchron im Worker ({@see \\App\\Platform\\Brain\\Message\\EmbedBrainChunksMessage}, Kette bis\nder Rückstand leer oder der KI-Budget-Deckel erreicht ist); POST bestätigt nur die Einreihung."},{"name":"BrainFact","description":"Kuratierter Firmen-Fakt (CompanyBrain B1, Doc 29). Pflege durchgehend `platform.brain.manage`\n(Objekt-Voter erzwingt zusätzlich den Marken-Scope). Ein Edit an einem Provider-Default markiert die\nZeile `customized` → der Standard-Daten-Sync fasst sie nicht mehr an."},{"name":"BrainFeedback","description":"Feedback an einer KI-Antwort (CompanyBrain B9, Doc 29). Erstellen darf jeder angemeldete Nutzer (er\nbewertet die eigene Antwort); Auflisten/Kuratieren (Wissenslücken) verlangt `platform.brain.manage`."},{"name":"BrainHealth","description":"Gesundheits-Dashboard des Brain-Steuerungs-Bereichs (CompanyBrain B6, Doc 29 Stufe 6): Chunk-Bestand je\nQuelle, Embedding-Abdeckung/-Rückstand, Quellen-Positivliste, Gate-Zustand und KI-Kosten (30 Tage).\nAls GetCollection mit genau einer Zeile (Singleton-Report); Gate `platform.brain.manage`."},{"name":"BrainInstruction","description":"System-Instruktion je KI-Use-Case (CompanyBrain B2, Doc 29). Pflege durchgehend `platform.brain.manage`.\nEin Edit an `body` setzt `customized=true` (der Composer nutzt dann den DB-Body statt des Datei-Defaults);\n`reset` stellt den Datei-Default wieder her. Eine Marken-Variante wird per Post angelegt (brandId gesetzt)."},{"name":"BrainKnowledgeGap","description":"Wissenslücken-Cluster — API-/MCP-Pendant zu `brain:detect-gaps` (Audit R30, P-1/P-2; CompanyBrain\nB9, Doc 29 Stufe 7).\n\nDER BEFUND: die Fähigkeit existierte ausschließlich als Konsolenbefehl, und ihr Ergebnis — die\ngeclusterten offenen negativen Rückmeldungen samt KI-Entwurf — wurde ausschließlich nach stdout\ngeschrieben. Nach dem Schließen des Terminals war der Entwurf weg; eine Automation oder ein\nKI-Agent (P-2/P-3) konnte die Fähigkeit gar nicht anstoßen.\n\nNICHT Teil des Befunds und deshalb bewusst NICHT hier: das Markieren als bearbeitet. Dieselbe\nZustandsänderung gibt es rechte- und markengebunden längst als\n`PATCH /v1/brain/feedback/{ulid}` mit `resolvedState=drafted` ({@see BrainFeedbackResource}) —\nder `--mark`-Schalter des Befehls ist eine Massenanwendung davon, kein Umgehungspfad. Die\n`feedbackUlids` je Cluster benennen genau die Zeilen, die dafür zu patchen sind.\n\nLesend, `platform.brain.manage`; der KI-Entwurf entsteht bei der Abfrage (Use-Case\n`knowledge.draft`) und wird NIE automatisch veröffentlicht."},{"name":"BrainPolicyMatrix","description":"Read-only Policy-Matrix (CompanyBrain B6, Doc 29 Stufe 6): je Kontext-Use-Case genau eine Zeile — die\nglobale Override-Zeile (`isDefault=false`, mit `ulid`) oder der Code-Default (`isDefault=true`, `ulid=null`).\nDie Steuerungs-UI editiert Default-Zeilen per POST auf `/v1/brain/policies` (Upsert), Override-Zeilen per\nPATCH auf `/v1/brain/policies/{ulid}`. Bewusst `identifier: false` (Default-Zeilen haben keine ULID →\nBlank-Node-IRI statt IRI-Fehler). Gate `platform.brain.manage`."},{"name":"BrainPolicy","description":"KI-Steuerungsregel je Use-Case × Marke (CompanyBrain B6, Doc 29). Ohne Zeile gelten Code-Defaults\n({@see \\App\\Platform\\Brain\\Catalog\\BrainPolicyDefaults}); die Collection liefert die angelegten\nPolicy-Zeilen (die Stufe-6-Matrix ergänzt die Default-Ansicht je Use-Case). Pflege durchgehend\n`platform.brain.manage`."},{"name":"BrainReindex","description":"Neuaufbau des CompanyBrain-Chunk-Sidecars — API-/MCP-Pendant zu `brain:reindex` (Audit R30,\nP-1/P-2; Muster {@see \\App\\Platform\\Search\\ApiResource\\SearchReindexResource}).\n- Lauf asynchron im Worker ({@see \\App\\Platform\\Brain\\Message\\ReindexBrainChunksMessage}); POST\n  bestätigt nur die Einreihung (202).\n- `types` grenzt auf Quell-Klassen (FQCN) ein; leer/fehlend = die Positivliste `brain.sources`.\n- Der Lauf endet mit einem Embedding-Auftrag, sonst stünden die neuen Chunks ohne Vektor da."},{"name":"BrainSource","description":"Inhalts-Quellen des CompanyBrain (Doc 29 B3) als schaltbare Fläche — die Positivliste\n`brain.sources` war zuvor NUR als roher JSON-Wert unter „Einstellungen → System\" erreichbar, damit\nblieb die automatische Hälfte des Brains auf jeder Installation stehen.\n\n- Collection: jede chunkbare Klasse mit Bestand (Suchindex/Chunks) und Schaltzustand.\n- `PATCH {active}`: schaltet genau eine Quelle; Ausschalten räumt deren Chunks\n  ({@see \\App\\Platform\\Brain\\Service\\BrainSourceCatalog::setActive()}).\n- Einschalten füllt NICHTS rückwirkend — der Bestandsaufbau läuft über `POST /v1/brain/reindex`.\n- Gate durchgehend `platform.brain.manage`; die Umschaltung wirkt systemweit und verlangt deshalb\n  den markenübergreifenden Verwalter ({@see BrainSourceProcessor})."},{"name":"BrandAsset","description":"Upload/Entfernen für Marken-CI-Bildmarken — bewusst getrennt von der Brand-Hauptressource.\n- Bild als Base64-JSON (konsistent zum DMS-Upload), Slot per Whitelist.\n- Validierung/Ablage: {@see \\App\\Platform\\Brand\\Service\\BrandAssetStorage}.\n- Entfernen als eigene Operation (POST …/assets/remove) statt DELETE mit zwei Pfadvariablen."},{"name":"Brand","description":"Resource 'Brand' operations."},{"name":"CurrencyOption","description":"Die Frage, die JEDE Beleg-Oberfläche stellt, bevor sie eine Währungsauswahl anbietet:\n**gibt es hier überhaupt mehr als eine Währung?** (Doc 25 AP 10.1)\n\nSie steht im KERNEL, nicht im International-Plugin — obwohl die Antwort von dort kommt. Drei\nGründe:\n - Die Fragenden sind Kernel-nahe Beleg-Oberflächen (Angebot, Auftrag, Rechnung). Sie dürfen\n   keinen Endpunkt eines Fachplugins kennen, sonst hinge die Rechnungsmaske an der\n   Installation von `OctiInternational`.\n - Ohne Plugin muss die Antwort trotzdem kommen — und sie lautet dann „nur EUR\". Eine\n   404-antwortende Route wäre für den Aufrufer nicht von einem Fehler zu unterscheiden.\n - Die Auswahl ist eine Eigenschaft des Belegs, nicht des Steuer-/Kurs-Moduls.\n\nBewusst **ohne eigenes Recht** (nur angemeldet, wie der Steuersatz-Katalog): wer einen Beleg\nsehen darf, darf wissen, in welchen Währungen er entstehen kann. Die Liste enthält keine\nGeschäftsdaten — nur ISO-Codes."},{"name":"DocumentPreview","description":"Zustandslose Editor-Vorschau (15 §7): Twig/Blockstruktur + Beispiel-Variablen → HTML,\nohne Speichern. Sandbox-/Syntaxfehler → 422."},{"name":"DocumentStandingAttachment","description":"Feste Beleg-Beilagen (Doc 40): welche Datei automatisch an welche Belegart welcher Marke gehängt\nwird. Stammdaten der Einstellungen — Recht wie bei den Belegvorlagen."},{"name":"DocumentTemplate","description":"Belegvorlagen-Verwaltung (15 §7, ENT-ERP-DOCTPL-01): je Marke × Belegtyp × Sprache,\nEditor-Modi visual/twig, 1..n Logos, optionales Briefbogen-PDF — ohne Deploy. Nur\nregistrierte Belegtypen (fail-closed). Filter: docType, brandId."},{"name":"DocumentVariable","description":"Read-only-Variablen-Katalog (15 §7): Variablen (dot-Pfad, Label, Beispielwert) je\nBelegtyp, aggregiert aus DocumentVariableProvider-Beiträgen aktiver Module. Ohne\ndocType-Filter: registrierte Belegtypen (key = docType, label = Typ-Label)."},{"name":"NumberScheme","description":"Admin-Verwaltung der Nummernkreise (15 §3, ENT-ERP-NUMBERING-01): Muster, Reset-Policy,\nMarken-Scope, Zählerstand je Nummern-Typ — ohne Deploy. Nur registrierte Typen\n(fail-closed, {@see \\App\\Platform\\Commerce\\Numbering\\Service\\NumberedTypeRegistry})."},{"name":"NumberedType","description":"Read-only-Katalog der registrierten Nummern-Typen (15 §3 Key-Registry): Core + aktive\nPlugins, Default-Muster, gapless/brandScoped — Grundlage der Nummernkreis-Verwaltung."},{"name":"PartnerRole","description":"Geschäftspartner-Rollen eines Kunden-Stammsatzes (15 §8b, ENT-ERP-PARTNER-01,\nread-only): Core-Kundenrolle + additive Plugin-Rollen (Lieferant/Affiliate), je\neigene Nummer. Filter: `customerId` (Pflicht). Rollen deaktivierter Plugins: nicht (R1)."},{"name":"PaymentTerm","description":"Zahlungsbedingungen als Kernel-Stammdatum (Doc 25 AP 0.1, ENT-ERP-PAR-PAYTERM-01):\nNettofrist + mehrstufiges Skonto, konsumiert von Angebot/Auftrag/Rechnung/Bestellung.\n\n- **Lesen mit ROLE_USER** (Auswahlliste am Beleg — Muster {@see TaxRateResource}), Schreiben\n  nur mit `platform.settings.manage`.\n- Kein Marken-Scope: Stammdatum (CLAUDE.md-Konvention); die Marke hängt am Beleg."},{"name":"PriceResolution","description":"Zustandslose Preis-Auflösung (15 §5) über {@see \\App\\Platform\\Commerce\\Pricing\\PriceResolutionPipeline}:\nStaffelpreise (OctiPricingTiers), Kunden-/Preislistenpreise (OctiPricingCustomer),\nKundengruppen-Regeln (OctiCustomerGroups), je nach aktivem Modul. Aufruf durch die\nBeleg-Editoren bei Produktwahl/Mengenänderung; `unitPriceAmount` null → Client nutzt\nProdukt-Standardpreis.\n\nBewusst keine Kopplung Beleg-Plugins ↔ Pricing-Plugins — nur dieser Kernel-Endpunkt;\ndeaktivierte Pricing-Module fallen einfach aus der Auflösung."},{"name":"Communication","description":"- Kommunikations-Thread über alle Objekte\n- Rechteprüfung objektbezogen in Provider/Processor\n- Collection-Filter: subjectType + subjectId."},{"name":"CustomFieldDefinitionResource","description":"Resource 'CustomFieldDefinitionResource' operations."},{"name":"CustomFieldMeta","description":"Read-only Meta-Katalog: gültige `entityType`-Ziele (Core + AKTIVE Plugins, aggregiert vom\n{@see \\App\\Platform\\CustomField\\Security\\CustomFieldTargetAccessResolver}) + zulässige Feld-`type`s\n({@see \\App\\Platform\\CustomField\\Entity\\CustomFieldDefinition::allowedTypes()}) für neue Definitionen.\n\nBackend-getrieben (keine Drift zwischen Frontend-Dropdown und serverseitiger Assert\\Choice/\nisKnownEntityType-Validierung); exponiert den Wertebereich auch für API-/MCP-Clients."},{"name":"CustomFieldValue","description":"Polymorpher Custom-Field-Wert (Modul 0). DTO über {@see \\App\\Platform\\CustomField\\Entity\\CustomFieldValue},\nverknüpft mit {@see \\App\\Platform\\CustomField\\Entity\\CustomFieldDefinition}. Identifier: `entityType`\n+ `entityId` (numerische PK des Zielobjekts) + `definitionId`.\n\n- GetCollection: alle aktiven Definitionen des Entity-Typs inkl. Wert (auch ohne gesetzten Wert),\n  fürs vollständige Formular.\n- Post: Upsert eines einzelnen Werts.\n\nKein Item-IRI (kombinierter fachlicher Schlüssel) — daher nur Collection + Post, kein Get/Patch/Delete\npro Item (vermeidet Composite-IRI-Probleme).\n\nIDOR-Schutz (strukturierte PII): `security` prüft nur Authentifizierung; die objektbezogene Prüfung\n(Recht + Marken-Scope des Zielmoduls) macht der State-Layer über den\n{@see \\App\\Platform\\CustomField\\Security\\CustomFieldTargetAccessResolver} — nur wer das Zielobjekt\nselbst lesen/bearbeiten darf. Schreibaktionen werden über die ULID der\n{@see \\App\\Platform\\CustomField\\Entity\\CustomFieldValue} vom AuditSubscriber auditiert."},{"name":"Contact","description":"Ansprechpartner-Resource (CRM) — org-weit, keine Marken-Trennung; Rechte über contact.*."},{"name":"ContactRole","description":"Kontakt-Rollen-Katalog als Daten (Doc 26 3.9, konfigurierbar). `key` = {@see \\App\\Platform\\Customer\\Entity\\Contact::$role}.\nLesen `contact.read`; Pflege `customer.config.manage` (wie Kunden-/Kontakt-Status)."},{"name":"ContactStatus","description":"Kontakt-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in Contact.statusId."},{"name":"CustomerActivity","description":"Kunden-360-Kommunikationssicht (10-kommunikation-integration, AP-4.2) — read-only Zeitachse der\nLÜCKENLOSEN Historie, drei Quellen zusammengeführt:\n - Vorgänge: {@see \\App\\WorkItem\\Entity\\WorkItemMessage} mit customerId = Kunde (B1)\n - CRM-Threads: {@see \\App\\Platform\\Communication\\Entity\\CommunicationMessage} vorgangs-loser\n   Stamm-/CRM-Objekte (Kunde, Kontakte, Deals, Projekte)\n - Plugin-Berührungspunkte: {@see \\App\\Platform\\Customer\\Contract\\CustomerTouchpointProviderInterface}\n   (protokollierte Anrufe, Termine, Notizen aus Plugin-Tabellen).\n\nJede Zeile trägt neben dem Roh-Typ die normalisierte Berührungsart `touchpointType`\n({@see \\App\\Platform\\Customer\\Service\\CustomerTouchpointType}) — EIN Vokabular über alle drei\nQuellen; `?types=` schneidet darauf.\n\nMarken-Scope: NICHT über den Kunden (markenlose Stammdaten) — Provider filtert über die\nNachrichtenzeilen auf zugängliche Marken (IDOR-Schutz bei geteiltem Kunden).\n\n`?customerUlid=…` Pflicht (analog {@see \\Octi\\Plugin\\Projects\\ApiResource\\ProjectActivityResource})\n— erzwingt objektbezogenen Scope, kein markenübergreifender Voll-Scan."},{"name":"CustomerDuplicateGroup","description":"Vorschlagsliste erkannter Kunden-Dubletten (Doc 26 3.2): jede Zeile ist ein Cluster\nverdächtig gleicher Kunden mit den auslösenden Gründen (`vat` · `email` · `name_domain`).\nLesen erfordert `customer.read`; das eigentliche Zusammenführen läuft über\n`POST /v1/customers/{ulid}/merge` (`customer.merge`)."},{"name":"CustomerInteractionFrequency","description":"Interaktions-Frequenz eines Kunden je Monat (Doc 26 3.4) — verdichtet die Kunden-360-Kommunikation\n({@see CustomerActivityResource}) zu einer Zeitreihe für die Frequenz-Visualisierung: je Monat die\nZahl der Kontakte insgesamt sowie ein-/ausgehend. Read-only, `?customerUlid=…` Pflicht."},{"name":"CustomerRelation","description":"Gleichrangige Organisations-Beziehungen eines Kunden (Doc 26 3.9). GET listet die verbundenen\nOrganisationen; POST verknüpft (`relatedUlid`), DELETE löst die Verknüpfung — beides symmetrisch.\nLesen `customer.read`; Pflege `customer.update`."},{"name":"Customer","description":"Resource 'Customer' operations."},{"name":"CustomerStatus","description":"Kunden-Status als Daten (konfigurierbar ohne Code) — Schlüssel `key`, referenziert in\nCustomer.statusId. `isWon`/`isLost` markieren Gewinn-/Verlust-Status."},{"name":"DsgvoDataRequest","description":"Betroffenen-Anfrage nach DSGVO (Art. 15/16/17).\n- `/export`: Auskunfts-JSON; `/erase`: Anonymisierung/Löschung; Status open → processing → done.\n- Schlüssel = `ulid`. Lesen: `platform.dsgvo.view`; Mutation/Export/Löschung: `platform.dsgvo.manage`\n  (objektbezogen über {@see \\App\\Platform\\DSGVO\\Security\\DsgvoRequestVoter})."},{"name":"DsgvoRetentionEntityTypeCatalog","description":"Read-only Katalog der ANBIETBAREN `entityType`-Werte für {@see RetentionPolicyResource}.\n- Core-Typen ({@see \\App\\Platform\\DSGVO\\Entity\\RetentionPolicy::ENTITY_TYPES}) + Typen aktiver\n  Plugin-`RetentionPolicyProvider` (Enablement-gefiltert, Muster AutomationCatalog).\n- Bewusst STRENGER als die Schreib-Validierung: {@see \\App\\Platform\\DSGVO\\Service\\RetentionEntityTypeRegistry}\n  validiert enablement-AGNOSTISCH (Policies deaktivierter Module bleiben pflegbar); dieser\n  Katalog ist nur die Angebots-Fläche für UI/MCP.\n- Labels liefert die SPA (`dsgvoAdmin.retention.entity<PascalCase(typ)>`, Plugin-Labels via\n  `locales`-Manifest; unbekannte Schlüssel zeigen den Roh-Typ)."},{"name":"DsgvoRetentionPolicy","description":"Settings-pflegbare Aufbewahrungs-Richtlinie (00 Fundament, DSGVO Art. 17). Schlüssel = `ulid`.\nLesen erfordert `platform.dsgvo.view`, Schreiben `platform.dsgvo.manage`."},{"name":"DocTopic","description":"Doku-/Hilfe-Thema (Programm 23 H9). Lesen = jeder angemeldete Nutzer; Pflege = `platform.docs.manage`.\n\n- Die COLLECTION ist der Index OHNE Body (R1: ~250 Zeilen je Session) — `bodyHtml`/`bodyMarkdown`\n  traegt nur das Item.\n- Der oeffentliche Identifier ist die ULID, NICHT der `key`. Der Key traegt einen Punkt\n  (`crm.deals`), und ein Punkt im API-Platform-Identifier bricht die IRI-Erzeugung\n  („Unable to generate an IRI\", 400). Wer per Key sucht, filtert die Collection (`key=`) —\n  die Oberflaeche haelt den Index ohnehin und loest den Deep-Link damit selbst auf.\n- K4/K5 (developer/reference) sind Generat: `editable=false`, Schreiben antwortet 403.\n- Modul-Gate serverseitig: ein Thema mit `moduleKey` eines deaktivierten Moduls ist unsichtbar (S4)."},{"name":"EmployeeDirectory","description":"Schlankes Mitarbeiter-Verzeichnis für Picker/Namensauflösung (Employee.id → Name).\n- Pendant zu {@see \\App\\Platform\\Auth\\ApiResource\\MemberResource} (User-basiert)\n- Nötig, da employeeId-Felder (TimeEntry, TimesheetApproval) NICHT über `/members` auflösbar sind\n- Zugriff: ROLE_USER (analog `/members`) — Kollegennamen nicht sensibler als dortige Kontonamen\n- Sensible HR-Daten (Kostensatz/Vertrag/Kontakt) bleiben in {@see EmployeeResource}."},{"name":"Employee","description":"Mitarbeiter-Resource (04-08 §4, API-First) — SSoT für „wer ist verfügbar, kann was, kostet wie viel\".\n- CRUD + Lebenszyklus (Eintritt/Austritt/aktiv/inaktiv) + datierte Kostensatz-Pflege + Skill-Pflege\n- Verschlüsselte Kontaktablage + Anstoß der Onboarding-Checkliste\n- Kostensatz/Kontaktdaten/Dokumente nur mit Spezialrecht sichtbar."},{"name":"LinkableEmployee","description":"Schlanker Mitarbeiter-Lookup für die Konten-Verknüpfung in der Benutzerverwaltung (Settings).\n- Getrennt von {@see EmployeeResource}: Recht `platform.user.manage` statt `hr.employee.view`\n- Nur Auswahl-Felder, keine HR-Stammdaten (Kostensatz/Vertrag/Kontakt)\n- `linkedUserUlid` markiert bereits belegte Mitarbeiter fürs Frontend."},{"name":"File","description":"DMS-Datei (04-00 §4.6).\n- Upload: Base64-JSON. Download: Byte-Stream über Controller mit {@see \\App\\Platform\\File\\Security\\FileVoter}-Check.\n- Marken-/Objekt-Scope in State-Layer + Voter erzwungen (IDOR-Schutz)."},{"name":"Folder","description":"DMS-Ordner (04-00 §4.6, §5). DTO über der Folder-Entität; CRUD mit Marken-/Objekt-Scope."},{"name":"ImportJob","description":"Import-Auftrag (Doc 26 5.4): treibt den Wizard Upload → Mapping → Dry-Run → Async-Lauf → Report →\nStorno. Create nimmt Datei (Base64) + Ziel; Patch setzt Mapping/Strategie; die Aktionen `dry-run`,\n`run` und `revert` sind eigene POST-Endpunkte. Zugriff durchgehend `platform.import.run`."},{"name":"ImportTarget","description":"Verfügbare Import-Ziele (Doc 26 5.4/5.5): Schlüssel, Label und Feldkatalog je Target. Speist die\nZiel-Auswahl und die Mapping-Feldliste des Import-Wizards. Read-only, aggregiert aus dem\n{@see \\App\\Platform\\Import\\Service\\ImportTargetRegistry}."},{"name":"Integration","description":"Resource 'Integration' operations."},{"name":"QueueHealth","description":"Betriebs-Monitoring der Messenger-Queues (Audit R21 PAR-6, P-1/P-2).\n- Read-only Health der Transports (async/webhooks/outbox/failed); CLI-Pendant {@see \\App\\Platform\\Integration\\Command\\FailedQueueReportCommand} bleibt Cron-Alarm-Kanal.\n- `messageCount` null, wenn Transport nicht zählbar (kein {@see \\Symfony\\Component\\Messenger\\Transport\\Receiver\\MessageCountAwareInterface}) — bewusst kein Fehler.\n- `status` 'degraded' bei Einträgen in failed-Queue oder Backlog über Schwelle, sonst 'ok'.\n- Ein-Element-Collection (Muster LicenseSummary/Search). GET /health (anonymer Ping) unberührt."},{"name":"WebhookEventCatalog","description":"Read-only Vorschlags-Katalog abonnierbarer Webhook-Event-Keys (Programm 21, AP 5.6/DIII-10).\n- Backend-getrieben (Typeahead statt Freitext); Plugin-Events erscheinen ohne Core-Edit, deaktivierte Plugins verschwinden ({@see \\App\\Platform\\Integration\\Service\\WebhookEventCatalog}).\n- Wertebereich discoverbar für API-/MCP-Clients (P-1/P-2). Freitext/Wildcards (`crm.*`) bleiben zulässig — Angebot, keine Whitelist."},{"name":"Webhook","description":"API-Resource für ausgehende Webhooks (04-00 §4.9). CRUD über `platform.webhook.manage`.\n- SSRF-Validierung verbindlich serverseitig in {@see WebhookProcessor} (Hosts lösen dynamisch auf); Assert-Regeln hier nur erste Verteidigungslinie.\n- `secret` beim Lesen write-only (nie ausgespielt)."},{"name":"AiModelRoute","description":"Modell-Routing je KI-Aufgabe (AP-19); Use-Cases aus {@see \\App\\Platform\\LlmGateway\\AiUseCaseCatalog}.\n- POST: Upsert über `useCase`.\n- PATCH: merged (nicht gesetzte Felder bleiben); `provider: null` = Reset auf Standard (wie DELETE).\n- PATCH ohne Provider auf unkonfigurierten Use-Case: bewusst No-Op (nichts zu routen).\n- DELETE: Reset auf Standard."},{"name":"AiProviderEndpoint","description":"BYOM/lokaler LLM-Endpoint (Doc 30 Stufe 6, ENT-AIW-05). Governance-verwaltet\n(`platform.assistant.manage`); `baseUrl` wird SSRF-geprüft, `credential` wird verschlüsselt gespeichert\nund NIE zurückgegeben (nur `hasCredential`)."},{"name":"AiProvider","description":"KI-Provider-Zugang (AP-19): API-Key-Status/Aktivierung/Standard-Provider/Standardmodell je Provider.\nKey verschlüsselt als Integrations-Credential gespeichert, nie zurückgegeben (write-only).\n\n`availableModels` ist der bei der Anbieter-API abgefragte Stand ({@see \\App\\Platform\\LlmGateway\\Service\\ModelCatalog}),\nnicht eine im Code gepflegte Liste — `modelsSource`/`modelsFetchedAt`/`modelsError` machen Herkunft\nund Alter des Standes sichtbar, damit „keine Modelle\" erklärbar bleibt."},{"name":"McpCommand","description":"In-App-KI-Kommandozeile (⌘K): natürlichsprachliche Befehle, LESEN (sofort) oder SCHREIBEN\n(Vorschau + Bestätigung).\n\n- Beide Operationen nur ROLE_USER; Lese-/Schreibrecht zusätzlich über denselben Voter-/\n  Marken-Scope wie die reguläre API ({@see \\App\\Platform\\LlmGateway\\Service\\McpCommandExecutor})\n  — KI umgeht nie die Berechtigungen.\n- POST /mcp/query {query} → Lese-Absicht: sofort ausgeführt. Schreib-Absicht: Vorschau +\n  `requiresConfirmation: true` + HMAC-signiertes, ablaufendes `action`-Token, ohne Mutation.\n- POST /mcp/confirm {action} → prüft Signatur/Ablauf/Nutzer-Bindung, re-validiert tool/args\n  gegen Whitelist, führt erst dann aus."},{"name":"BccAddress","description":"Smart-BCC-Adresse des aktuellen Nutzers (Doc 26 1.5): die eindeutige, selbst-verifizierende Adresse\nzum BCC-Setzen im Mail-Client. `enabled=false` (Adresse null), wenn keine BCC-Domain konfiguriert ist."},{"name":"MailBlockType","description":"Baustein-Palette des MAIL-Editors (Doc 46 A1, ENT-MKT-01): serialisierbare Sicht auf die\n{@see \\App\\Platform\\Mail\\Block\\MailBlockTypeRegistry} — nur Typen MIT settingsSchema.\nBewusst GETRENNT vom Baukasten-Katalog: eine Mail-Palette darf nie Web-Bausteine anbieten.\nKein Brand-Scope (Katalog = Programm, keine Daten)."},{"name":"MailCanvas","description":"Canvas-Render einer MAIL-Block-Flaeche (Doc 46 A2/A3, ENT-MKT-01).\n\nDer Editor schickt den BAUM und bekommt das ERZEUGNIS zurueck — genau das, was spaeter im\nPostfach steht. Kein Client-Renderer: eine zweite Render-Fassung im Browser waere eine zweite\nWahrheit, und die Abweichung faellt erst nach dem Versand auf.\n\nPersistiert nichts. Marken-Lese-Schranke wie bei der Vorschau: der Canvas rendert Marken-CI,\nein markenbeschraenkter Nutzer darf fremdes Branding nicht sehen."},{"name":"MailTemplatePreview","description":"- Live-Vorschau eines (auch ungespeicherten) Mailvorlagen-Inhalts\n- POST: Typ-Key + optionaler Markenbezug + aktuelles Betreff/HTML\n- Ausgabe: gerendertes HTML mit Demo-Platzhaltern, im Marken-Chrome (wie realer Versand)."},{"name":"MailTemplate","description":"- Editierbare, markenabhängige, mehrsprachige Mailvorlage (CRUD + Test-Versand)\n- Sprachvarianten (Betreff + Render-Inhalt) in {@see $variants}\n- brandId = null: globale Standardvorlage; je (key, brandId) höchstens eine isDefault\n- Pflicht-Platzhalter je key aus {@see \\App\\Platform\\Mail\\MailTypeRegistry} (read-only locked)."},{"name":"MailboxConnection","description":"Persönliches Vertriebs-Postfach eines Nutzers (Doc 26 1.1) auf dem Mail-Sync-Kernel. Streng\nself-scoped: der State-Layer bindet jede Operation an den aktuellen Nutzer (nie fremde Postfächer);\nGate `platform.mailbox.manage` ist in jeder Systemrolle. Das Passwort (IMAP) ist write-only und wird\nverschlüsselt gespeichert (CredentialCipher) — nie zurückgegeben."},{"name":"SystemMailAccount","description":"- System-Mailaccount je Marke (rein ausgehender Versandweg für alle System-Mails)\n- Verwaltung der Account-Zuordnung inkl. Typ (Google-Integration oder SMTP)\n- SMTP-Passwort write-only (verschlüsselt gespeichert, nie ausgelesen)\n- Typ gmail: OAuth-Credentials weiterhin über die Google-Integration (nicht über diese API)."},{"name":"NotificationChannel","description":"Angebotsliste der Benachrichtigungs-Kanäle (Audit R23).\n\nDie Präferenz-Oberfläche kannte bis dahin nur die zwei hart kodierten Core-Kanäle `email`/`slack`\n— ein über den offenen SPI beigesteuerter Plugin-Kanal (z.B. `slack_project`) war damit weder\nein- noch ausschaltbar, obwohl Registry, Validator und Zustellung ihn längst führen. Diese\nRessource ist die fehlende Lese-Naht: enablement-GEFILTERT\n({@see \\App\\Platform\\Notification\\Service\\NotificationChannelRegistry::available()}), damit\nKanäle deaktivierter Plugins gar nicht erst angeboten werden.\n\n`enabledByDefault` gehört dazu, weil der Dispatcher ohne Präferenzzeile genau diesen Default\nanwendet: eine UI, die stattdessen „an\" annimmt, zeigt Opt-in-Kanäle fälschlich als aktiv.\n\nSelf-scoped wie die Präferenzen selbst (`platform.notification.view`, jede Rolle hat es)."},{"name":"NotificationPreference","description":"Benachrichtigungs-Präferenzen je (Event-Typ, Kanal), 04-00 §4.4.\n- Nur eigene Präferenzen; State-Layer hart auf User gescoped (IDOR-fest).\n- in_app nicht deaktivierbar — Präferenz wird ignoriert/abgewiesen."},{"name":"Notification","description":"Resource 'Notification' operations."},{"name":"LocalPluginCandidate","description":"Unregistrierte Plugin-Ordner unter `plugins/` — additiv zu {@see PluginResource} (`/api/v1/plugins`).\n- `POST /v1/plugin-candidates/{dir}/install`: registrieren+bauen (async, {@see LocalPluginInstallProcessor});\n  Ergebnis über `GET /v1/plugin-install-jobs/{jobId}` ({@see PluginInstallJobResource}) verfolgen\n- `DELETE /v1/plugin-candidates/{dir}`: Ordner löschen ({@see LocalPluginDeleteProcessor})\n- Identifikator = Ordnername; `key` (plugin.json-`name`) erst nach Install stabil\n- Gated: `platform.plugin.manage`."},{"name":"PluginInstallJob","description":"Fortschritt/Ergebnis einer asynchronen Plugin-Installation (Systemaudit R28, APIUI-03).\n\nDER BEFUND: Der Start ist MCP-/Automation-sichtbar (`POST /v1/plugin-candidates/{dir}/install`,\n`POST /api/v1/plugins/upload`), das ERGEBNIS war es nicht — es stand ausschliesslich im\nSPA-only-Plain-Controller {@see \\App\\Platform\\Plugin\\Controller\\PluginUploadController::status()}\nund damit weder in OpenAPI noch in `mcp/var/operations.json`. Ein Agent konnte `failed` nicht von\n`succeeded` unterscheiden und hatte fuer einen im Worker gescheiterten Lauf keinen Fehlergrund.\n\nGleiche Loesung wie {@see \\App\\Platform\\Update\\ApiResource\\SystemUpdateJobResource} (System-Update)\nund wie in Audit R20 fuer die Portal-Nutzer: eigener, read-only ApiResource-Pfad NEBEN dem\nPlain-Controller (dessen Pfad `/api/v1/plugins/install-jobs/{jobId}` bleibt der UI erhalten —\nderselbe Pfad zweimal zu registrieren wuerde eine der beiden Routen still verschatten)."},{"name":"Plugin","description":"Inventar + Lifecycle-Steuerung installierter Plugins (`/api/v1`).\n- install/activate/deactivate/uninstall: first-party-Lifecycle ({@see \\App\\Platform\\Plugin\\Service\\PluginLifecycleManager}),\n  Lock `plugin-lifecycle-<key>`, je Audit-Eintrag\n- Nur für in `config/plugins.php` registrierten Bestand; reine Daten-/Flag-Ops, kein Container-Rebuild\n- Neues Bundle (ZIP) separat: {@see \\App\\Platform\\Plugin\\Controller\\PluginUploadController}."},{"name":"PluginStore","description":"In-App-Sicht auf den Plugin-Marktplatz (P6-Bridge, `/api/v1`).\n- GetCollection: Katalog (leer, wenn Store nicht konfiguriert)\n- POST …/{id}/install: erworbenes Paket laden + installieren\n- Gated: `platform.plugin.manage`."},{"name":"UserSavedView","description":"Gespeicherte Ansicht je Liste (Programm 21 AP 1.6).\n- Selbst-scoped: platform.saved_view.manage genügt für eigene; shared braucht zusätzlich platform.saved_view.share\n- IDOR-Schutz im State-Layer."},{"name":"SearchReindex","description":"Neuaufbau des Such-Index — API-/MCP-Pendant zu `search:reindex` (Audit R19, P-1/P-2).\n- Lauf asynchron im Worker ({@see \\App\\Platform\\Search\\Message\\ReindexSearchMessage}); POST bestätigt nur Einreihung.\n- `types` begrenzt auf Kurzname/FQCN; leer/fehlend = alle."},{"name":"Search","description":"Zentrale, marken-/rechtegefilterte Volltextsuche (P-1; CLAUDE.md „Suche\").\n- `?q=` Pflicht, optional `?limit=`; IDOR-sicher über Berechtigungs-Tags + Marken-Sichtbarkeit.\n- Adapter-neutrale Trefferliste; Objektauflösung clientseitig über `entityType`/`entityId`/`metadata`."},{"name":"FeatureFlag","description":"Resource 'FeatureFlag' operations."},{"name":"Setting","description":"Resource 'Setting' operations."},{"name":"TagAssignment","description":"Schlagwörter AN einem Objekt (Programm 46 F-S, ENT-MKT-10).\n\n**Die Zugriffsprüfung hängt am ZIEL, nicht an einer eigenen Schlagwort-Berechtigung.** Wer eine\nAufgabe bearbeiten darf, darf sie verschlagworten; wer sie nicht einmal sehen darf, kann ihr\nauch kein Schlagwort anhängen. Ein eigenes `tag.assign`-Recht hätte eine zweite Wahrheit über\ndie Sichtbarkeit desselben Objekts geschaffen — und die Lücke dazwischen wäre ein Weg, fremde\nDatensätze zu verändern, ohne sie lesen zu dürfen.\n\nEin noch unbekanntes Schlagwort wird angelegt: ein Name, den es noch nicht gibt, ist kein\nFehler, sondern der Normalfall beim ersten Mal."},{"name":"Tag","description":"Resource 'Tag' operations."},{"name":"TaxRate","description":"Steuersatz-Katalog (Modul 0, read-only Lookup) für Artikel/Belege.\n- Commerce-Kernel-Stammdaten → Core, nicht Plugin (sonst fail-closed hinter Modul-Flag).\n- Bewusst int-PK (kein ULID/Soft-Delete) — Alt-Ausnahme analog Setting/Role/Tag/Locale.\n- ROLE_USER genügt (Lesen für Auswahl); Voter am schreibenden Konsumenten schützt."},{"name":"Team","description":"Generisches Team (Doc 26 5.1). Lesen `platform.team.read`; Pflege `platform.team.manage`.\nMarken-Scope im Provider/Processor (IDOR)."},{"name":"VisibilityPolicy","description":"Sichtbarkeits-Regel je Entity-Typ/Marke (Doc 26 5.2). Konfiguration nur `platform.settings.manage`."},{"name":"VisibilityTargetResource","description":"Regelbare Datensatz-Typen für Sichtbarkeits-Regeln (Doc 26 5.2/5.3, SPI `app.visibility.target`).\nRead-only-Katalog: speist die Typ-Auswahl der Verwaltungsmaske und macht sie für MCP/Automation\nauffindbar. Typen deaktivierter Plugins fehlen (fail-closed)."},{"name":"TrashItem","description":"Papierkorb-Eintrag (Doc 26 5.6): gelöschter Datensatz der letzten 30 Tage. `GET /v1/trash` listet\nmarkenscharf + permission-gefiltert; `POST /v1/trash/{entityType}/{ulid}/restore` stellt wieder her.\nDie Zugriffskontrolle je Typ liegt im {@see \\App\\Platform\\Trash\\Service\\TrashService}."},{"name":"UserUiPreference","description":"Persönliche UI-Präferenzen des Users (z.B. `nav.groupOrder`).\n- Nur eigene Präferenzen; Recht `platform.ui_preference.manage`, State-Layer hart\n  User-scoped (IDOR-fest, Muster NotificationPreference).\n- POST: Upsert je `prefKey`. DELETE: Reset auf Default.\n- Meldungen der `#[Assert\\Callback]`-Rümpfe sind KATALOG-SCHLÜSSEL (Domain `validators`), kein\n  Klartext: der ConstraintViolationBuilder übersetzt seine Meldung, ein Satz als ID kommt\n  unverändert zurück und stünde für API-/MCP-Clients in jeder Sprache deutsch da (Audit R41-15).\n  Wächter: {@see \\App\\Tests\\Unit\\I18n\\ValidatorCatalogReachableTest}."},{"name":"SystemUpdateJob","description":"Fortschritt/Ergebnis des async System-Update-Laufs (gepollt nach POST /v1/system/update/run).\nApiResource statt Plain-Controller — MCP/Automation kann mitverfolgen (P-1/P-2)."},{"name":"SystemUpdate","description":"System-Update-Fläche, Singleton-Ressource (id `system`). Gated: `platform.system.update`.\n\n - `GET /v1/system/update` — Status: Version, Feed-Konfig, letzter Check (6h Cache),\n   Entitlement, laufender/letzter Job.\n - `POST /v1/system/update/check` — erzwungener Feed-Re-Check (Cache umgangen).\n - `POST /v1/system/update/run` — startet Update-Lauf async (202 + jobId; Fortschritt über\n   `GET /v1/system/update/jobs/{jobId}`, {@see SystemUpdateJobResource}). Body optional\n   `{\"backup\": false}` überspringt DB-Sicherung.\n\nEntitlement-Felder (`entitled`/`entitlementReason`/`requiredPlan`): Feed-Server füllt sie\nab Liveschaltung anhand gebuchtem Plan (Plan-Kopplungs-Seam §D)."},{"name":"PortalAccessGrant","description":"Portal-Zugriffs-Zeile vergeben (Staff, 04-12 §7), MCP-/Automation-erreichbar.\n- Ziel-User: Pfad-ULID\n- Recht: portal.access.grant\n- Marken-Scope in {@see PortalAccessGrantProcessor} (fremd-marken-User → 404)."},{"name":"PortalInvitation","description":"Portal-Einladung (Staff, 04-12 §7), MCP-/Automation-erreichbar (P-1/P-2/P-3).\n- Recht: portal.user.invite\n- Marken-Scope in {@see PortalInvitationProcessor} via PortalAccessResolver (Brand-IDOR)."},{"name":"PortalUser","description":"MCP-/Automation-sichtbare Read-Liste der Portal-User (04-12 §7, Audit R20 PAR-1).\n- Schließt P-2-Lücke: schreibende Staff-Aktionen brauchen die `{ulid}`, die sonst nur über\n  den SPA-only {@see \\App\\Portal\\Controller\\PortalManagementController} ermittelbar war\n- Gleicher Marken-Scope-IDOR-Schutz wie der Controller (via {@see PortalUserCollectionProvider})\n- Filter `customerId` (int): grenzt auf Portal-User eines Kunden ein."},{"name":"PortalUserStatus","description":"Portal-User sperren/reaktivieren (Staff, 04-12 §7), MCP-/Automation-erreichbar.\n- Ersetzt getrennte suspend/reactivate-Routen durch EINE Status-Aktion (suspended|active)\n- Recht: portal.user.suspend\n- Marken-Scope in {@see PortalUserStatusProcessor} (fremd-marken-User → 404)."},{"name":"Locale","description":"Die vom System unterstützten Sprachen (Sprachpaket-Ausbau 2026-07-17).\n- Read-only: kommen aus installierten Sprachpaketen ({@see \\App\\Platform\\Plugin\\Contract\\LocaleProviderInterface}),\n  keine per API pflegbaren Stammdaten. „Sprache hinzufügen\" = „Sprachpaket installieren\".\n- API nötig (P-1/P-2), damit Automation/MCP gültige Sprach-Codes erfragen statt 'de'/'en' zu raten.\n- `ROLE_USER` genügt: keine schützenswerte Info, aber jeder Aufrufer braucht sie (Sprachumschalter etc.)."},{"name":"ProjectTaskPriority","description":"Aufgaben-Prioritäten als Daten (konfigurierbar, kein Code). weight: höher = dringender.\nkey = WorkItem.priorityId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-priorities\nauf /v1/work-item/task-priorities gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t."},{"name":"ProjectTaskStatus","description":"Aufgaben-Status als Daten (04-02 §3.2, konfigurierbar, kein Code). category = Lebenszyklus\nopen|active|done|cancelled. key = WorkItem.statusId.\n\nKernel-Eigentum (ENT-ERP-CORE-02 Seam 0.B-2): Route bewusst von /v1/project/task-statuses\nauf /v1/work-item/task-statuses gewandert, damit das plugin-gegatete project-Segment\nden Kernel-Katalog nicht fail-closed 404t."},{"name":"WorkItemAttachment","description":"Anhang auf Vorgangs-Ebene: referenziert bestehende DMS-Datei (kein Upload hier),\nsicht-/herunterladbar am Work-Item (task/ticket).\n\nsecurity prüft nur Katalog-Permission — Brand-Scope/IDOR + Datei-Berechtigung setzen\n{@see WorkItemAttachmentProvider}/{@see WorkItemAttachmentProcessor} durch.\n\ndownloadUrl = abgesicherte Datei-Download-Route; storagePath wird NIE exponiert."},{"name":"WorkItemLink","description":"Verknüpfung zweier Vorgänge (Ticket ⇄ Aufgabe oder beliebige Work-Items), 04-04 §3/§4.5.\nPersistiert über bestehende {@see \\App\\WorkItem\\Entity\\WorkItemLink}-Tabelle, kein Umkopieren.\n\nCollection bidirektional, Pflicht-Filter `?workItemUlid=…`: liefert ALLE Links des Anker-Vorgangs\n(Quelle oder Ziel); `relatedUlid` ist beim Lesen stets der jeweils ANDERE Vorgang.\nLeisten-Felder `related*` (Doc 43): Priorität/Zuständiger/Kanal/SLA/letzte Nachricht/Zähler des\nGegen-Vorgangs — genug für die Strang-Leiste der Aufgabenseite ohne N Ticket-Abrufe."},{"name":"WorkItemList","description":"Aufgabenliste (Gruppierung von WorkItems, kind=task). Lesen: workitem.read; Verwalten: workitem.list.manage.\n\nIdentifier ist ulid; numerische id zusätzlich read-only, weil {@see WorkItemResource::$listId}\ndie numerische ID referenziert (vgl. projectId-Konvention)."},{"name":"WorkItem","description":"Resource 'WorkItem' operations."},{"name":"WorkItemTimeline","description":"Paginierte, sichtbarkeitsgefilterte Unified-Timeline EINES Vorgangs: Events+Nachrichten,\nnormalisiert über {@see \\App\\WorkItem\\Service\\WorkItemTimelineAssembler}. Kanonische Quelle\nfür Frontend-Timeline ({@see WorkItemTimeline.vue}, conversations-Store).\n\nPflicht-Filter `?workItemUlid=…`: erzwingt Marken-Scope (IDOR) im Provider.\nDefault-Sortierung neueste zuerst (`?order[occurredAt]=asc` kehrt um).\n\n`?scope=own|linked` (Doc 43, ENT-TASKCOMM-01): `linked` = EIN Verlauf über den Vorgang UND die\nNachrichten aller über {@see \\App\\WorkItem\\Entity\\WorkItemLink} verbundenen Tickets — jede Zeile\nträgt ihre Herkunft (`source*`). Kein zweiter Aggregat-Pfad, kein clientseitiges Mischen."},{"name":"AffiliateAccrual","description":"Provisions-Abgrenzungen eines Partners (04-24 §5/§8), read-only.\n- Sub-Resource `/v1/affiliates/{ulid}/accruals` (Filter `status`).\n- Statuswechsel nie über die API — nur ereignis-/laufgetrieben (InvoicePaid/InvoiceCancelled/Abrechnungslauf)."},{"name":"Affiliate","description":"Affiliate-Rolle am geteilten Geschäftspartner (04-24 §8) — CRUD unter `affiliates`.\n- POST löst `businessPartnerUlid` zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01); Rolle existiert bereits → 409.\n- DELETE: soft, nur ohne offene (pending/approved) Provisions-Abgrenzungen (409).\n- Partner: markenübergreifende Stammdaten, kein Brand-Scope (Muster Suppliers).\n- ULID-Format-Requirement, damit Literal-Segment `attributions` nicht als {ulid} matcht (Muster SalesOrder)."},{"name":"AffiliateAttribution","description":"Umsatz-Attribution (04-24 §4/§8) — `POST /v1/affiliates/attributions`.\n- Ordnet Umsatz per Referral-Code zu (404 unbekannter Code, 422 abgelaufen — AF2), stößt Provisions-Abgrenzung an.\n- Antwort trägt Accrual-Info (null, wenn keine Regel greift/Partner inaktiv).\n- Order/Invoice: optionale Umsatzquellen (ULIDs → FK-lose Ids, ENT-ERP-OPTDEP-01).\n- ULID-Requirement verhindert Kollision mit `/v1/affiliates/{ulid}`."},{"name":"AffiliateCommissionRule","description":"Provisionsregeln eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/rules`.\n- POST: partnerId = Partner aus Pfad, Scope-Default `partner`.\n- percent: value = Prozent×100 (500 = 5 %) · fixed: Cent.\n- Global-Regeln (`partnerId = null`) bewusst keine Sub-Resource."},{"name":"AffiliateCommissionSummary","description":"Provisions-Auswertung eines Partners (04-24 Ausbau) — read-only\n`GET /v1/affiliates/{ulid}/commission-summary`.\n- Summen je Status (offen/verdient/ausgezahlt, Cent) + Anzahl Stornierungen.\n- Aggregiert über die Accruals des Partners; unbekannte/gelöschte Rolle → 404."},{"name":"AffiliatePartnerAssignment","description":"Partner-/Vertriebs-Zuordnungen (04-24 Ausbau) — flache Collection `/v1/affiliates/assignments`.\n- ULID-Requirement der {ulid}-Routen von AffiliateResource verhindert Kollision (Muster sales-orders/statuses).\n- POST ordnet Kunde+Partner als sales_rep/account_owner/reseller zu (409 bei Duplikat partner+customer+role).\n- `sharePercent`: direkter Vertriebs-Provisionssatz, ohne Regel-Engine.\n- DELETE hart (reine Zuordnungszeile).\n- Automatische Attribution: {@see \\Octi\\Plugin\\Affiliate\\EventListener\\AttributeOnInvoiceIssued}."},{"name":"AffiliateReferral","description":"Referral-Codes/-Links eines Partners (04-24 §4/§8) — Sub-Resource `/v1/affiliates/{ulid}/referrals`.\n- POST: system-eindeutiger Code (409 bei Doppelvergabe).\n- `expiresAt` = Attributionsfenster (AF2)."},{"name":"AffiliateSettlementRun","description":"Abrechnungsläufe (04-24 §4/§8) — Segment `affiliate-settlements`.\n- POST erzeugt Lauf (draft) über approved-Accruals der Periode (Partner unter Mindestauszahlung vorgetragen, AF6).\n- `approve` (Freigabe, User-ULID) und `mark-paid` (Accruals → `settled`): diskrete POST-Ops, Status-Guards 422.\n- Detail-Antworten tragen die Auszahlungspositionen je Partner."},{"name":"AssetAi","description":"KI-Kostenoptimierung (04-15 §13 S15-1).\n- erkennt ungenutzte/überbuchte Seats\n- mit `ai.gateway`: Optimierungs-Einschätzung, sonst nur heuristische Hinweise\n- read-only, markenscope-gefiltert."},{"name":"AssetAssignment","description":"Zuweisungs-Historie von Assets/Seats (04-15 §4/§5).\n- read-only Liste/Detail + `/acknowledge` (Übernahme-Quittung)\n- Mitarbeitende: nur eigene Zuweisungen (Voter `assignment.view`); `assets.assignment.manage`: alle\n- Collection-Filter: employeeId/targetType/targetId/open."},{"name":"AssetLicenseStatus","description":"Status interner Software-Lizenzen als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalLicense::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig."},{"name":"AssetReport","description":"Controlling-Auswertung Asset-/Lizenzverwaltung (04-15 §4/§5/§6).\n- Fixkostenblock (monatlich/jährlich) je Marke/Kostenstelle/Kategorie\n- ungenutzte/überbuchte Seats\n- read-only, markenscope-gefiltert, Beträge in Cent."},{"name":"AssetStatus","description":"Betriebsmittel-Status als Daten (04-15), in Settings konfigurierbar.\n- `key` == InternalAsset::STATUS_*-Werte, sonst werden bestehende Datensätze ungültig."},{"name":"AssetCostCenter","description":"Kostenstelle als Reporting-Schnitt (04-15 §3, Q3).\n- Schlüssel = `code`\n- Lesen: `assets.asset.view`, Pflege: `assets.cost.manage`."},{"name":"AssetCostRecord","description":"Wiederkehrende/einmalige Kostenposition je Asset/Lizenz (04-15 §4.3).\n- `monthlyAmount`: normalisierter Monatsanteil, read-only\n- Filter targetType/targetId/interval/brandId, Sortierung order[label|validFrom|amount]\n- Beträge in Cent."},{"name":"AssetCostRecordSummary","description":"Kosten-Kennzahl-Aggregat der Kosten-Liste (Audit R18 Perf, Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}).\n- laufende Fixkosten monatlich/jährlich (CostNormalizer: Einmalbeträge zählen nicht) + Gesamtzahl\n- stets über GESAMTbestand, nicht die frühere clientseitige listAll-Reduktion (stille 5000er-Truncation)\n- Filter targetType/brandId; read-only, markenscope-gefiltert, Ein-Element-Collection."},{"name":"AssetInternalAsset","description":"Eigenes Betriebsmittel/Inventarobjekt (04-15 §4.1/§5).\n- Lebenszyklus-Aktionen /receive, /repair, /to-stock, /retire; Zuweisung /assign, Rücknahme /return\n- Markenscope über asset.view/asset.manage."},{"name":"AssetInternalLicense","description":"Selbst genutztes Software-Abo/Tool (04-15 §4.2/§5).\n- Status-Aktionen /cancel, /pause, /reactivate, /expire; Laufzeit /renew; Seat-Zuteilung /assign-seat, /remove-seat\n- `cancelBy`/`seatsUsed`: abgeleitet, read-only\n- Markenscope über asset.view/asset.manage."},{"name":"AssetRenewalReminder","description":"Fristen-Cockpit (04-15 §5): Verlängerungs-/Kündigungs-/Garantie-/Laufzeitende-Reminder, sortiert nach Fälligkeit.\n- read-only Liste/Detail + Aktionen /acknowledge (gesehen), /done (erledigt)\n- Filter status/kind/targetType/targetId."},{"name":"BatchSerialBatch","description":"Chargen (Doc 25 AP 2.1, G1) — der Rückverfolgungs-Anker.\n\n**Bewusst kein POST auf die Charge selbst:** eine Charge entsteht durch einen Wareneingang,\nnicht durch einen Verwaltungsakt. Wer sie von Hand anlegen könnte, hätte Bestand ohne Bewegung\n— und genau die Lücke sucht eine Prüfung. Was hier geht, ist **Sperren und Entsperren**: die\nHandlung, die im Rückrufsfall zählt."},{"name":"BatchSerialProductTracking","description":"Nachweispflicht je Artikel (Doc 25 AP 2.1/2.2): keine · Charge (optional mit MHD) · Seriennummer.\n\n**Die Umstellung ist ein Eingriff, kein Schalter.** Wer einen Artikel mit bestehendem Bestand\nauf Chargenpflicht stellt, hat ab dem nächsten Abgang Ware ohne Charge — deshalb weist der\nSchreibpfad das ab, solange Bestand ohne Nachweis existiert. Sauber ist: leer buchen, umstellen,\nmit Charge wieder einbuchen."},{"name":"BatchSerialTrace","description":"**Verwendungsnachweis / Rückruf-Auskunft** (Doc 25 AP 2.1, G1) — wozu Chargenführung überhaupt\nbetrieben wird.\n\nDie Frage, die im Ernstfall gestellt wird, lautet: „Charge X ist zurückzurufen — wer hat Ware\ndaraus bekommen?\" Ohne diese Auskunft ist jede Chargenerfassung Buchhaltung ohne Zweck.\n\nBeantwortet wird sie aus dem **Bewegungsjournal** (`StockMovement.batchRef`/`serialRef`), nicht\naus den Chargen selbst: die Charge weiß, wie viel noch da ist — das Journal weiß, wohin der\nRest gegangen ist."},{"name":"BillingPreview","description":"Abrechnungs-Vorschau (04-06 §13 S6-3).\n- Post: baut Vorschau aus freigegebenen Zeiten + fälligen Recurring-Plänen\n- ready: markiert geprüft; handoff: übergibt an lexoffice, setzt Zeiten auf invoiced\n- Beträge in Cent."},{"name":"LexofficeSyncRun","description":"lexoffice-Sammellauf als API-Aktion (`POST /v1/billing-previews/lexoffice-sync-run` → {synced, skipped, failed}).\n- API-Pendant zu `finance:lexoffice-sync`; vorher nur Einzel-Handoff exponiert, Sammellauf nur CLI/Cron\n- selbe Service-Logik ({@see \\Octi\\Plugin\\Billing\\Service\\LexofficeSyncService::processPending()})\n  unter gleichem `default-schedule`-Lock wie Scheduler/CLI (belegt → 409)."},{"name":"RecurringBillingPlan","description":"Wiederkehrender Abrechnungsplan (04-06 §4.3).\n- meist automatisch aus aktivierten Lizenzen (Modul 07); manuell für Verträge/Pauschalen\n- pause/resume/end steuern den Lauf; Betrag in Cent (Netto je Zyklus)."},{"name":"RecurringPlanSummary","description":"Abo-Plan-Kennzahl-Aggregat für die Listenansicht (Perf-Muster {@see \\Octi\\Plugin\\Contract\\ApiResource\\ContractSummaryResource}).\n- MRR über ALLE aktiven Pläne (monats-normiert), Gesamtbestand statt geladener Seite\n- ersetzt frühere clientseitige listAll-Reduktion (stille 5000er-Truncation hätte Kennzahl unterschätzt)\n- read-only, markenscope-gefiltert, Ein-Element-Collection."},{"name":"RecurringBillingRun","description":"Recurring-Abrechnungslauf als API-Aktion (`POST /v1/recurring-billing-plans/run` → {created}).\n- API-Pendant zu `finance:recurring-run`; vorher nur CLI/Cron (Vorbild: POST /v1/invoices/dunning-run)\n- selbe Service-Logik ({@see \\Octi\\Plugin\\Billing\\Service\\BillingPreparationService::processDueRecurring()})\n  unter gleichem `default-schedule`-Lock wie Scheduler/CLI (belegt → 409)\n- ULID-Routen der Plan-Resource matchen das Literal `run` nicht (Format-Requirement)."},{"name":"Budget","description":"Resource 'Budget' operations."},{"name":"BudgetSummary","description":"Budget-KPI-Aggregat für die Übersicht (Perf, Audit R20 PERF-3; Muster\n{@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteSummaryResource}).\n- Summiert Geld-Budget/Verbrauch/Rest/Cap-Überschreitungen über den GESAMTEN gescopten Bestand, nicht nur die Seite.\n- Ersetzt frühere clientseitige listAll-Reduktion (bis zu 50 Requests/Ansicht).\n- Verbrauch via BudgetGuardService-Logik, gepuffert im KpiCache.\n- Read-only, markenscope-gefiltert, Ein-Element-Collection."},{"name":"BuilderBlockType","description":"Baustein-Katalog (ENT-BUILDER-04): serialisierbare Sicht auf die BlockTypeRegistry —\nnur Typen MIT settingsSchema; der Editor kennt keinen Typ namentlich. Kein Brand-Scope\n(Katalog = Programm, keine Daten)."},{"name":"BuilderCanvas","description":"Live-Canvas des Editors (ENT-BUILDER-16): der uebergebene ENTWURFS-Baum durch die echte\n{@see \\Octi\\Plugin\\Builder\\Render\\BuilderPageRenderer}-Pipeline — Rumpf-HTML + Basis-CSS je\nbenutztem Baustein-Typ + Theme-CSS. Nichts wird persistiert.\n\nAbgrenzung zu `/preview`: dort ein komplettes Dokument aus dem GESPEICHERTEN Entwurf, hier\nein Fragment aus dem ungespeicherten Baum des Editors. Element-CSS liefert der Server bewusst\nNICHT — das kompiliert der Editor lokal (TS-Port, Paritaet ueber Golden-Fixtures)."},{"name":"BuilderCollectionSourceItem","description":"Eintraege EINER Listen-Quelle als Auswahl-Paare (Doc 37 §7.4, Stufe 8) — der Eintrags-Wähler\nkuratierter Listen (`idIn`): der Redakteur pickt Eintraege von Hand statt zu filtern.\n\nQuellen-agnostisch ueber die Registry (Site-Collections, Blog-Beitraege, kuenftige Quellen) —\nbenannt wird ein Eintrag ueber das `labelField` der Quelle (SPI 2.62). Geliefert wird nur, was\ndie Quelle ohnehin freigibt: Veroeffentlichtes im sichtbaren Site-/Marken-Kontext."},{"name":"BuilderCollectionSource","description":"Katalog der Listen-Quellen (ENT-BUILDER-20, Doc 37 §7.4) — die Auswahl, aus der der\nBindungs-Wähler und der Repeater ihre Quelle beziehen.\n\nDer Katalog haengt am Kontext: jede Site-Collection ist eine eigene Quelle. Ohne `siteUlid`\nliefert er nur die statischen Quellen — Collections fremder Sites tauchen nie auf."},{"name":"BuilderDynamicSource","description":"Katalog der dynamischen Datenquellen (AP 3.2) fuer den Editor: key, label, island-Flag.\nNur lesend; die Aufloesung passiert beim Release-Bau bzw. ueber die oeffentliche Insel-API."},{"name":"BuilderLibraryExport","description":"Export eines Bibliotheks-Eintrags als portables JSON (AP 3.3) — Gegenstueck zum Import\nunter POST /v1/builder/library-items/import."},{"name":"BuilderLibraryItem","description":"Vorlagen-Bibliothek (S10(g), AP 3.3): gespeicherte Abschnitte/Seiten, globale Elemente,\nKomponenten (Doc 37 §7.6, ENT-BUILDER-21).\n- kind=global|component: Update baut alle aktiven Releases mit dieser Referenz neu (GlobalElementPropagator)\n- kind=component: propsSchema + slots; Instanz-Blocktyp `builderComponentRef`\n- Export/Import als Datei-Format `octibuilder-library@1`."},{"name":"BuilderPageAudit","description":"Pruefhinweise des ENTWURFS (B18 + AP 2.4): a11y-/SEO-/Kontrast-Befunde live im Editor —\ndieselben Befunde, die beim Release-Bau in metricsJson.findings protokolliert werden."},{"name":"BuilderPagePreview","description":"Vorschau des ENTWURFS: vollstaendiges HTML-Dokument, Ad-hoc gerendert OHNE\nRelease-Persistierung ({@see \\Octi\\Plugin\\Builder\\Service\\BuilderReleaseBuilder::buildPreviewHtml})."},{"name":"BuilderPage","description":"Baukasten-Flaeche (Doc 35, ENT-BUILDER-01/-03): Seite, Vorlage, Popup, Abschnitt.\n- Entwurfs-Baum (`blocks`) nur im Detail/Write; das Ausgelieferte ist immer ein Release\n- `status` abgeleitet: published (aktives Release) > scheduled (geplantes Release) > draft\n- kind=template/popup brauchen zusaetzlich template.manage/popup.manage (Processor)."},{"name":"BuilderRelease","description":"Release-Sicht einer Flaeche (ENT-BUILDER-01: das ERZEUGNIS) + die Veroeffentlichungs-\nHandlungen. Ein Release ist unveraenderlich — Zurueckrollen aktiviert ein aelteres."},{"name":"BuilderStyleClass","description":"Wiederverwendbare Stil-Klassen (ENT-BUILDER-17, Doc 37 §6.2).\n\nEine Klasse wirkt auf JEDE Fläche, die sie referenziert — deshalb hängt das Ändern am eigenen\nRecht `builder.class.manage`, nicht am Seiten-Recht. Zuweisen an einem Baustein reicht dagegen\n`builder.class.view` plus das übliche Stil-Recht an der Fläche."},{"name":"BuilderTheme","description":"Design-Token-Satz (ENT-BUILDER-05): Farbrollen hell/dunkel, Typo, Abstaende, Radien,\nSchatten, Bruchpunkte + der EINE versionierte Eigen-CSS-Pfad je Site.\n- jedes Update legt VORHER eine BuilderThemeVersion mit dem alten Stand an und hebt cssVersion\n- isDefault=true nimmt anderen Themes derselben Marke den Default."},{"name":"BuilderThemeVersion","description":"Historien-Zeilen eines Themes (ENT-BUILDER-05: versionierter Eigen-CSS-Pfad) —\nunveraenderlich; Wiederherstellen laeuft ueber POST /themes/{ulid}/restore."},{"name":"ChannelConnectorType","description":"Die Konnektor-Bibliothek als Katalog (Doc 25 AP 9.1).\n\n**Dieselbe Entscheidung wie beim Flow-Baustein (AP 8.4):** die Kanal-Maske kennt keinen\nKonnektor namentlich, sondern liest Fähigkeiten und Konfigurationsfelder hier. Stünde der\nKatalog im Frontend, bliebe ein Konnektor aus einem fremden Plugin unkonfigurierbar."},{"name":"ChannelListing","description":"Ein Artikel IN einem Kanal (Doc 25 AP 9.1 — Endgate „Listing-Lifecycle via API/MCP\").\n\nDer Lebenslauf steht vollständig hier: anlegen (`draft`) → senden (`published`) → zurückziehen\n(`unpublished`) → wieder senden. `error` ist kein Endzustand, sondern ein Zwischenstand mit\nBegründung — der nächste Lauf ist die Gelegenheit, an der er sich einrenkt."},{"name":"SalesChannel","description":"Ein Verkaufskanal (Doc 25 AP 9.1, Spec 04-48).\n\n**Vollständig über die API — auch das Anstossen.** Eine KI kann damit über MCP einen Kanal\neinrichten, Angebote anlegen, abgleichen und am Connect-Journal nachsehen, was passiert ist."},{"name":"ConnectAuthMethod","description":"Die Anmelde-Arten als Katalog (Doc 25 AP 8.6).\n\n- dieselbe Begründung wie beim Baustein-Katalog: die Oberfläche kennt keine Anmelde-Art\n  namentlich, sonst bekäme eine aus einem Fremd-Plugin nie eine Eingabemaske\n- `requiredSecrets` sagt der Einrichtung, WAS in der Integration hinterlegt sein muss"},{"name":"ConnectFlow","description":"Flow inklusive Bausteinen (Doc 25 Stufe 8, Spec 04-56 §5).\n\n**Vollständig über die API, und das ist Absicht (B6 Fähigkeit 11):** eine KI kann über MCP eine\nIntegration anlegen, sie testen und am Journal debuggen. Kein Wettbewerber kann das — aber nur,\nwenn wirklich JEDE Operation hier steht und nicht die Hälfte im Editor versteckt ist.\n\n`nodes` schreiben = voller Ersatz des Bauplans; ein Flow wird als Ganzes gepflegt."},{"name":"ConnectFlowVersion","description":"Fassungen eines Bauplans (Doc 38 Stufe 7, IC14).\n\nJedes Speichern hebt den Stand VOR der Änderung auf. Zurückholen ist damit kein Kunststück,\nsondern ein Klick — und selbst wieder rückholbar."},{"name":"ConnectLookupTable","description":"Zuordnungstabelle (Doc 25 AP 8.2, B6 Fähigkeit 4) — Fremdwert → eigener Wert.\n\nDer klassische Fall: Zahlart-Codes je Shop. In der Zuordnung selbst wären das lange\nWenn-Dann-Ketten; als Tabelle ist es eine Liste, die auch ein Nicht-Entwickler pflegt."},{"name":"ConnectMapping","description":"Wiederverwendbare Feld-Zuordnung (Doc 25 AP 8.2, B6 Fähigkeit 4).\n\n**`preview` ist der wichtigste Endpunkt hier.** Eine Zuordnung ohne Vorschau gegen eine ECHTE\nPayload ist eine Behauptung; erst die Vorschau macht sie prüfbar, bevor ein Fremdsystem sie zu\nsehen bekommt."},{"name":"ConnectNodeGroup","description":"Die Systeme, mit denen Abläufe sprechen können (Doc 39 Stufe 7).\n\n**Eigene Liste statt Wiederholung an jedem Baustein.** Die Bildmarken sind echte Firmenlogos und\ndamit einige Kilobyte gross; an 112 Bausteinen gehängt stünde dieselbe Grafik bis zu sechsmal je\nAnbindung in derselben Antwort. Hier steht jede Gruppe genau einmal.\n\nNebeneffekt, der genauso zählt: eine KI sieht über MCP in EINER Liste, welche Fremdsysteme\nangebunden sind — vorher musste sie das aus der Bausteinliste erschliessen."},{"name":"ConnectNodeType","description":"Die Bausteinbibliothek als Katalog (Doc 25 AP 8.4, Spec 04-56 §5).\n\n**Der Editor kennt keinen einzigen Baustein-Typ namentlich.** Er fragt diesen Endpunkt und baut\ndaraus Palette und Eingabemaske. Stünde der Katalog im Frontend, bekäme ein Konnektor aus einem\nfremden Plugin nie eine Oberfläche — die Zusage „ein neuer Konnektor ist ein neuer Dienst\"\ngälte dann nur für den Lauf, nicht fürs Bauen.\n\nNebeneffekt, der genauso zählt: eine KI sieht über MCP, welche Bausteine es gibt und welche\nFelder sie brauchen, statt sie zu raten."},{"name":"ConnectRun","description":"Lauf-Journal (Doc 25 Stufe 8, B6 Fähigkeit 7).\n\n**Die Einzelsicht trägt die vollständigen Payloads je Baustein** — Ein- UND Ausgang. Das ist\nder Unterschied zwischen „ist fehlgeschlagen\" und „an dieser Stelle kam DAS an und DAS ging\n * raus\". Ohne sie muss man eine Integration erneut auslösen, um sie zu verstehen — und bei einer\nBestellung, die schon angelegt wurde, ist das Datenschaden statt Fehlersuche.\n\nEigenes Leserecht `connect.run.view`: in den Payloads stehen Geschäftsdaten."},{"name":"ConnectStore","description":"Das Gedächtnis zwischen Läufen, von aussen sichtbar (Doc 38 Stufe 4).\n\nOhne diese Sicht wäre ein Abruf, der „nichts Neues\" meldet, nicht erklärbar: der Wasserstand\nsteht in der Ablage, und wer ihn nicht sehen kann, kann ihn auch nicht zurücksetzen."},{"name":"ConnectTemplate","description":"Vorlagen-Bibliothek (Doc 25 AP 8.5, B6 Fähigkeit 10).\n\n**Eine Vorlage ist der schnellste Weg zum ersten funktionierenden Flow** — und der beste Weg,\ndie Bauform zu lernen: was sie erzeugt, ist ein ganz normaler Flow, den man danach aufmacht und\numbaut. Deshalb bringt sie keine Sonder-Objekte mit, sondern genau das, was der Editor auch\nerzeugt hätte.\n\n**Installieren aktiviert NICHT.** Was danach fehlt (Geheimnis, ausführender Benutzer), steht in\n`errors` — dieselbe Liste, die `validate` liefert."},{"name":"ConnectWebhookScheme","description":"Die Webhook-Signatur-Verfahren als Katalog (Doc 25 AP 8.6).\n\n- speist die Auswahl an einem Flow mit Webhook-Trigger\n- `signatureHeader` sagt der Einrichtung, welche Kopfzeile das Fremdsystem senden muss"},{"name":"ContentAdapter","description":"Welche Ausspiel-Ziele kann DIESE Installation bedienen? (Programm 46 E).\n\nEine eigene Liste, weil sie beim ANLEGEN des ersten Ziels gebraucht wird — da gibt es noch\nkeine Zeile, an der sie haengen koennte. Sie haengt an den installierten Plugins: ohne\nWebseiten-Modul gibt es kein `site`, ohne Verbindungs-Modul kein `connect_flow`. Genau das\nsoll die Maske zeigen, statt eine Auswahl anzubieten, die ins Leere fuehrt."},{"name":"ContentAi","description":"KI-Vorschläge der Redaktion (Programm 46 E).\n\n`kind=draft` füllt die Felder eines Inhaltstyps, `kind=seo` schlägt Titel und Beschreibung für\nSuchmaschinen vor, `kind=image` erzeugt ein Aufmacherbild. ALLE DREI liefern nur Vorschläge:\nsie landen in der Maske, gespeichert wird durch einen Menschen — und veröffentlicht durch einen\nmit dem Freigabe-Recht.\n\nDas Bild landet dabei IM SYSTEM (Dateiablage, Ordner „Inhalte / KI-Bilder\"), nicht als\nAnbieter-Adresse: die sind nach Stunden tot, und ein veröffentlichter Beitrag hätte dann ein\nBild, das verschwindet.\n\nDas SCHREIB-Recht genügt: wer Beiträge schreiben darf, darf sich dabei helfen lassen. Ein\neigenes KI-Recht wäre eine weitere Stelle, an der Deckel auseinanderlaufen können."},{"name":"ContentChannel","description":"Ein Ausspiel-Ziel (Programm 46 E).\n\nEinrichtung, kein Tagesgeschaeft: ein neues Ziel bedeutet, dass jeder kuenftige Beitrag auch\ndorthin geht. Deshalb ein eigenes Recht — und deshalb ist die Liste der VERFUEGBAREN Adapter\nlesbar fuer jeden, der Beitraege pflegt: er soll sehen koennen, wohin sein Text kann."},{"name":"ContentItemBulk","description":"Eine SERIE Beitraege in EINEM Zug anlegen (`POST /v1/content/items/bulk`, Programm 47 Stufe 47-8).\n\nGANZ ODER GAR NICHT. Der Serien-Generator schlaegt sechs Beitraege vor, der Redakteur sagt „alle\nsechs uebernehmen\" — schluepften davon vier durch und zwei nicht, staende die Haelfte einer Serie\nim Kalender und niemand wuesste, welche zwei fehlen. Darum laeuft der ganze Zug in EINER\nTransaktion: bricht ein Eintrag, ist keiner angelegt, und die Antwort nennt den Eintrag mit\nseiner Position.\n\nDIE KOPFDATEN STEHEN OBEN, NICHT JE EINTRAG. Typ, Sprache, Marke, Ziele und Kategorien gelten\nfuer die ganze Serie — das ist es, was sie zur Serie macht. Je Eintrag bleiben nur die Werte\nund der Termin."},{"name":"ContentItem","description":"Ein Beitrag (Programm 46 E, ENT-MKT-08).\n\nDIE OPERATIONEN SPIEGELN DEN ZUSTANDS-AUTOMATEN, und die Rechte spiegeln die Verantwortung:\nschreiben, planen und archivieren sind `content.item.manage`; veroeffentlichen und\nzuruecknehmen sind `content.item.publish`. Der Unterschied ist die Aussenwirkung — was\neinmal gelesen wurde, holt man nicht zurueck.\n\nDER ZUSTAND HAT KEINEN SCHREIB-ZUGANG. Ihn direkt zu setzen wuerde den Automaten umgehen:\nein Sprung von `draft` nach `published` uebersprang die Fassung, den Zeitpunkt und die\nAusgabe an die Ziele. Zustaende aendert man ueber die benannten Wege."},{"name":"ContentOverview","description":"„Was ist schon da, und was mache ich hier?\" (Programm 47 Stufe 47-9).\n *\n * DIE ANTWORT AUF ZWEI FRAGEN, die eine Liste nie beantwortet: den FUNKTIONSSTAND (ist ein\n * Ausspiel-Ziel eingerichtet? laeuft die KI? gibt es Inhaltstypen?) und die ZAHLEN, die eine\n * Handlung ausloesen — allen voran die FEHLGESCHLAGENEN Veroeffentlichungen MIT Fehlertext.\n *\n * Genau die sind der Grund fuer diese Seite: ein Beitrag, der bei einem Ziel nicht ankam, taucht\n * in keiner Liste als Problem auf. Er steht als „veroeffentlicht\" da — nur eben nicht ueberall."},{"name":"ContentPublicationReport","description":"Der GEGENWEG: ein Ablauf meldet, was das Fremdsystem vergeben hat (Programm 46 E).\n\nOHNE IHN GIBT ES KEINE AKTUALISIERUNG, nur Neuanlagen. Der Ablauf hat gerade beim Zielsystem\neinen Beitrag angelegt und ist der Einzige, der dessen Kennung kennt. Meldet er sie nicht\nzurueck, legt der naechste Zug dort einen ZWEITEN Beitrag an — und beide stehen fuer die\nLeser da.\n\nDie drei Teile des Schluessels sind Pflicht: ohne die Sprache traefe die Meldung die falsche\nFassung, und die englische bliebe fuer immer „ausstehend\"."},{"name":"ContentType","description":"Ein Inhaltstyp — die FORM, die alle Beitraege dieser Art teilen (Programm 46 E).\n\nLESEN darf jeder mit dem Beitrags-Recht: ohne das Schema kann die Maske keinen Beitrag zeigen.\nSCHREIBEN verlangt ein eigenes Recht, denn eine Feld-Aenderung wirkt rueckwaerts auf JEDEN\nbestehenden Beitrag — ein neu gesetztes Pflichtfeld macht sie alle unvollstaendig."},{"name":"ContractActivity","description":"Aggregierte Vertrags-Kommunikation (10-kommunikation-integration, AP-4.3) — read-only\nVerdichtung der WorkItemMessages mit passender contractId. Analog AP-4.1."},{"name":"ContractAmendment","description":"Nachtrag/Versionierung eines Vertrags (04-05). Anlage vergibt nächste fortlaufende Version;\nMarken-Scope/IDOR über Provider/Processor."},{"name":"ContractHistory","description":"Vertrags-Historie (04-05 §3/AK8, read-only, append-only): lückenlose Timeline aller\nLebenszyklus- und Periodenereignisse. Filter: contractId, event."},{"name":"Contract","description":"Vertrags-Resource (04-05 §5). CRUD + Lebenszyklus-Operationen (aktivieren/pausieren/\nfortsetzen/kündigen/beenden/verlängern/indexieren), Anlage von Kontingenten/Prepaid/\nPositionen, Erzeugung aus Angebot. Item-Detail bettet Kontingente/Positionen/Prepaid/\nVerlängerungsregel ein."},{"name":"ContractStatus","description":"Vertrags-Status als Daten (04-05): konfigurierbar ohne Code. `key` = Contract::STATUS_*-Werte\n(Bestandsverträge bleiben kompatibel)."},{"name":"ContractSummary","description":"Vertrags-Kennzahl-Aggregat für die Listenansicht (Audit R18 Perf, Muster\n{@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}). MRR über alle aktiven\nVerträge (Pauschale je Zyklus monats-normiert), stets Gesamtbestand statt nur Seite —\nersetzt die frühere clientseitige `listAll`-Truncation (5000er-Limit)."},{"name":"ContractQuotaPeriod","description":"Kontingent-Perioden (04-05 §3/§5, read-only): Soll/Ist/Übertrag/Überverbrauch je Periode\n— Datenbasis für den Periodenverlauf im Vertragsdetail. Filter: contractId, quotaId, status."},{"name":"CreditOverride","description":"Einzelfreigabe über das Kreditlimit hinweg (Doc 25 AP 6.4).\n\nEigenes Recht `creditcontrol.limit.override` — bewusst getrennt vom Pflegen der Profile: wer\nLimits einträgt, soll nicht zwangsläufig auch über sie hinweg entscheiden dürfen. Die\nBegründung ist Pflicht (Muster der manuellen Versandfreigabe, AP 3.1); die Aktion läuft über\ndie API und wird damit vom Audit-Subscriber mitgeschrieben.\n\nKein DELETE, sondern `revoke`: eine widerrufene Freigabe bleibt als Zeile stehen."},{"name":"CreditProfile","description":"Kreditprofil je Kunde (Doc 25 AP 6.4, Spec 04-46 §5).\n\nDie Antwort trägt neben dem Rahmen IMMER den aktuellen offenen Saldo und die höchste offene\nMahnstufe — die Frage am Kreditprofil lautet nie „welches Limit hat der Kunde\", sondern „wie\n * weit ist es ausgeschöpft\"."},{"name":"CrmActivity","description":"Resource 'CrmActivity' operations."},{"name":"CrmAssist","description":"KI-Vertriebsassistenz für Deal/Lead (Doc 26 Stufe 7). `mode=draft_email` (7.1) erzeugt einen\nE-Mail-Entwurf, der Rückgabetext füllt im Composer das `body`-Feld vor. Weitere Modi folgen\n(7.2 summary …). Budget-Überschreitung → 409 (`errors.crm.aiBudgetExceeded`).\n\nDas `security`-Attribut ist SUBJEKTLOS (die Operation hat kein geladenes Objekt) und damit nur\ndas halbe Tor: den Subjekt-Schnitt zieht {@see \\Octi\\Plugin\\Crm\\Service\\CrmAssistService} über\n{@see \\App\\Platform\\Communication\\Service\\CommunicationSubjectGuard::assertCanViewSubject()} —\nfremde Marke, `owner_only` oder fehlendes Leserecht ⇒ 404 (Audit R41-N03)."},{"name":"CrmComposeMail","description":"1:1-Mailversand aus einem Deal/Lead (Doc 26 1.3) über den Communication-Send-Pfad (U-1): erzeugt\neine kundensichtbare `CommunicationMessage` und versendet — sofort oder zeitversetzt (send-later).\nPlatzhalter im Body ({{ customer_name }}, {{ contact_name }}, {{ deal_title }} …) werden aufgelöst.\nEmpfänger = Primärkontakt des Subjekts. Gruppen-Mail (Bulk) + Versand über das persönliche Postfach\ndes Owners sind spätere Verfeinerungen dieser Stufe.\n\nDas `security`-Attribut ist SUBJEKTLOS (das Subjekt steht erst im Rumpf): den Schnitt auf genau\ndieses Subjekt zieht der Processor über\n{@see \\App\\Platform\\Communication\\Service\\CommunicationAccess::assertCanPost()} — fremde Marke,\n`owner_only` oder fehlendes Recht ⇒ 404 (Audit R41-N03)."},{"name":"CrmDealHealth","description":"Deal-Gesundheit (Doc 26 7.3): heuristischer Win-Score, „stockt\"-Flag und Next-Best-Action-Schlüssel\n(Frontend übersetzt). Read-only, live berechnet, `crm.deal.view` + markenscharf."},{"name":"CrmForecast","description":"Forecast-Report (04-01 §4.3/AC10): gewichtet/ungewichtet, Best/Worst-Case, gewonnen/verloren.\nLive aggregiert, filterbar (ownerId/pipelineId/brandId), read-only, Beträge in Cent."},{"name":"CrmFunnelReport","description":"CRM-Funnel/Analytics-Report (Doc 26 6.1): Vorwärts-Funnel je Stufe + Konversion + Ø Verweildauer,\nWon/Lost inkl. Verlustgründe, Durchschnittsalter offener Deals, Aktivitätsvolumen und\nE-Mail-Performance. Live\naggregiert, per `pipelineId` (Pflicht) + `from`/`to` + `brandId` gefiltert, read-only, Beträge in Cent."},{"name":"CrmMerge","description":"Deal-/Lead-Merge (Doc 26 3.1): der Datensatz im Pfad ({ulid}) ist der GEWINNER, `loserUlid` der\nVerlierer. Der Verlierer wird nach dem Umpointen soft-deleted."},{"name":"CrmTicketLink","description":"Verknüpfung CRM-Vorgang (Deal/Lead) ↔ Ticket, über {@see \\Octi\\Plugin\\Crm\\Entity\\CrmWorkItemLink}\n— analog {@see \\App\\WorkItem\\ApiResource\\WorkItemLinkResource}.\nBidirektional, Pflicht-Filter: subjectType+subjectId (→ Tickets) ODER workItemUlid (→ Deals/Leads).\nMarken-Scope/IDOR über den jeweiligen Vorgang; nicht zugreifbare Gegenstücke werden ausgeblendet."},{"name":"Deal","description":"Resource 'Deal' operations."},{"name":"LeadDuplicateGroup","description":"Vorschlagsliste erkannter Lead-Dubletten (Doc 26 3.2): jede Zeile ist ein Cluster verdächtig\ngleicher Leads mit den auslösenden Gründen (`email` · `name`). Merge über\n`POST /v1/crm/leads/{ulid}/merge` (`crm.lead.manage`)."},{"name":"Lead","description":"Resource 'Lead' operations."},{"name":"CrmLostReason","description":"Konfigurierbarer Verlustgrund für Deals (Status als Daten), Schlüssel = `key`."},{"name":"Pipeline","description":"Resource 'Pipeline' operations."},{"name":"PipelineRoutingRule","description":"Deklarative Regel für automatische Pipeline-Zuweisung neu angelegter Leads/Deals. Schreibrechte\nvia `crm.pipeline.configure`; Brand-Scope-IDOR im Provider/Processor (analog {@see PipelineResource})."},{"name":"SalesSequence","description":"Sales-Sequence-Definition (Doc 26 2.1): Name + geordnete Schritte, in die Deals/Leads eingeschrieben\nwerden. `POST .../{ulid}/enroll` schreibt ein Subjekt ein."},{"name":"CrmSource","description":"Konfigurierbare Lead-/Deal-Quelle (Status als Daten), Schlüssel = `key`."},{"name":"CustomerGroupMember","description":"Sub-Resource /v1/customer-groups/{ulid}/members (04-26 §4).\n- POST: Zuordnung per customerUlid, idempotent je (Gruppe, Kunde)\n- DELETE: entfernt Zuordnung hart (Muster SupplierArticle)."},{"name":"CustomerGroup","description":"CRUD Kundengruppe (04-26 §8); Mitglieder/Preisregeln/Sichtbarkeiten als Sub-Resources\nunter /v1/customer-groups/{ulid}/…. DELETE = Soft-Delete (wirkt nicht mehr in\nPreisauflösung, Mitglieder/Regeln bleiben erhalten)."},{"name":"CustomerGroupPriceRule","description":"Sub-Resource /v1/customer-groups/{ulid}/price-rules (04-26 §5/§6), CRUD light.\nvalue-Semantik: percent → Prozent×100 (1050 = 10,50 %), fixed → Stückpreis in Cent."},{"name":"CustomerGroupVisibility","description":"Sub-Resource /v1/customer-groups/{ulid}/visibility (04-26 §5/KG2).\n- POST: Upsert je (Gruppe, Scope, Referenz), setzt `visible` neu\n- DELETE: entfernt die Zeile."},{"name":"ProductGroupPriceRule","description":"GET /v1/product-group-price-rules?productId= — alle scope=product-Regeln dieses Artikels\nüber alle Gruppen (Kundengruppen-Preise-Panel). Read-only; Pflege bleibt gruppen-scoped\nunter /v1/customer-groups/{ulid}/price-rules."},{"name":"FinanceBankAccount","description":"Bankkonten-Resource: CRUD der Konto-Stammdaten.\n- IBAN nur beim Schreiben (verschlüsselt); Lesen nur maskiert (`ibanMasked`, letzte 4 Stellen)\n- Löschen soft\n- `brandId` NULL = markenübergreifend (Schreiben braucht uneingeschränkten Marken-Scope, Muster DunningLevel)."},{"name":"FinanceBankConnectionAccount","description":"Ein Konto hinter einer Bank-Verknüpfung und seine Zuordnung zum eigenen Bankkonto\n(Doc 25 AP 5.3).\n\nDie Zeilen entstehen ausschliesslich aus dem `refresh` der Verknüpfung — sie beschreiben, was\nbeim Anbieter liegt. Veränderlich ist deshalb genau ein Feld: `bankAccountUlid`. Das ist die\nEntscheidung des Betreibers, welches fremde Konto in die eigene Buchhaltung läuft; alles andere\ngehört der Bank."},{"name":"FinanceBankConnectionProvider","description":"Die verfügbaren Bank-Adapter (Doc 25 AP 5.3).\n\n**Warum das eine API-Operation ist und keine Liste im Frontend:** welcher Anbieter verfügbar\nist, hängt vom installierten und aktivierten Plugin-Set ab. Stünde die Liste in der Oberfläche,\nbekäme ein Adapter aus einem fremden Plugin nie einen Eintrag — und die Zusage „ein neuer\nAnbieter ist ein neues Plugin\" gälte nur für den Abruf, nicht für das Einrichten.\n\n`configured` sagt, ob die Zugangsdaten des Anbieters hinterlegt sind. Ein nicht eingerichteter\nAdapter bleibt SICHTBAR — sonst sucht der Betreiber die Anbindung, die er gerade installiert hat."},{"name":"FinanceBankConnection","description":"Bank-Verknüpfung über einen Aggregator-Adapter (Doc 25 AP 5.3, G12).\n\n**Kein PATCH.** Was an einer Verknüpfung veränderlich ist, gehört dem ANBIETER: Zustand, Ablauf\nder Einwilligung, Kontenliste. Sie hier bearbeitbar zu machen hiesse, eine zweite Wahrheit über\ndieselbe Einwilligung zu führen. Geändert wird die Zuordnung — und die hängt am Konto\n({@see BankConnectionAccountResource}).\n\nDrei Aktionen: `begin` startet (oder erneuert) Zustimmung/SCA, `refresh` holt Zustand und\nKontenliste beim Anbieter, `sync` ruft die Umsätze ab. Alle drei sind eigene Operationen und\ndamit auch für Automation und MCP erreichbar (P-1/P-2) — der periodische Abruf ist genau das."},{"name":"FinanceBankStatementImport","description":"Kontoauszugs-Import je Konto (04-34 §4.1).\n- POST .../bank-accounts/{ulid}/import, Body {format: camt053|mt940|auto, content: base64} (Muster FileUploadProcessor, kein Multipart)\n- Antwort: Lauf-Ergebnis {format, imported, duplicates, failed, unmatchedTotal} (JsonResponse, kein Item, Muster DunningRun)\n- Idempotent: Re-Import derselben Datei erzeugt keine Dubletten (Import-Hash-Dedup), zählt `duplicates` hoch."},{"name":"FinanceBankTransaction","description":"Kontoumsatz-Resource: listen/lesen, manuell erfassen, Zahlungsabgleich als Aktionen.\n- Manuell erfassen: source `manual`, Dedup je Konto über Import-Hash (Duplikat → 409)\n- Aktionen: `auto-match` (Engine über offene Umsätze des Scopes), `match` (Ausgangsrechnungs-Zuordnungen ODER Eingangsrechnung), `ignore`/`unignore` (reversibel)\n- Umsätze ab Erfassung unveränderlich: kein PATCH/DELETE (405); MATCH ist endgültig, kein Unmatch (GoBD-sensibel, s. MatchingEngine)\n- Marken-Scope über die Marke des Kontos\n- `auto-match`-Literal kollidiert nicht mit ULID-Routen (Format-Requirement, Muster DunningResource)."},{"name":"FinanceCashBook","description":"Kassenbuch (Doc 25 AP 1.5, G14) — die **Bürokasse**: Portokasse, Handkasse, Barauslagen.\n\nAusdrücklich NICHT die Ladenkasse: eine Registrierkasse braucht eine zertifizierte technische\nSicherheitseinrichtung nach KassenSichV und kommt mit `OctiPos` (Stufe 11).\n\n**Kein Delete** — ein Kassenbuch mit Buchungen wird stillgelegt (`active=false`), nicht\ngelöscht: §147 AO verlangt die Aufbewahrung, und ein weggeräumtes Buch ist bei einer Prüfung\ndas schlechteste Ergebnis."},{"name":"FinanceCashEntry","description":"Kassenbuch-Zeilen (Doc 25 AP 1.5, G14).\n\n**Bewusst nur Lesen, Buchen, Stornieren und Abschließen — kein PATCH, kein DELETE.** Eine\ngebuchte Kassenzeile ist unveränderlich (§146 AO: die ursprüngliche Eintragung muss feststellbar\nbleiben). Eine Korrektur ist die Storno-Gegenbuchung; beide Zeilen bleiben stehen und beide\ngehen in den DATEV-Export."},{"name":"FinanceDatevExport","description":"DATEV-Buchungsstapel-Export (04-34 §4.4, Recht `accounting.export.run`, Muster PayrollExportResource).\n- GET export/preview?from&to[&scope=outgoing|incoming|both]: JSON-Vorschau (Zeilen/Summen je Scope + Warnungen); Automation/MCP sehen dieselben Daten wie der Download\n- GET export/file?from&to[&scope][&format=datev-extf]: Download als EXTF-CSV (Windows-1252, `output: false`, Muster PayrollExportFileProvider)\n- from/to Pflicht (400)\n- EXTF-Format bis Steuerberater-Abnahme dokumentierte Annahme (`externalApprovalPending`, 04-34 §9)."},{"name":"FinanceDirectDebitReturn","description":"Zurueckgegebene Lastschrift — die R-Transaktion (Doc 25 AP 5.2, Restposten).\n\n**Nur Anlegen und Lesen.** Eine Rueckgabe ist ein Bankvorgang; sie nachtraeglich zu aendern hiesse,\neinen Kontoauszug umzuschreiben. Eine irrtuemlich erfasste Rueckgabe wird ueber die Fachwege\nkorrigiert (Zahlung neu erfassen), nicht durch Bearbeiten des Belegs.\n\n**Eigenes Recht, nicht am Zahllauf haengend:** die Erfassung setzt eine bezahlte Rechnung zurueck\nauf offen und kann ein Kundenmandat sperren. Das ist eine andere Verantwortung als das\nZusammenstellen eines Einzugs — und in vielen Betrieben eine andere Person (Debitorenbuchhaltung\nstatt Zahlungsverkehr)."},{"name":"FinanceDocumentExtraction","description":"Beleg-Extraktion mit Pflicht-Vorschau (Doc 25 AP 5.4, G13b).\n\n`POST` liest ein Dokument und legt einen **Vorschlag** an — es entsteht KEIN Beleg. Erst\n`/confirm` erzeugt die Eingangsrechnung (als Entwurf, sie gibt sich nicht selbst frei).\n`PATCH` korrigiert den Vorschlag vorher: bestätigt wird, was ein Mensch gesehen hat, nicht was\ndie Maschine vorschlug.\n\n`source` ist die wichtigste Angabe der Antwort: `e_invoice` (deterministisch gelesen, ohne\nSprachmodell), `ai` (geschätzt) oder `none` (kein Text lesbar — ehrlich leer statt geraten)."},{"name":"FinanceEInvoiceImport","description":"E-Rechnungs-Import (Doc 25 AP 1.2, ENT-ERP-PAR-EINVOICE-01).\n\nNimmt eine XRechnung (UBL-XML) oder eine ZUGFeRD-/Factur-X-Rechnung (PDF mit Anlage) entgegen\nund legt daraus eine **vorbefüllte Eingangsrechnung im Entwurf** an. Gelesen wird\ndeterministisch — eine E-Rechnung ist bereits strukturiert; sie durch ein Sprachmodell zu\nschicken hiesse, eine exakte Angabe gegen eine wahrscheinliche einzutauschen.\n\nDie Antwort nennt neben dem angelegten Beleg auch, WAS der Beleg nicht hergab\n(`missingFields`) — der Anwender sieht damit sofort, was er nachtragen muss, statt es zu suchen."},{"name":"FinanceIncomingInvoiceMatch","description":"3-Wege-Abgleich einer Eingangsrechnung (Doc 25 AP 7.4): **Bestellung → Wareneingang → Rechnung**.\n\nZwei Operationen mit einem klaren Unterschied:\n- **GET** rechnet und antwortet, ohne irgendetwas zu ändern — die Klärfall-Ansicht.\n- **POST** hält das Urteil am Beleg fest und gibt die Rechnung frei, wenn sie in Toleranz liegt\n  und der Betreiber die Auto-Freigabe eingeschaltet hat. Deshalb verlangt POST das\n  Freigabe-Recht: eine Aktion, die freigeben KANN, darf nicht am Freigabe-Recht vorbei laufen."},{"name":"FinanceIncomingInvoice","description":"Eingangsrechnungs-Resource: CRUD im Erfassungs-Zustand + Workflow-Aktionen.\n- approve: captured → approved\n- mark-paid: captured|approved → paid (setzt paidAmount = grossAmount)\n- ER-Nummer wird beim Erfassen aus dem Markenkreis gezogen (nicht-gapless)\n- PATCH/DELETE nur solange `captured` (409 danach)\n- ULID-Routen mit Format-Requirement (Muster SalesOrder)."},{"name":"FinancePaymentProposal","description":"Zahlungsvorschlag (Doc 25 AP 5.1): welche freigegebenen Eingangsrechnungen an einem bestimmten\nTag zu zahlen sind — mit Begruendung je Zeile (Skontofrist / faellig / ueberfaellig).\n\nBewusst eine reine LESE-Sicht ohne eigenen Zustand: sie beantwortet „was waere zu tun\", der\nZahllauf ist die Entscheidung. `blockedRows` sind die Rechnungen, die zahlbar WAEREN, aber keine\nIBAN haben — sie stehen ausdruecklich drin, damit sie jemand in Ordnung bringt, statt\nstillschweigend zu verschwinden."},{"name":"FinancePaymentRun","description":"SEPA-Zahllauf (Doc 25 AP 5.1, G11) — der Weg vom Zahlungsvorschlag zur Bankdatei.\n\nDrei Rechte, drei Rollen: `view` (sehen), `manage` (zusammenstellen/verwerfen), `execute`\n(Datei ziehen und Ausfuehrung vermerken). Das ist der uebliche Schnitt im Zahlungsverkehr —\nwer Rechnungen zusammenstellt, muss nicht derselbe sein, der das Geld auf den Weg bringt.\n\n**Kein PATCH, kein DELETE.** Ein Lauf wird angelegt oder verworfen; eine Zusammenstellung\nnachtraeglich zu veraendern hiesse, eine bereits erzeugte Bankdatei zu widerlegen. Verworfen\nwerden kann bis zur Ausfuehrung — danach ist das Geld unterwegs."},{"name":"FinanceSepaMandate","description":"SEPA-Lastschriftmandat (Doc 25 AP 5.2, G11) — die Erlaubnis, ein Kundenkonto zu belasten.\n\n**Kein DELETE.** Ein Mandat wird widerrufen (`/revoke`), nicht geloescht: es ist der Nachweis,\ndass eingezogen werden durfte. Die IBAN ist nur schreibend erreichbar und wird ausschliesslich\nmaskiert zurueckgegeben (Muster Bankkonto) — sie in einer Liste auszugeben waere eine\nSammelauskunft ueber die Bankverbindungen aller Kunden."},{"name":"HrAbsenceBalance","description":"Urlaubskonto je Jahr (04-08 §6.3), read-only.\nremainingDays = Anspruch + Übertrag − genommen − geplant.\nPflege automatisch via Anträge/Genehmigungen + Jahreswechsel-Job."},{"name":"HrAbsence","description":"Abwesenheits-Resource (04-08 §4.3).\nSelf-Service-Antrag (POST) + Workflow-Ops approve/reject/cancel/provide-proof (H6/S8-1).\nworkingDays/status/approverId/proofRequired: read-only, vom Service gesetzt."},{"name":"HrAbsenceStatus","description":"Abwesenheits-Status als Daten (04-08 §3).\nkey == Absence::STATUS_* (requested/approved/rejected/cancelled)."},{"name":"HrAbsenceType","description":"Abwesenheitsarten (04-08 §3, „Status als Daten\").\nFlags steuern Konto-/Kapazitätswirkung, Genehmigungspflicht (H6), Nachweis (AU ab Tag X)."},{"name":"HrAvailability","description":"Netto-Verfügbarkeit je Mitarbeiter/Zeitraum (04-08 §6.1), read-only, für Ressourcenplanung (04-09).\nVerfügbarkeit/Tag = Soll-Stunden − Feiertage − genehmigte kapazitätsmindernde Abwesenheit; 0 vor Eintritt/nach Austritt."},{"name":"HrChecklistTemplate","description":"On-/Offboarding-Vorlagen (04-08 §4.4).\nitems = Schrittliste (Titel, Kategorie, Fälligkeits-Offset, Aktion, Zielreferenz) für Checklisten-Erzeugung."},{"name":"EmployeeCalendarConnection","description":"HR-Verwaltungssicht auf cal_connection-Zeilen des Calendar-Kernels (ownerType=employee, 04-08 §8).\nDieselben Verbindungen wie OctiScheduling-OAuth-Self-Service; POST legt Google-Verbindung manuell an.\nrefresh_token write-only, verschlüsselt in IntegrationCredentialStore. /sync = sofortiger Kernel-Abgleich."},{"name":"HrEmployeeDocument","description":"Personaldokument (04-08 §4.5/§6.7), DSGVO-sensibel, verschlüsselt.\nDatei-Bytes im DMS (fileId); content feldweise verschlüsselt, nie im Read (nur hasContent).\nretentionUntil steuert Aufbewahrungs-/Löschvorschlag."},{"name":"HrOnboardingChecklist","description":"On-/Offboarding-Checkliste (04-08 §4.4).\nErzeugung aus Vorlage; complete/skip lösen idempotent Provisionierung-/Asset-/Task-Gateways aus."},{"name":"HrPayrollExport","description":"Lohn-Export-Vorbereitung (04-08 §4.5, H7/S8-2), keine Abrechnung.\nPOST erzeugt Aggregat-Datei (Stunden/Abwesenheiten/Stammdaten je Periode) fürs Lohnbüro.\nDATEV-Format final mit Lohnbüro abzustimmen (externalApprovalPending)."},{"name":"HrPayrollExportRun","description":"Historie der vorbereiteten Lohn-Exporte (04-08 §4.5, Programm 21 AP 5.2-Rest / DII-8).\nRead-only Protokoll — kein Regenerieren: wer, wann, welche Periode, welches Format, wie viele Zeilen.\nGeschützt durch dasselbe `hr.payroll.export`-Recht wie die Export-Erzeugung."},{"name":"HrSkill","description":"Skill-Stammdaten (04-08 §4.2, H4).\nMarkenübergreifende Taxonomie, Grundlage für Skill-Matching; code = stabiler Schlüssel."},{"name":"CountryTaxRate","description":"Steuersätze der EU-Bestimmungsländer (Doc 25 AP 10.3, Spec 04-51 §4).\n\n⚠ Der ausgelieferte Katalog ist ein **Ausgangsstand**, kein gepflegter Rechtsdienst — Sätze\nändern sich durch nationale Gesetzgebung. Vor der ersten OSS-Meldung gegen die TEDB-Datenbank\nder EU-Kommission bzw. mit dem Steuerberater prüfen; genau dafür sind sie hier änderbar.\n\n`validFrom`/`validTo` sind kein Komfort: ein Beleg vom 30. Juni muss den alten Satz behalten,\nauch wenn am 1. Juli der neue gilt. Eine Satzänderung OHNE neues Fenster verfälscht rückwirkend\ndie Meldung des laufenden Quartals."},{"name":"ExchangeRate","description":"Kursbuch (Doc 25 AP 10.1, Spec 04-51 §2).\n\n**Der Wert ist immer „Fremdwährungseinheiten je 1 EUR\"** — genau so, wie die EZB ihn\nveröffentlicht. Wer 1 USD = 0,92 EUR eintragen will, trägt den Kehrwert ein und bekommt einen\nBeleg, der um den Faktor 1,4 danebenliegt; deshalb steht die Richtung in jeder Beschreibung.\n\nKein Marken-Scope: Kurse sind Marktdaten, keine Firmierung — jede Marke rechnet mit denselben."},{"name":"OssReport","description":"OSS-Quartalsmeldung (Doc 25 AP 10.3, Spec 04-51 §5).\n\n**Drei Schritte, bewusst getrennt:** erzeugen → freigeben → herunterladen.\n\nDie Freigabe ist das **Steuerberater-Gate** (06-R14) und hängt an einem eigenen Recht\n(`international.oss.confirm`). Sie ist nicht Bürokratie: eine OSS-Meldung ist eine\nSteuererklärung. Das System kann rechnen, aber nicht wissen, ob es alle Umsätze gesehen hat —\ndie Frage beantwortet ein Mensch, und die Antwort steht danach mit Name und Zeitpunkt im\nPrüfpfad.\n\nHerunterladen lässt sich nur eine FREIGEGEBENE Meldung: was beim BZSt eingereicht wird, soll\nniemand versehentlich aus einem Entwurf gezogen haben."},{"name":"OssThreshold","description":"Stand der EU-Lieferschwelle (Doc 25 AP 10.3, § 3c Abs. 4 UStG).\n\nDie Kennzahl, die man BRAUCHT, BEVOR etwas passiert: 10 000 € netto im Kalenderjahr, EU-weit\nzusammengerechnet, für Fernverkäufe an Privatpersonen. Wer sie überschreitet, versteuert ab dem\nüberschreitenden Umsatz im Bestimmungsland — praktisch heisst das, sich beim BZSt für OSS\nanzumelden. Eine Zahl, die man erst im Nachhinein sieht, kommt für diese Entscheidung zu spät."},{"name":"VatIdCheck","description":"USt-IdNr.-Prüfung gegen VIES und ihr Protokoll (Doc 25 AP 10.2, Spec 04-51 §3).\n\n**Die Liste ist ein Nachweis, kein Verlauf.** Wer innergemeinschaftlich steuerfrei fakturiert,\nmuss belegen können, dass die Nummer im Zeitpunkt der Leistung gültig war (§ 6a Abs. 4 UStG) —\ndafür steht die Bestätigungsnummer (`requestIdentifier`) an jeder qualifizierten Abfrage.\n\nErgebnisse sind drei, nicht zwei: `valid`, `invalid` und `unavailable`. Der dritte ist eine\nStörung des fremden Dienstes und wird NIE wie „ungültig\" behandelt."},{"name":"BillingPreviewCreateInvoice","description":"BillingPreview→Faktura-Brücke (Audit R18 #72): `ready`-Vorschau → Rechnungs-ENTWURF.\n- Alternative zur lexoffice-Übergabe (…/handoff), gleiche handedOver-Semantik (Doppel-Übergabe 409).\n- Lebt im Faktura-Plugin (Eigentümer Ziel-Beleg); deinstalliert → Route weg, deaktiviert → 404 (fail-closed, Processor prüft invoicing-Flag selbst).\n- Security wie lexoffice-Übergabe (04-06 §8.3); Marken-Scope (IDOR) via mayManageBrand im Processor."},{"name":"DunningLevel","description":"Mahnstufen-Konfiguration (04-21 §3/§7): CRUD je Marke (brandId NULL = markenübergreifender Fallback).\nEindeutig je (brandId, level); Mahnlauf ({@see \\Octi\\Plugin\\Invoicing\\Service\\DunningService}) eskaliert stufengerecht."},{"name":"InvoiceDunning","description":"Mahnvorgänge (04-21 §6/§9, Audit R18 #65).\n- Mahnhistorie je Rechnung (`GET .../{ulid}/dunnings`).\n- Mahnlauf über alle fälligen Posten (`POST /v1/invoices/dunning-run` → {overdueMarked, dunningsCreated}).\n- Mahn-Workflow je Mahnung: PDF (`GET .../{dunningUlid}/pdf`), Mail-Versand (`.../send`, setzt sentAt), „als versendet markieren\" (`.../mark-sent`, Postweg), Erledigen (`.../resolve`).\n- Plugin-Segment `invoices` (kein Descriptor-Segment); ULID-Requirement verhindert Match auf Literal `dunning-run`."},{"name":"InvoiceCorrectionSummary","description":"Kennzahl-Aggregat der Rechnungskorrekturen (Muster {@see \\Octi\\Plugin\\Quote\\ApiResource\\QuoteSummaryResource}):\nAnzahl + Summe über den GESAMTEN Korrektur-Bestand (type=credit), nicht nur die geladene Seite.\nErsetzt die clientseitige `listAll`-Reduktion der Korrektur-Ansicht (Audit R25) — die holte den\nBestand seitenweise über die reguläre Rechnungs-Collection und war zusätzlich still bei 5000\nDatensätzen abgeschnitten. Read-only, markenscope-gefiltert, Ein-Element-Collection."},{"name":"Invoice","description":"Rechnungs-Resource (04-21 §8, API-First).\n- CRUD im Entwurf + Workflow-Ops: festschreiben (lückenlose Nummer, GoBD), stornieren (Storno+Gutschrift, Antwort trägt `creditNoteUlid`), Mail-Versand (`.../send`, PDF-Anhang, Audit R18 #71), PDF-Download, One-Click „Auftrag → Rechnung\" (`.../from-order`).\n- Positionen eingebettet (`items`), beim Speichern bepreist (Kernel-LineCalculator); Summen read-only.\n- PATCH/DELETE nur im Entwurf — ab `sent` unveränderlich (409, Korrektur via Storno).\n- ULID-Requirement verhindert Match auf Literal-Segmente `from-order`/`dunning-run` (Muster SalesOrder)."},{"name":"InvoicePayment","description":"Zahlungseingänge (04-21 §8): erfassen (optionale Zuordnungen `matches` →\n{@see \\Octi\\Plugin\\Invoicing\\Service\\PaymentMatchService}, schreibt paidAmount/Status der Rechnungen fort) und listen.\nBrand-Scope wie die Rechnungs-Resource."},{"name":"RecurringInvoice","description":"Serienrechnung-Resource (04-21 §8, API-First).\n- CRUD der Vorlage (Kunde/Marke/Zyklus/Positionen) + Lifecycle-Ops: pause/resume/end, „jetzt ausführen\" (`run-now`, respektiert `runMode`).\n- Positionen eingebettet (`items`), beim Speichern als Anzeige-Schätzung bepreist; echte Rechnung entsteht erst beim Serien-Lauf.\n- Status read-only (Übergänge über pause/resume/end); nextRunAt/lastRunAt/generatedCount/Summen abgeleitet.\n- ULID-Requirement verhindert Match auf Literal-Segmente."},{"name":"KnowledgeArticleAttachment","description":"Datei-Anhang eines Wissensartikels (04-10). Referenziert bestehende DMS-Datei, kein Upload hier.\n\n- Sicht/Anhängen/Entfernen aus Bereichszugriff des Artikels (read/contribute), wie beim Artikel.\n- security prüft nur Katalog-Permission; IDOR + Datei-Recht setzen {@see ArticleAttachmentProvider}/\n  {@see ArticleAttachmentProcessor} durch (bewusst kein isGranted() auf markenbezogenem Objekt — affirmative-Trap).\n- downloadUrl = abgesicherte Datei-Download-Route; storagePath NIE exponiert."},{"name":"KnowledgeArticle","description":"Wissensartikel (04-10 §4.2).\n\n- CRUD + /publish, /versions (Verlauf+Diff), /restore (= neue Version).\n- Body wird beim Speichern serverseitig sanitisiert; saveVersion steuert Draft-Auto-Save vs. neue Version.\n- Sicht/Bearbeitung: {@see \\Octi\\Plugin\\Knowledge\\Security\\ArticleVoter} (Space-Zugriff) + globale Permission."},{"name":"KnowledgeLink","description":"Verknüpfung von Wissen an beliebige Vorgänge (04-10 §4.6, §6).\n\n- targetType+targetId: an Vorgang gehängte Wissensobjekte (zugriffsgefiltert).\n- sourceType+sourceId: Gegenrichtung (ausgehende Links der Quelle).\n- Anlegen/Löschen erfordert Link-Recht."},{"name":"KnowledgeFavorite","description":"Persönliches Lesezeichen auf ein Wissensobjekt (04-10 §4.2).\nListe/Anlegen/Entfernen nur für eigenen Nutzer."},{"name":"KnowledgeAsk","description":"„Frag das Wiki\" (04-10 §13 S10-2, K7). POST { \"question\": \"…\" }.\n\n- Beantwortet per RAG NUR aus zugriffsgefiltertem Wissensbestand, nennt Quellen.\n- Ohne aktive KI: Fallback auf Trefferliste."},{"name":"KnowledgeImport","description":"Bestands-Import in die Wissensdatenbank (Obsidian-Vault, Markdown-Ordner, alte Wiki-Exporte).\n\nAblauf bewusst zweistufig: das Archiv wird zuerst ganz normal in die Datei-Ablage hochgeladen\n(`POST /v1/platform/files`), hier wird nur noch dessen Kennung genannt. Damit gelten fuer die\nhochgeladene Datei dieselben Groessen-, Typ- und Virenpruefungen wie fuer jede andere Datei, und\ndieser Endpunkt bleibt eine gewoehnliche JSON-Operation — also auch ueber MCP bedienbar (P-1/P-2).\n\nDer Lauf selbst ist asynchron: bei einigen tausend Notizen dauert er Minuten."},{"name":"KnowledgeSearch","description":"Volltextsuche über den Wissensbestand (04-10 §4.6, AK #8).\n\n- q Pflicht; optional type (article/sop/template/solution), space.\n- Nur Treffer aus Bereichen mit Lesezugriff."},{"name":"KnowledgeSpace","description":"Wissensbereich (04-10 §4.1).\n\n- CRUD inkl. Zugriffsrechte-Pflege (access: Rolle/Person × Stufe).\n- Liste/Detail zugriffsgefiltert über {@see \\Octi\\Plugin\\Knowledge\\Security\\KnowledgeSpaceVoter}.\n- myLevel: effektive Stufe des aktuellen Nutzers (für UI)."},{"name":"KnowledgeTicketDraft","description":"Artikelvorschlag aus gelöstem Ticket (04-10 §13 S10-2, K7). POST { \"ticketUlid\": \"…\", \"spaceUlid\": \"…\" }.\n\n- Erzeugt per KI (Fallback: Roh-Verlauf) Artikel im Status draft im gewählten Bereich.\n- Verknüpft Artikel per EntityLink mit Quell-Ticket."},{"name":"KnowledgeSolutionBlock","description":"Lösungsbaustein für den Support (04-10 §4.5).\n\n- CRUD + /use: liefert fertige Lösung als Canned Response für Ticket.\n- Zählt usageCount (Telemetrie für Wissenslücken)."},{"name":"KnowledgeSop","description":"Standard Operating Procedure (04-10 §4.3).\n\n- CRUD inkl. nummerierter Schritte + /apply: erzeugt Tasks/Checklisteneinträge im Ziel (Snapshot).\n- Sicht/Pflege space-zugriffsgefiltert; „Anwenden\" zusätzlich Apply-Recht.\n- /confirm-read: (Pflicht-)Lektüre-Bestätigung (S10-1, idempotent).\n- Offene Pflichtlektüre: ?mandatory=true&unconfirmed=true."},{"name":"KnowledgeTemplate","description":"Template-Bibliothek (04-10 §4.4): Dokument-/Text-, E-Mail-, Angebotsbausteine mit Platzhaltern.\n\n- CRUD + /render: füllt {{platzhalter}} aus Zielkontext, unbekannte bleiben markiert."},{"name":"LicenseEvent","description":"Lizenz-Lebenszyklus-Timeline (04-07 §5).\n- read-only, Filter `?licenseId=`, chronologisch absteigend\n- Append-only, Δ-MRR je Event."},{"name":"LicenseLifecycleRun","description":"Lizenz-Lebenszyklus-Lauf als API-Aktion (`POST /v1/licenses/lifecycle-run`) — API-Pendant zu\n`license:lifecycle` (P-1/P-3, Audit R21 PAR-7; vorher nur CLI/Cron; Vorbild\n`POST /v1/recurring-billing-plans/run`).\n- Service-Logik: {@see \\Octi\\Plugin\\Licensing\\Service\\LicenseSchedulerService::run()}\n- selbes `default-schedule`-Lock wie Scheduler/CLI ({@see \\App\\Shared\\Console\\AbstractScheduledJobsCommand}) —\n  sonst DOPPELTE Verlängerung bei API+Worker parallel (belegt → 409)\n- `lifecycle-run` kollidiert nicht mit `{ulid}`-Aktionsrouten."},{"name":"License","description":"Lizenz-/Abo-Resource (04-07 §5, API-First).\n- CRUD + Lebenszyklus-Aktionen (aktivieren/verlängern/Plan ändern/aussetzen/reaktivieren/\n  kündigen/ablaufen), je mit {@see \\Octi\\Plugin\\Licensing\\Entity\\LicenseEvent} + Δ-MRR\n- Lizenzschlüssel nur mit key.view sichtbar."},{"name":"LicenseStatus","description":"Lizenz-/Abo-Status als Daten (04-07 §3).\n- konfigurierbar in Einstellungen, kein Code nötig\n- `key` == vormals License::STATUS_*."},{"name":"LicenseSummary","description":"Lizenz-Kennzahl-Aggregat (04-07 §5/§8) für die Listenansicht.\n- MRR/ARR + aktive/30-Tage-Verlängerungen, über GESAMTbestand (nicht nur geladene Seite)\n- read-only, markenscope-gefiltert, als Ein-Element-Collection."},{"name":"LicensingShopwareImportRun","description":"Shopware-Lizenz-Import als API-Aktion (`POST /v1/licensing/shopware-import-run`) — API-Pendant\nzu `app:licensing:import-shopware` (P-1/P-3, Audit R18 #69; vorher nur CLI, ohne Scheduler/UI).\n- Lauf-Logik: {@see \\Octi\\Plugin\\Licensing\\Service\\ShopwareImportRunner}\n- selbe Lauf-Sperre wie CLI/Scheduler (belegt → 409; unkonfiguriert → 422)."},{"name":"BillOfMaterial","description":"Fertigungs-Stücklisten (Doc 25 Stufe 12).\n\nGeändert wird ausschließlich im Entwurf. Eine freigegebene Version ist der Nachweis, woraus\ngefertigt wurde — wer etwas ändern will, erzeugt über `new-version` eine neue Fassung."},{"name":"ProductionOrder","description":"Fertigungsaufträge (Doc 25 Stufe 12).\n\nEs gibt bewusst kein PATCH: nach dem Anlegen ist jeder Schritt eine Buchung (freigeben,\nentnehmen, fertigmelden, abbrechen) — ein Formular-Update würde Mengen ändern, zu denen bereits\nBestand bewegt wurde."},{"name":"MarketingAdCampaign","description":"Werbekampagne in einem sozialen Netzwerk (Programm 46 D, ENT-MKT-06).\n\nDREI RECHTE STATT EINEM, und die Trennung ist der ganze Punkt: sehen (`ads.view`), im Entwurf\naendern (`ads.manage`) und SCHARF SCHALTEN (`ads.publish`). Der Unterschied zwischen den\nletzten beiden ist Geld — ein Entwurf kostet nichts, eine aktive Kampagne gibt jeden Tag aus.\nWer Texte schreiben darf, darf deshalb nicht automatisch das Budget freigeben.\n\nWas hier NICHT steht: die Kennzahlen. Klickrate, Kosten je Ergebnis und Rendite kommen aus\n`/report`, weil sie GERECHNET und nicht gespeichert werden — sonst gaebe es zwei Wahrheiten,\nund die gespeicherte waere ab dem ersten Nachtrag falsch."},{"name":"MarketingAdReport","description":"Auswertung der Werbekampagnen (Programm 46 D).\n\nALLE KENNZAHLEN WERDEN HIER GERECHNET, keine steht in der Datenbank. Das ist kein Sparzwang,\nsondern Richtigkeit: eine gespeicherte Klickrate waere ab dem Moment falsch, in dem das\nNetzwerk seine Zahlen nachtraeglich korrigiert — und das tut es bis zu drei Tage lang. Eine\ngerechnete Kennzahl korrigiert sich mit.\n\nDer Zeitraum ist Pflicht-Vokabular der Anfrage, nicht ein Filter unter vielen: „Kosten je\nAnfrage\" ohne Zeitraum ist keine Zahl, sondern eine Meinung."},{"name":"MarketingAudience","description":"Empfängermenge / Segment (04-13 §4.3, AK#5). CRUD + `/preview` zur Live-Größenanzeige."},{"name":"MarketingCampaignEnroll","description":"Empfaenger von Hand in eine Strecke aufnehmen (Programm 46 B4).\n\nDer Weg ist bewusst DERSELBE wie der automatische: es wird ein Aufnahme-Ereignis ausgeloest,\nkein Lauf von Hand gestartet. Ein zweiter Startweg haette die Dedupe-Zusage umgangen — und\ngenau die haelt einen Empfaenger davon ab, dieselbe Strecke zweimal zu bekommen."},{"name":"MarketingCampaignMessageTest","description":"Testmail EINER Nachricht der Strecke (Programm 47 Stufe 47-2).\n\nWARUM AN DER NACHRICHT und nicht an der Strecke: wer die vierte Mail schreibt, will die vierte\nMail sehen. Ein Test, der immer die erste schickt, beantwortet die Frage nicht — und einen\nganzen Streckenlauf abzuwarten dauert Tage.\n\nDie Nachricht wird ueber ihre POSITION angesprochen. Eine Nachricht IST ein Automations-Schritt\nund hat bewusst keine zweite Wahrheit daneben (ENT-MKT-12); die Position ist damit die einzige\nAdresse, die es gibt — dieselbe, an der auch Sprungziele und Schritt-Zahlen haengen.\n\nEIGENE Ressource statt einer Zusatz-Operation an der Strecke (Muster {@see CampaignEnrollResource}):\nFelder, die es nur fuer EINE Operation gibt, an der Haupt-Ressource zu fuehren macht deren\nSchreib-Vertrag unscharf — und in OpenAPI/MCP taucht dann bei jedem PATCH ein `testEmail` auf,\ndas dort nichts bewirkt."},{"name":"MarketingCampaign","description":"Mail-STRECKE (Programm 46 B3, ENT-MKT-03) — die Sicht auf die Metadaten-Huelle.\n\nWas hier NICHT steht, ist Absicht: die SCHRITTE gehoeren der Automation und werden ueber\n`/v1/automations/{ulid}` gepflegt. Zwei Wege, dieselben Schritte zu schreiben, waeren zwei\nValidierungen — und die zweite waere die laschere.\n\n`active` ist LESEND und spiegelt `automation.active`. Ein eigener Schalter waere ein zweiter\nZustand fuer dieselbe Sache; der eine Tag, an dem beide auseinanderfallen, ist der Tag, an dem\neine abgeschaltete Strecke weiter versendet."},{"name":"MarketingDispatch","description":"Newsletter-/Kampagnen-Versand (04-13 §4.3, §9). CRUD + `/schedule`, `/send-now` (async,\ngedrosselt), `/test`. Versand erhöht geschützt (`marketing.campaign.send`)."},{"name":"DispatchStatus","description":"E-Mail-Kampagnen-Status als Daten: in Settings ohne Code konfigurierbar.\n`key` entspricht den Dispatch::STATUS_*-Werten."},{"name":"MarketingEmailEvent","description":"Tracking-Ereignisse eines Versands (04-13 §4.3). Read-only, gefiltert über den PFLICHT-Parameter\n`?dispatchId=` (deklariert, damit Automation/MCP ihn kennen — Audit R28/APIUI-02)."},{"name":"MarketingEmailTemplate","description":"Wiederverwendbare E-Mail-Vorlage in Marken-CI (04-13 §3, S13-2). CRUD; Abmeldeblock ist Pflicht."},{"name":"MarketingEmailTemplateTestSend","description":"Testversand einer Kampagnen-Vorlage (Doc 46 A3).\n\nDer Grund, warum es das braucht: eine Vorlage sieht im Canvas richtig aus und im Postfach\ntrotzdem falsch — Outlook rechnet Zeilenhoehen um, Gmail schneidet `<style>` weg, ein\nBild-Proxy skaliert. Nur ein echter Versand beantwortet das.\n\nKein Bulk-Weg: EIN Empfaenger, Betreff mit `[Test]`-Vorsatz, Demo-Empfaengerdaten. Der\nKampagnen-Versand laeuft unveraendert ueber seine eigene Strecke."},{"name":"MarketingFormSubmission","description":"Eingegangene Formular-Absendungen (04-13 §4.1, §5 Posteingang). Read + `/convert` (zu Lead),\n`/spam`/`/unspam` (Spam-Korrektur). Lead-Anlage automatisch bei Eingang; `/convert`\nre-konvertiert z.B. vormals als Spam markierte Einträge."},{"name":"MailVariable","description":"Die Platzhalter, die eine Marketing-Mail WIRKLICH ersetzt (Owner-Weisung 2026-09-03).\n\nWARUM ALS SCHNITTSTELLE und nicht als Liste im Browser: es ist eine Aussage des Servers\ndarüber, was er beim Versand tut. Eine im Frontend gepflegte Zweitliste wäre genau die Stelle,\nan der beide auseinanderlaufen — und der Unterschied fiele im Postfach des Empfängers auf."},{"name":"MarketingAi","description":"KI-Assistenz fürs Marketing (04-13 S13-3): Betreffzeilen, Textentwurf, Segment-Idee. POST mit\n`{ \"kind\": \"subject|body|segment|image|campaign|ads_copy|ads_plan|ads_summary\", \"brief\": \"…\" }`. Degradiert ohne aktive KI sauber.\n\n`kind=image` (Programm 46 C1) erzeugt ein BILD und legt es in der Dateiablage ab — die Antwort\ntraegt die Datei-Kennung, nicht die Bytes. Ein eigenes Recht gibt es dafuer bewusst nicht: die\nDeckel sind das KI-Budget und die Drossel, und beide gelten fuer jeden Weg gleichermassen."},{"name":"MarketingConsent","description":"Einwilligungs-Verwaltung (04-13 §4.2, §5). Read + manuelle Erfassung (dokumentierter Nachweis) +\n`/withdraw` (Abmeldung → Suppression) + `/resend-doi` (DOI-Mail erneut versenden, nur `pending`)."},{"name":"MarketingDashboard","description":"Marketing-Dashboard-Kacheln (04-13 §5): neue Submissions, aktive Kampagnen, ausstehende Consents,\nletzte Versände, Leads-je-Quelle — read-only Aggregat. Markenscope-gefiltert (04-13 §7)."},{"name":"MarketingMailCanvas","description":"Canvas-Render der KAMPAGNEN-Vorlagen (Doc 46 A2, ENT-MKT-01/-02).\n\nEigener Endpunkt, weil das Recht ein anderes ist ({@see MarketingPermissions::CAMPAIGN_MANAGE}\nstatt der Systemmail-Verwaltung) und der Abmelde-Baustein hier PFLICHT ist. Die Render-Logik\ndahinter ist dieselbe wie fuer Systemmails ({@see \\App\\Platform\\Mail\\Service\\MailCanvasService})\n— zwei Fassungen hiessen zwei Erzeugnisse aus demselben Baum.\n\nPersistiert nichts."},{"name":"MarketingReport","description":"Akquise-Auswertung (04-13 §4.4, AK#7): Leads je Quelle/Kampagne und die Conversion-Kette. Filter\nüber `?from=` / `?to=` (ISO-8601). Read-only Aggregat."},{"name":"MarketingSuppression","description":"Versand-Sperren / Blacklist (04-13 §4.2, §6, M6). Liste + manuelle Sperre + Aufhebung (Löschen)."},{"name":"MarketingWebForm","description":"Einbettbares Web-Formular (04-13 §4.1). CRUD inkl. Embed-Snippet; öffentliche Absendung über\n{@see \\Octi\\Plugin\\Marketing\\Controller\\PublicFormController}."},{"name":"TeamsChannelLink","description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.2).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\MsTeams\\Controller\\TeamsInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\MsTeams\\Entity\\TeamsChannelLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler."},{"name":"BinStock","description":"Was wo im Lager liegt (Doc 25 AP 4.8) — die Lese- und Buchungsfläche der Platz-Verteilung aus\nAP 4.7.\n\n**`putaway` ist EINE Aktion für zwei Wege**, weil es am Gerät derselbe Handgriff ist:\n - ohne `fromBinCode` wird bisher nicht verortete Menge auf einen Platz gelegt (Einlagerung nach\n   dem Wareneingang, mobil einstufig);\n - mit `fromBinCode` wird von Platz zu Platz umgelagert — der zweistufige Weg über den\n   Wareneingangsplatz und zugleich die freie Umlagerung, die bis hierher fehlte.\n\nBenennbar über `X-Idempotency-Key`: die Scanner-Warteschlange darf nach einem Funkloch\nwiederholen, ohne zweimal einzulagern."},{"name":"ProductDefaultBin","description":"Feste Vorgabeplätze je Artikel (Doc 25 AP 4.8, B1 (c)).\n\nSie beantworten „wo gehört das hin\" VOR jeder Sortier-Strategie. Mehrere je Artikel sind\nerlaubt — ein Fach kann voll sein, dann ist der Nachbar die richtige Antwort."},{"name":"PutawaySuggestion","description":"Platzvorschlag der Einlagerung (Doc 25 AP 4.8, B1 (c)).\n\nOhne `productId` beantwortet die Operation die vorgelagerte Frage: **was liegt überhaupt noch\nherum** — also welche Artikel im Lager Bestand haben, der keinem Platz zugeordnet ist. Mit\n`productId` liefert sie die Platz-Empfehlung für genau diesen Artikel.\n\nDer Vorschlag ist eine Empfehlung. Gebucht wird der Platz, der wirklich gescannt wurde."},{"name":"ReplenishmentRule","description":"Min/Max-Nachschubregeln je Lagerort (04-25 §4/§6, M5).\nGenau eine Regel je Lager × Produkt × Zielplatz (409 bei Duplikat) — ohne `targetBinId` gilt die\nRegel fürs ganze Lager, mit ihr für genau diesen Pickplatz (Doc 25 AP 4.7).\nVorschläge: `/v1/warehouses/replenishment-suggestions`."},{"name":"ReplenishmentSuggestion","description":"Nachschub-Vorschläge (04-25 §6, M5): read-only Auswertung aller Regeln.\nVorschlag bei available < minQty, Auffüllung bis maxQty.\nLiteral-Segment unter `/v1/warehouses` (kollisionsfrei zu {ulid}-Requirement)."},{"name":"StockTransfer","description":"Umlagerungs-Beleg (04-25 §5/§8).\nAnlage als Entwurf; Workflow-Aktionen `send` (→ in_transit) und `receive` (→ done).\nKein PATCH — gebuchte Transfers sind unveränderlich (Buchungs-Integrität)."},{"name":"WarehouseBin","description":"Lagerplätze/Bins eines Lagerorts (04-25 §4/§5, M2).\nCRUD unter `/v1/warehouses/{warehouseUlid}/bins`; Liste sortiert nach `pickPriority` (M6).\n`warehouseUlid` wird in den State-Klassen aufgelöst (DTO-Resource, FK-los, kein Doctrine-Link)."},{"name":"Warehouse","description":"Lagerort-Stammdaten (04-25 §8, API-First).\nCRUD über `warehouses.warehouse.*`; ohne Brand-Scope (Modul-Konvention).\nGenau EIN Default-Lager wird im Processor erzwungen (andere werden zurückgesetzt).\nULID-Requirement verhindert Kollision mit dem Literal-Segment `replenishment-suggestions`."},{"name":"WarehouseStock","description":"Bestandssicht eines Lagerorts (04-25 §5): read-only, mit Produktname/SKU-Anreicherung.\nBuchungen NICHT hier — nur über Kernel-Inventory-SPI bzw. Umlagerungs-Aktionen (P-1)."},{"name":"WarehouseStockValue","description":"Bestandswert EINES Lagers (Systemaudit `R41-34`, Entscheidung `ENT-R41-04`).\n\nDas Pendant zu `/v1/product-stock-value` — sobald mehr als ein Lager geführt wird, ist die\nGesamtsumme aus OctiProduct nicht mehr auf ein Lager herunterzubrechen; genau das ist aber die\nFrage, für die man ein Multilager einschaltet.\n\n**Die wichtigste Zahl hier ist `unvaluedProducts`** — wie beim Gesamtreport. Ein Bestandswert,\nder die Artikel ohne bekannten Einstandspreis stillschweigend als 0 mitzählt, sieht vollständig\naus und ist es nicht; das fällt genau dann auf, wenn er gegen die Buchhaltung gestellt wird.\n\nBeide Bewertungsverfahren zählen: im FIFO-Lager kommt der Wert aus den Bewertungsschichten, nicht\naus `avgCostAmount` (das dort gar nicht gepflegt wird) — Einzelheiten im Provider.\n\nMarken-Schnitt: bewusst KEINER. Weder `Warehouse` noch `wh_stock` tragen eine `brandId` (Lager\nsind markenlose Stammdaten, {@see \\Octi\\Plugin\\MultiWarehouse\\State\\WarehouseCollectionProvider});\nein Schnitt nur an dieser einen Stelle wäre keine Sicherheit, sondern eine Abweichung von der\nBestandsliste nebenan. Der Zugang bindet am Recht `warehouses.stock.*` — demselben, das die\nBestandsliste dieses Lagers freigibt."},{"name":"ProductPackaging","description":"Gebinde je Artikel (04-30 §3/§4).\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen (packaging.units.*).\n- Processor: genau 1 Default-Verkaufseinheit/Artikel; Zyklen-Check (UnitConversionService::assertAcyclic, 422)."},{"name":"UnitConversion","description":"Freie Umrechnungstabelle (04-30 §3/G4).\n- global (productId null) oder je Artikel, auch dimensionsübergreifend (\"1 stk = 250 g\").\n- Stammdaten ohne Brand-Scope, Rechte-Gates in security-Attributen.\n- Duplikat-Guard (from/to/product) im Processor → 409, da nullable product_id kein DB-Unique erlaubt."},{"name":"UnitOfMeasure","description":"Mengeneinheiten-Stamm (04-30 §3/§7).\n- Dimension, Basisfaktor, Nachkommastellen; markenübergreifend (kein Brand-Scope).\n- Schlüssel = code (Muster SalesOrderStatus).\n- DELETE hart, aber 409 solange in Umrechnungstabelle referenziert."},{"name":"PagesEntityRefOption","description":"Entity-ref-Auswahl (04-31 §4, Stufe 3) — nur mit Katalog-Leserecht des Zieltyps;\nmarkenbezogene Ziele nur im eigenen Marken-Scope (kein Leak über den Picker)."},{"name":"PagesEntityRefTarget","description":"Entity-ref-/Embed-Zieltypen des aktuellen Nutzers: nur Tokens, deren Katalog er lesen darf\n({@see \\Octi\\Plugin\\Pages\\Service\\EntityRefResolver::readableTypes()}) — kein Leak über die Typ-Liste."},{"name":"PageBacklink","description":"Backlinks einer Seite (\"Verlinkt von\", 04-31 §4): Quellseiten mit `pageLink` auf diese Seite,\naus `pages_backlink` ({@see \\Octi\\Plugin\\Pages\\Service\\PageBacklinkIndexer}) — ACL-gefiltert,\nohne Papierkorb/gelöscht, sortiert nach Titel."},{"name":"PageComment","description":"Kommentare an Seiten (04-31 §3/§4): Threads (`parentUlid`), Block-Anker (`blockId`), Resolve,\nMentions (Notification-Pipeline). Lesen/Verfassen: PageVoter (Verfassen ab Level `comment`);\nAuflösen: `pages.comment.resolve`; Löschen: eigene immer, fremde nur mit `pages.comment.delete`."},{"name":"PageExport","description":"Seiten-Export (04-31 §8, Stufe 5): Markdown (MCP-Wire-Format) oder escaptes HTML, read-only,\nPageVoter-gesichert. Inhalt als JSON (`content`); Download entsteht clientseitig. DB-Zeilen\nexportiert die Query-API (CSV)."},{"name":"PageFavorite","description":"Sidebar-Favoriten (04-31 §4/§5): Liste/Anlegen (idempotent je Nutzer+Seite)/Umsortieren/\nEntfernen, nur eigener Nutzer (Muster KnowledgeFavorite). Erfordert Lesezugriff (PageVoter);\nunsichtbare/gelöschte/Papierkorb-Seiten erscheinen nicht."},{"name":"PagePublic","description":"Read-only-Public-Link (04-31 §4/§6/§11.8, Stufe 5): unauth. (PUBLIC_ACCESS), Token-Auflösung —\nunbekannt/widerrufen/abgelaufen/Papierkorb/gelöscht alle 404 (Anti-Enumeration, Widerruf sofort).\nHTML ohne Embeds/entity_ref/Mentions; IP-Rate-Limit gegen Token-Raten."},{"name":"Page","description":"Seiten-API (04-31 §8). Inhalt: Block-JSON (`blocks`) oder Markdown (`markdown`, MCP-Wire-Format);\nItem liefert beides. Delete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`POST /collab-token`: Co-Editing-Ticket (409 `feature_disabled` ohne Collab-Dienst — 17 §4)."},{"name":"PageVersion","description":"Versions-Historie (04-31 §4, Kernel-Snapshots): Timeline, benannte Version anlegen,\nVersionsinhalt lesen (Diff-Grundlage `bodyText`/`bodyHtml`/`blocks`), Restore = NEUE Version\n(nie destruktiv, 17 §8 #6). Automatische Versionen schneidet der Schreibpfad zeitgesteuert."},{"name":"PagesAsk","description":"„Ask your workspace\" (Doc 17 §7 Stufe 6c, 04-31 §4; Muster KnowledgeAsk): RAG-Antwort nur aus\nsichtbaren Seiten (Suchindex + ACL-Nachfilter), nennt Quellen. Ohne KI: Trefferliste-Fallback."},{"name":"PagesDatabase","description":"Schema einer Datenbank-Seite (04-31 §3/§8, Stufe 3): Properties + Views + Titel-Property in\nEINEM Payload (Zeilen liefert `POST …/query`). PATCH: Titel-Property/Standard-View\n(`pages.database.manage`); `POST …/rows/import`: CSV bis 2000 Zeilen (§11.2). Rechte über\nPageVoter der Datenbank-Seite (§7, keine Delegation an eigenen Voter).\n\nCollection = Verwaltungs-Übersicht (`/pages/databases`): zugängliche Datenbanken\nworkspace-übergreifend, leichter Payload (`pages_db:list`)."},{"name":"PagesImport","description":"Markdown-Bundle-Import (04-31 §10, bewusst Datei-Array statt Zip): Pfade wie `Ordner/Seite.md`\nbauen den Seitenbaum, `.md` → Seiten, `.csv` → Datenbank-Zeilen; Notion-Suffixe als\n`externalRefs.notionId` (idempotenter Re-Import). Rechte: `pages.page.create` + Workspace-Edit\n(Objekt-Check im Processor, wie PageProcessor::create)."},{"name":"PagesProperty","description":"Spaltendefinitionen (04-31 §3/§8, Stufe 3): Anlegen (Key = Slug aus Name, danach unveränderlich),\nUmbenennen/Konfigurieren/Umsortieren, Typ-Konvertierung per PATCH `type` (nur unterstützte\nPaare, sonst 422 — {@see \\Octi\\Plugin\\Pages\\Service\\PropertyTypeConverter}), Soft-Delete.\nSchema-Verwaltung (`pages.database.manage`); UI liest Schema über `GET …/databases/{ulid}`."},{"name":"PagesRowQuery","description":"Zeilen-Query mit Filter-DSL der Views (04-31 §8, Stufe 3): `viewUlid` übernimmt Filter/\nSortierung (Body-`filters`/`sorts` übersteuern), paginiert über die Index-Tabelle (<200ms,\n§11.2). Anreicherungen ohne N+1: `personLabels`, `entityRefLabels` (fehlt = kein Zugriff,\n§11.3), `relationTitles`/`incomingRelations`."},{"name":"PagesRow","description":"Datenbank-Zeilen (04-31 §3/§8, Stufe 3). Werte laufen über RowValueNormalizer (PATCH merged,\n`null` löscht Key); `blocks`/`markdown` öffnen die Zeile als Seite (Host `page_row`).\nDelete = Papierkorb, 2. Delete = endgültig; `POST /restore` holt zurück.\n`fromTemplateRowUlid` befüllt aus Zeilen-Template. Rechte: PageVoter der Datenbank-Seite (§7)\n— Lesen = Seiten-Lesezugriff, Schreiben = Seiten-Edit-Level. Listen: `POST …/databases/{ulid}/query`."},{"name":"PagesView","description":"Views einer Datenbank (04-31 §3/§8, Stufe 3): Tabelle/Board/Liste/Kalender/Galerie/Zeitleiste\nmit Filter-/Sort-DSL, Gruppierung, Spalten-Whitelist. Persönliche Views (`shared=false`):\nLesezugriff genügt; geteilte Views: `pages.database.manage`. Schema: `GET …/databases/{ulid}`."},{"name":"PagesWorkspace","description":"Workspace-API (04-31 §8): Container des Seitenbaums + ACL-Grant-Verwaltung (eingebettete\nListe — PATCH `accessGrants` ersetzt den kompletten Satz)."},{"name":"Allocation","description":"Allocation-Resource (04-09 §4.2). CRUD Person→Projekt-Zuordnung + Vorbelegung aus Projekt-Mitgliedern.\nbrandId serverseitig vom Projekt abgeleitet, read-only."},{"name":"Capacity","description":"Kapazität je Mitarbeiter/Periode (04-09 §4.1, §6.1) — read-only Aggregat.\nFilter: from/to/granularity(day|week|month)/employeeId/includeFreelancers.\nPeriode liefert: gross/absence/holiday/reserve/available."},{"name":"Forecast","description":"Forecast-Resource (04-09 §4.4) — read-only, materialisiert.\nPrognostizierte Auslastung je Person/Marke/global und Periode inkl. Pipeline-Anteil + severity.\nFilter: scope/refId/granularity/from/to/severity."},{"name":"PlannerTimeline","description":"Balken-Zeitachse des Planners (Doc 27 Stufe 4.2/G22) — Personen-Zeilen statt Vorgangs-Hierarchie.\n\n**Abgrenzung zur Auslastungs-Matrix:** `/v1/planning/utilization` liefert AGGREGIERTE Stunden je\nPerson und Periode („wie voll ist jemand\"). Diese Sicht liefert die EINZELNEN Balken („woran\n * arbeitet jemand wann\") — beides nebeneinander, weil eine Zahl nicht verrät, welche Aufgabe sie\nverursacht, und ein Balken nicht verrät, ob die Person insgesamt überlastet ist.\n\n**Nur lesend.** Umterminieren schreibt der Client über `PATCH /v1/work-items/{ulid}` (E1/E4:\ndie Termine liegen am Work-Item, nicht an einer Planungs-Kopie)."},{"name":"PlanningChecklist","description":"Planning-Checkliste (Doc 27 4.3/G23) — read-only Auto-Scan des Planungsfensters: nahende/überfällige\nDeadlines, anstehende Meilensteine, genehmigte Abwesenheiten und überbuchte Personen.\nFilter: from/to/brandId/employeeId(mehrfach)/includeFreelancers/kind(mehrfach)."},{"name":"ReserveOverride","description":"Pro-Person-Override des internen Reserve-Anteils (04-09 §6.1, R8).\nOhne Override: globaler Default ({@see \\Octi\\Plugin\\Planning\\Service\\CapacityProvider::DEFAULT_RESERVE_PCT})."},{"name":"Scenario","description":"Szenario-Resource (04-09 §4.6, R7): Was-wäre-wenn-Planung mit isolierten Allocations.\nVergleich Szenario ↔ produktiv + transaktionale Übernahme; Produktivplanung bis Apply unberührt."},{"name":"ResourceSkillCatalog","description":"Read-only Skill-Katalog fürs Skill-Matching (04-09 §4.5).\nLiefert zusätzlich numerische `id`, da {@see SkillDemandResource} Skills über `skillId` (int-PK) referenziert.\nFilter: q (Name/Code), active."},{"name":"SkillDemand","description":"SkillDemand-Resource (04-09 §4.5): Skill-Bedarfe eines Projekts + Skill-Matching\n(rangierte Kandidaten inkl. freier Kapazität) + KI-Staffing-Vorschlag.\nBedarfe als gedeckt markierbar / wieder öffnenbar."},{"name":"Utilization","description":"Planungsboard / Auslastungs-Heatmap (04-09 §5, §6.3) — read-only.\nZeile je Mitarbeiter; cells je Periode: geplant/verfügbar/ist, utilizationPct, severity (ok/idle/warn/critical).\nFilter: from/to/granularity/brandId/employeeId(mehrfach)/includeFreelancers."},{"name":"WorkloadAutofix","description":"Umplanungs-Vorschläge bei Überlast (Doc 27 5.3) — **Vorschau, dann Bestätigung**.\n\n`…/workload-autofix` rechnet die überbuchten Tage aus und schlägt Verschiebungen vor, ohne etwas\nzu ändern. Erst `…/workload-autofix/apply` schreibt die vom Nutzer bestätigten Verschiebungen —\nund auch dann nur an Aufgaben, die dem Mitarbeiter zugewiesen sind."},{"name":"PosExport","description":"DSFinV-K-Datensätze (Doc 25 Stufe 11, Spec 04-52 §6).\n\nEin Lauf ist ein **Beleg**, kein Knopf: seine Bytes werden eingefroren und über die\nabgelegte Datei wieder ausgegeben. Ein Export, der bei jedem Herunterladen neu entsteht, ist\nkein Nachweis, sondern eine Momentaufnahme."},{"name":"PosPriceQuote","description":"„Was kostet das jetzt?\" — der Preis einer Bonposition, bevor es einen Bon gibt\n(Doc 25 Stufe 11, Spec 04-52 §3.1/§10).\n\n**Warum es diese Ressource gibt:** der Warenkorb liegt am Gerät, damit die Kasse auch ohne\nVerbindung bedienbar bleibt. Der Offline-Schnappschuss kennt aber nur den **Regalpreis** —\nKundengruppen-, Staffel- und Aktionspreise entstehen in der Preis-Pipeline und hängen an Daten,\ndie kein Gerät mitführt. Ohne diesen Abruf verkaufte eine lokal rechnende Kasse an jeder\nRabattaktion vorbei; genau der Fall, für den OctiPromotions gebaut wurde.\n\n**Ein Scan, ein Abruf, eine Antwort** — dieselbe Auflösung wie serverseitig beim Anlegen einer\nPosition ({@see \\Octi\\Plugin\\Pos\\Service\\PosProductResolver}). Fällt er aus, bleibt der\nRegalpreis stehen und der Verkauf läuft weiter: ein Preis von gestern ist besser als ein Kunde,\nder wartet."},{"name":"PosRegister","description":"Kassen-Stammdaten (Doc 25 Stufe 11, Spec 04-52 §2).\n\n`registerKey` (= DSFinV-K `Z_KASSE_ID`) ist nur beim Anlegen schreibbar: eine geänderte\nKassen-ID zerrisse die Verbindung zwischen bereits exportierten Abschlüssen und der Kasse, aus\nder sie stammen."},{"name":"PosSale","description":"Der Kassenbon (Doc 25 Stufe 11, Spec 04-52).\n\n**Zwei Bedienarten in einer Ressource** — und das mit Absicht:\n - **interaktiv**: `POST /sales` (leerer Warenkorb) → `add-item` → `finish`. So arbeitet die\n   Kasse am Tresen, weil der Kunde noch etwas dazulegt.\n - **in einem Zug**: `POST /sales` mit `items` UND `payments` schließt sofort ab. So räumt der\n   **Offline-Puffer** seine Warteschlange: ein Gerät ohne Verbindung kann kein Gespräch führen,\n   es kann nur einen fertigen Vorgang nachreichen.\n\nEs gibt bewusst kein PATCH und kein DELETE: ein abgeschlossener Bon ist unveränderlich, die\nRücknahme ist ein Gegenbon (§3.5)."},{"name":"PosSession","description":"Schicht und Kassenabschluss (Doc 25 Stufe 11, Spec 04-52 §3.4).\n\nEs gibt bewusst kein PATCH: eine Schicht wird geöffnet, bewegt und geschlossen — jeder Schritt\nist eine Buchung mit eigener Invariante. Ein Formular-Update könnte den Anfangsbestand\nnachträglich ändern und damit die Kassendifferenz verschwinden lassen."},{"name":"PosSnapshot","description":"Der Offline-Schnappschuss einer Kasse (Doc 25 Stufe 11, Spec 04-52 §10).\n\n**Eine eigene Ressource und kein Feld am Kassen-Stammsatz:** der Schnappschuss ist eine\nMomentaufnahme aus Kasse + Schicht + Artikelkatalog, die nur ein Kassengerät braucht. Am\nStammsatz wären das Felder, die jede Kassenliste mitschleppt, ohne sie je zu benutzen."},{"name":"CustomerPriceList","description":"Kundenindividuelle Preisliste inkl. Konditionen (04-28 §5/§8).\n- POST: legt Liste + `prices` an\n- PATCH: aktualisiert Felder, ersetzt `prices` bei Angabe vollständig\n- DELETE: Soft-Delete\n- `value`: price → Cent, percent → Prozent×100 (1050 = 10,50 %)."},{"name":"ProductCustomerPrice","description":"Produktsicht auf Kundenpreise (`GET /v1/product-customer-prices?productId=`).\n- Listet alle scope=product-Konditionen dieses Artikels über alle Preislisten\n- Read-only; Pflege bleibt kunden-scoped unter /v1/customer-prices."},{"name":"PriceTierSet","description":"Staffel-Set inkl. eingebetteter Stufen (04-27 §5/§8, Muster PropertyGroup-Options).\n- `tiers` schreiben = voller Ersatz, vorab TierValidationService-Check (422 bei Überlappung/falscher offener Stufe)\n- DELETE = Soft-Delete."},{"name":"LabelRender","description":"Ein gerendertes Etikett (Doc 25 AP 4.6) — das Ergebnis, nicht die Vorlage.\n\n**Eigene Ressource, weil es ein anderes Ding ist:** eine Vorlage ist ein Datensatz mit Detail-\nRoute; ein gerendertes Etikett ist eine Antwort. Beides in eine Ressource zu legen hieße, ein\nErgebnis ohne Identität durch die Identifier-Maschinerie zu schicken.\n\n`render` und `print` sind bewusst getrennte Endpunkte: zwischen „ansehen\" und „hundert Etiketten\n * drucken\" soll mehr liegen als ein vergessenes Feld in einem gemeinsamen Aufruf."},{"name":"LabelSubject","description":"Welche Dinge ein Etikett bekommen können — und mit welchen Variablen (Doc 25 AP 4.6).\n\nDie Liste kommt aus den registrierten Anbietern\n({@see \\App\\Platform\\Commerce\\Contract\\LabelSubjectProviderInterface}), nicht aus einer Konstante:\nein abgeschaltetes Chargen-Modul bietet keine Chargen-Etiketten mehr an, und ein neues Plugin\nbringt seinen Typ mit, ohne dass jemand hier eine Zeile ergänzt.\n\n**Die Beispielwerte sind der eigentliche Nutzen.** Ohne sie müsste ein Mensch eine ZPL-Vorlage\nblind schreiben und drucken, um zu sehen, was `{{ ean }}` eigentlich liefert."},{"name":"LabelTemplate","description":"Etiketten-Vorlagen (Doc 25 AP 4.6).\n\n**Die Liste zeigt auch die MITGELIEFERTEN Vorlagen** — sie stehen als Code und haben keine\nDatenbank-Zeile. Sie zu verschweigen hieße: die Verwaltung sagt „keine Vorlagen\", während das\nSystem druckt. Wer eine anpassen will, legt eine gleichnamige an; die gewinnt.\n\nRendern und Drucken liegen bewusst in einer EIGENEN Ressource\n({@see LabelRenderResource}): ein gerendertes Etikett ist eine Antwort, kein Datensatz."},{"name":"PrintJob","description":"Die Warteschlange des Hardware-Hubs (Doc 25 AP 4.4).\n\n**Kein PATCH und kein DELETE:** ein eingestellter Druckauftrag ist ein Vorgang, kein Datensatz.\nEr wird abgebrochen (solange ihn niemand geholt hat) oder nachgedruckt — beides sind eigene\nOperationen mit eigener Vorbedingung, die ein generisches PATCH verstecken würde.\n\n**Die Nutzlast wird nie zurückgelesen.** Ein Etikett enthält Empfängeranschrift und\nSendungsnummer; die Warteschlange ist eine Betriebsansicht und kein Dokumentenarchiv. Wer das\nEtikett braucht, holt es am Beleg."},{"name":"PrintWorkplace","description":"Arbeitsplätze des Hardware-Hubs (Doc 25 AP 4.4).\n\nDie Token-Ausgabe ist bewusst eine eigene Operation und kein Feld: sie ist die einzige Stelle,\nan der ein Klartext-Token existiert, und sie ist nicht idempotent — jeder Aufruf entwertet das\nvorige Token. Als PATCH-Feld getarnt wäre beides unsichtbar."},{"name":"Printer","description":"Drucker-Registry (Doc 25 AP 4.4).\n\n`documentTypes` ist die eigentliche Zuordnung: `shipping_label` an den Zebra, `delivery_note` an\nden A4-Drucker. Leer heißt „nimmt alles\" — der Ein-Drucker-Fall soll ohne Konfiguration laufen."},{"name":"ProcurementFrameworkAgreement","description":"Rahmenvereinbarung mit Lieferant (04-14 §3, KANN) — CRUD, Liste filterbar `?supplierRoleId=`."},{"name":"ProcurementReport","description":"Controlling-Auswertung Einkauf (04-14 §4/§5) — externe Kosten je Projekt/Lieferant (Soll vs.\nIst) + Kennzahlen. Read-only, markenscope-gefiltert."},{"name":"ProcurementPurchaseOrder","description":"Bestellung/Beauftragung an Externen (04-14 §4) — CRUD + `/approve`, `/send`, `/deliver`,\n`/cancel`, `/record-actual`, PDF-Download `/pdf` (§9). Positionen eingebettet.\n\nJEDE Item-Operation traegt das KATALOG-Recht der Operation am Objekt (Audit R43-31):\n`is_granted('procurement.po.approve', object)` — {@see \\Octi\\Plugin\\Procurement\\Security\\ProcurementBrandVoter}\nprueft genau dieses Recht IN DER MARKE der Bestellung. Die frueheren Sammel-Attribute\n`proc.view`/`proc.manage` prueften nur „irgendein Einkaufs-Recht in der Marke\" und liessen\n * zusammen mit dem subjektlosen Teil davor das Kreuzprodukt „Recht in A × anderes Recht in B\" zu.\nEin zusaetzlicher subjektloser Teil entfaellt: das Objekt-Recht traegt ihn schon."},{"name":"ProcurementPurchaseOrderStatus","description":"Bestell-Status als Daten (04-14 §3) — in Einstellungen pflegbar. `key` = PurchaseOrder::STATUS_*."},{"name":"ProcurementPurchaseOrderSummary","description":"Kopf-Kennzahl der Bestell-Liste (Audit R23) — serverseitige Aggregation über den GESAMTEN\ngefilterten Bestand, nicht über die geladene Seite.\n- Nimmt dieselben Filter wie `/v1/procurement/purchase-orders` entgegen und nutzt dafür dieselbe\n  Query-Basis ({@see \\Octi\\Plugin\\Procurement\\Service\\PurchaseOrderListQuery}) — Liste und Kennzahl\n  können nicht auseinanderlaufen.\n- Bewusst NICHT `/v1/procurement/report`: der Report summiert `budgetAmount` (Soll-Kosten je\n  Projekt/Lieferant), die Liste zeigt `totalAmount` (Bestellvolumen) — andere Zahl, anderes Recht.\n- Rechte identisch zur Liste (`procurement.po.edit`), damit die Kennzahl nie 403 gibt, wo die\n  Liste 200 liefert."},{"name":"ProcurementSupplierRating","description":"Lieferantenbewertung (04-14 §3/§4, KANN): Qualität/Termin/Preis je 1–5. Liste je `?supplierRoleId=`."},{"name":"ProductDeliveryTime","description":"Lieferzeit-Lookup (04-16 §3/§7): reine Lesesicht.\n- Am Artikel per `deliveryTimeCode` referenziert.\n- Zeilen aus Standard-Daten-Seed (`ProductStandardDataProvider`).\n- Bewusst keine Schreib-Operationen über die API."},{"name":"ProductManufacturer","description":"Hersteller-Stamm (04-16 §3/§7, PIM), markenübergreifend.\n- Inkl. GPSR-Pflichtangaben (Firmenname, EU-Verantwortlicher, Anschrift, Kontakt).\n- Anzeigename/Beschreibung/SEO je Locale in `translations` (min. 1 Zeile bei Neuanlage, sonst 422)."},{"name":"ProductBulkAction","description":"Sammelaktion auf mehrere Artikel (`POST /v1/products/bulk`).\n- Setzt Leitkategorie/Steuersatz/Status/Aktiv-Flag, ergänzt/entfernt Zusatzkategorien.\n- Aggregat-Antwort, synthetische Kennung (Muster {@see ProductImportResource}).\n- Je Artikel per Entität+Setter (kein Bulk-DQL — würde Audit/`ProductUpdated` umgehen).\n- null = Feld unangetastet; `categoryUlid=''` leert Leitkategorie.\n- Fehler je ULID gesammelt statt Abbruch."},{"name":"ProductCategory","description":"Katalog-Kategorie (04-16 §3/§7) als Baum (parentUlid/parentId).\n- `kind`: Reporting-Schnitt (service/product/license).\n- `categoryType`: Shop-Darstellung (page/structure/link).\n- Shop-Texte (Beschreibung/SEO/Slug) je Locale in `translations`; `name` = interner Fallback.\n- `/move`: hängt Kategorie atomar um, resequenziert Geschwister lückenlos."},{"name":"ProductDuplicate","description":"Artikel duplizieren (`POST /v1/products/duplicate` mit `{sourceUlid}`).\n- Bewusst COLLECTION-Post-Aggregat (Muster {@see ProductImportResource}):\n  Item-Op `/{ulid}/duplicate` mit leerem Rumpf ließe `$data` im Legacy-Flow unauflösbar.\n- Antwort trägt Kennung des NEUEN Artikels (UI-Navigation)."},{"name":"ProductImport","description":"CSV-Massen-Import des Produktkatalogs (`POST /v1/products/import`).\n- Base64-JSON `{content, dryRun?}` (Muster BankStatementImportResource, kein Multipart).\n- Upsert per SKU (nie Duplikate); Zeilenfehler gesammelt statt Abbruch.\n- `dryRun=true`: validiert vollständig, schreibt garantiert nichts.\n- Antwort: Lauf-Report `{dryRun, total, created, updated, skipped, errors[]}` (Muster PagesImportResource).\n- Spalten: sku (Pflicht) · name (Pflicht bei Neuanlage) · description · type · price ·\n  taxRate · category · manufacturer · unit · active. Details {@see \\Octi\\Plugin\\Product\\Service\\ProductCsvImporter}."},{"name":"Product","description":"Produkt-/Leistungskatalog-Resource (04-07 §5), markenübergreifend.\n- Lesen: catalog.view; Pflege: catalog.manage.\n- Preise stets in Cent (Money-VO, EUR)."},{"name":"ProductStock","description":"Bestandssicht je lagergeführtem Artikel (04-16 §6/§7, ein Lager).\n- Lesen: products.stock.view; Korrektur/Inventur (`…/adjust`, append-only Journal via\n  StockService) + Meldebestands-Pflege (PATCH): products.stock.manage.\n- Identifier: Artikel-ULID (`productUlid`), 1:1 zum Artikel."},{"name":"ProductVariant","description":"Produktvariante (04-07 §3/§4.1): Edition/Seat-Stufe/Plan.\nFilterbar nach `productId`; optionaler Preis-Override in Cent; freie attributes."},{"name":"ProductVersion","description":"Versionsstand eines (Lizenz-)Produkts (04-07 §3/§4.1): SemVer mit Release-/EOL-\nDatum. Filterbar nach `productId`."},{"name":"ProductPropertyGroup","description":"Eigenschafts-/Attribut-Gruppe inkl. eingebetteter Optionen (04-16 §3/§7, z. B. Farbe → Rot/Blau).\n- `variantForming`: Gruppe als Varianten-Achse; `filterable`: Facetten-Sichtbarkeit.\n- `options`-Sync additiv (neu anlegen, per ulid aktualisieren — nie löschen; ausblenden via `active=false`).\n- Texte je Locale in `translations` (Gruppe) bzw. `options[].translations` (Option)."},{"name":"StockTakeLine","description":"Zählzeile einer Inventur (Doc 25 AP 2.3).\n\n**`version` ist Pflicht beim Zählen, und das ist kein technisches Detail:** zwei Zählende am\nselben Platz sind der Normalfall. Ohne die gelesene Version überschreibt der zweite Eintrag den\nersten stillschweigend — beide Zahlen sehen plausibel aus, und die falsche gewinnt. Mit ihr\nbekommt der zweite einen 409 und zählt nach.\n\n**`expectedQty` fehlt bei blinder Zählung**, solange gezählt wird. Nicht ausgeblendet in der\nOberfläche, sondern nicht ausgeliefert — sonst steht der Sollwert im Netzwerk-Protokoll und die\nZusage „blind\" ist keine."},{"name":"StockTake","description":"Inventur (Doc 25 AP 2.3, B5; HGB §240) — der Zähl-Beleg als eigenes Objekt.\n\nDer Ablauf ist bewusst in vier getrennte Operationen zerlegt statt in ein Status-Feld, das\nbeliebig gesetzt werden kann: `populate` friert den Sollstand ein, `start` gibt die Zählung\nfrei, `finish` schließt sie ab, `book` bucht die Differenzen. Jeder Schritt hat genau eine\nzulässige Vorbedingung — ein PATCH auf `status` hätte diese Ordnung nicht.\n\n**`book` ist final.** Eine gebuchte Inventur wird nicht storniert, sondern durch eine neue\nZählung ersetzt."},{"name":"ProductStockValue","description":"Bestandswert-Report (Doc 25 AP 2.4, G25).\n\n**Die wichtigste Zahl hier ist `unvaluedProducts`.** Ein Bestandswert, der die Artikel ohne\nbekannten Einstandspreis stillschweigend als 0 mitzählt, sieht vollständig aus und ist es\nnicht — und das fällt genau dann auf, wenn er gegen die Buchhaltung gestellt wird. Deshalb\nweist dieser Report die Lücke aus, statt sie zu glätten."},{"name":"ProductVariantGeneration","description":"Varianten-Generierung eines Container-Artikels (04-16 §6/§7).\n- POST spannt aus VariantSet-Achsen das kartesische Produkt der aktiven Optionen auf,\n  legt fehlende Varianten idempotent an ({@see \\Octi\\Plugin\\Product\\Service\\VariantGenerationService}).\n- Kein Request-Body nötig; Antwort: {created, variants: [{ulid, sku, name}]}."},{"name":"ProjectAcceptance","description":"Abnahme intern/Kunde je Projekt/Meilenstein (04-02 §4.5, PM7).\n- Anfordern: legt pending an, löst {@see \\App\\Project\\Event\\AcceptanceRequested} aus (Portal-Benachrichtigung)\n- Kunden-Entscheidung nur im Portal (beweissicher, ApprovalService)\n- interne Abnahme: direkt via POST /v1/project-milestones/{ulid}/accept\n- daher: Anfordern akzeptiert nur kind=customer."},{"name":"Board","description":"Resource 'Board' operations."},{"name":"Milestone","description":"Resource 'Milestone' operations."},{"name":"MilestoneStatus","description":"Meilenstein-Status als Daten (konfigurierbar ohne Code).\n`category` bildet den Lebenszyklus open|active|done|cancelled ab."},{"name":"ProjectActivity","description":"Aggregierte Vorgangs-Kommunikation eines Projekts (10-kommunikation-integration, D5/AP-4.1).\n- read-only Verdichtung der WorkItemMessages aller Vorgänge (Tasks+Tickets) mit projectId = Projekt\n- getrennt von CommunicationMessage (subjectType=project, Portal-Kollaboration): das hier zeigt\n  Vorgangs-Kommunikation, jene die direkte Projekt-Kunden-Korrespondenz."},{"name":"ProjectAi","description":"KI-Assistenz am Projekt (Doc 27 Stufe 5) — durchgehend **Vorschlag statt Automatik**.\n\nVier Operationen, alle als POST (sie verbrauchen KI-Budget und sind damit keine cachebaren Reads):\n - `…/ai/task-breakdown`        (5.1) Aufgaben-Vorschlag aus Briefing — legt NICHTS an\n - `…/ai/task-breakdown/apply`  (5.1) übernimmt die vom Nutzer ausgewählten Vorschläge\n - `…/ai/status-summary`        (5.2) Statusbericht auf Abruf\n - `…/ai/risk-scan`             (5.4) Heuristik-Signale + KI-Einordnung; optional als Risiko anlegen\n\nLesen/Vorschlagen verlangt `projects.project.view`, jedes Anlegen `projects.project.edit`."},{"name":"ProjectAutopilot","description":"Projekt-Autopilot je Projekt (Doc 27 2.5/G15, E3) — Singleton unter dem Projekt.\n- GET liefert immer eine Antwort (Defaults, falls noch nie konfiguriert)\n- Rechte wie Projekt-Bearbeitung; Marken-Scope über die Projekt-Marke im State-Layer\n- **Nur Benachrichtigungen**: die Einstellung löst nie Status-/Termin-Änderungen aus."},{"name":"ProjectGantt","description":"Gantt-Lesesicht eines Projekts (Doc 27 Stufe 2.1/G11, ENT-PM-GANTT-01).\n\n**Warum eine eigene Ressource statt der Aufgaben-Collection:** ein Gantt braucht Balken UND\nKanten in einem Rutsch. Die Abhängigkeiten liefert `/v1/work-items` nur in der **Item**-Sicht —\nein Gantt mit 200 Aufgaben würde daraus 200 Einzelaufrufe machen. Diese Sicht holt beides mit\nzwei Abfragen und liefert genau die Felder, die die Zeitachse zeichnet.\n\n**Nur lesend.** Verschieben/Verknüpfen schreibt der Client über die bestehenden Endpunkte\n(`PATCH /v1/work-items/{ulid}` bzw. `POST|DELETE /v1/work-items/{ulid}/dependencies`) — sonst\ngäbe es einen zweiten Schreibpfad mit eigener Rechte-/Audit-Logik neben dem etablierten."},{"name":"ProjectMember","description":"Team-Mitglieder je Projekt (04-02 §4.2).\n- Rechte wie Risiken: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer."},{"name":"Project","description":"Resource 'Project' operations."},{"name":"ProjectRisk","description":"Risiken/Issues je Projekt (04-02 S2-1).\n- Rechte wie Meilensteine: lesen projects.project.view, schreiben projects.project.edit\n- Marken-Scope über die Projekt-Marke im State-Layer."},{"name":"ProjectStatus","description":"Projekt-Status als Daten (04-02 §3.1), konfigurierbar ohne Code.\n`category` bildet den Lebenszyklus open|active|done|cancelled ab."},{"name":"ProjectTemplate","description":"Projekt-Vorlagen (04-02): vordefinierte Meilensteine+Aufgaben für wiederkehrende Zuschnitte.\n- Lesen: Projekt-Leserecht (Vorlagen-Auswahl beim Anlegen)\n- Pflege: Projekt-Konfigurationsrecht (analog Status-Kataloge)\n- Anwenden: POST /v1/projects/from-template ({@see ProjectResource})."},{"name":"ProjectType","description":"Konfigurierbare Projekttypen (Lookup als Daten): liefert Abrechnungs-Defaults\n(billingMode+defaultBillable) neuer Projekte.\nSystemtypen (fixed/tm/retainer) nicht löschbar — Keys referenziert von Quote-Konvertierung/Profitabilität."},{"name":"TaskBundle","description":"Aufgaben-Bündel (Doc 27 1.1/G7): wiederverwendbarer Aufgaben-Baukasten für **bestehende** Projekte.\n- Lesen `projects.project.view` (Bündel im Projekt laden können alle, die Aufgaben pflegen)\n- Pflegen `projects.config.manage` (Verwaltung unter Einstellungen → Projekte, wie Projekt-Vorlagen)\n- Laden ins Projekt: `POST /v1/task-bundles/{ulid}/apply` mit `projects.project.edit`\n- Listen/Aufgaben werden beim Schreiben vollständig ersetzt (Positions-Indizes als Querbezug)."},{"name":"Promotion","description":"Aktionspreis-Kampagne inkl. eingebetteter Regeln (Doc 25 AP 6.2, Spec 04-45 §5).\n\n`rules` schreiben = voller Ersatz (Muster Staffel-Sets): eine Aktion wird als Ganzes gepflegt,\nnicht Regel für Regel — sonst müsste die Oberfläche Teil-Zustände verwalten, die niemand sehen\nwill. DELETE ist ein Soft-Delete; die Aktion verschwindet damit sofort aus der Preisfindung."},{"name":"Voucher","description":"Gutschein-Verwaltung (Doc 25 AP 6.3, Spec 04-45 §6).\n\n**Der Code darf leer bleiben** — dann erzeugt ihn der Server (`codeCount` legt eine ganze\nSerie an). Von Hand vergebene Codes sind in der Praxis raten- oder tippbar; ein erzeugter\nCode kommt aus einem Zeichenvorrat ohne verwechselbare Zeichen und aus einer kryptografischen\nQuelle.\n\nDie EINLÖSUNG steht nicht hier, sondern am Auftrag\n(`POST /v1/sales-orders/{ulid}/redeem-voucher`): eingelöst wird auf einem Beleg, und das Recht\ndafür ist das Auftragsrecht."},{"name":"DeliveryAvis","description":"Lieferavis (Doc 25 AP 7.3, B1 (b)): der Lieferant sagt an, was kommt und in welchen Paketen.\n\n**Der Weg, für den es gebaut ist, hat drei Schritte:** Paket scannen (`resolve`) → Vorschlag\nansehen (`proposal`) → buchen (`receive`). Gebucht wird über denselben Wareneingangs-Pfad wie\nalles andere; ein eigener Buchungsweg wäre ein zweiter Ort, an dem Bestand entsteht."},{"name":"DropshipDispatch","description":"Versandmeldungen im Streckengeschäft (Doc 25 AP 7.6).\n\n**Der Filter `sourceSalesOrderId` ist der eigentliche Zweck der Liste:** die Frage, die im Alltag\ngestellt wird, lautet nicht „was hat Lieferant X gemeldet\", sondern „wo ist das Paket meines\n * Kunden\". Ohne diesen Filter müsste jede Auftragsansicht erst alle Strecken-Bestellungen suchen."},{"name":"GoodsAcceptance","description":"Warenannahme (Doc 25 AP 4.8, B1 (a) 1): die Pakete sind da, der Inhalt ist offen.\n\nSie bucht **keinen Bestand**. Der Wert dieses Belegs ist die offene Liste: was hier steht, hat\nnoch niemand erfasst.\n\nRechte: lesen mit `purchasing.order.view`, anlegen/schließen mit `purchasing.receipt.record` —\ndie Annahme ist der erste Schritt des Wareneingangs, kein eigener Aufgabenbereich."},{"name":"GoodsOrder","description":"Waren-Bestell-Resource (04-23 §8).\n- CRUD + Workflow-Aktionen (place/cancel/receive) + PDF.\n- items eingebettet, Bepreisung via LineCalculator, EK-Vorbelegung 04-29-Resolver; Summen read-only.\n- PATCH/DELETE nur im Entwurf (409)."},{"name":"GoodsReceipt","description":"Wareneingangs-Resource (04-23 §8).\n- Liste (Filter goodsOrderId, Brand-Scope über Bestellung) + Sperrlager-Freigabe.\n- Anlage nur über POST /v1/purchasing/orders/{ulid}/receive."},{"name":"PurchaseRfq","description":"Anfrage an mehrere Lieferanten (Doc 25 AP 7.5).\n\nDer Weg ist durchgängig und hat vier Schritte: anlegen (mit Positionen und Lieferanten) →\n`send` → je Lieferant `quote` oder `decline` → `award`. Der Vergleich liegt im Detail und\nbraucht keinen eigenen Aufruf — wer eine Anfrage öffnet, will die Tabelle sehen.\n\n**Vergeben wird positionsweise**, nicht als Gesamtangebot: Position 1 beim einen, Position 2 beim\nanderen ist genau das Ergebnis, für das man mehrere Lieferanten fragt."},{"name":"PurchaseSuggestionRun","description":"Bestellvorschlags-Läufe (Doc 25 AP 7.2, B2 (a)/(b)).\n\nEin Lauf rechnet und wird abgelegt — er bestellt nicht. Der Endgate verlangt, dass eine Zeile\nREPRODUZIERBAR ist: „warum stand da 40?\" muss auch nächste Woche beantwortbar sein. Deshalb\nliegen Parameter UND jede Zwischengröße am Lauf; er ist ein Protokoll, kein Stammdatensatz."},{"name":"PurchasingList","description":"Einkaufsliste (Doc 25 AP 7.2, B2 (b)) — das Sammelobjekt zwischen Rechnung und Bestellung.\n\nDort findet die Arbeit statt, die der Einkauf wirklich tut: über mehrere Läufe sammeln, Mengen\nanfassen, Positionen streichen, erst dann losschicken. `add-from-run` trägt die\n`replace`-vs-`add`-Semantik ausdrücklich im Aufruf — still das Falsche zu tun heißt entweder\nverlorene Handarbeit oder doppelte Mengen."},{"name":"ReorderSuggestion","description":"Nachbestell-Vorschläge (04-23 §8).\n- Liste (Filter status), Verwerfen je Vorschlag, Bündel-Überführung in Entwurfs-Bestellungen (create-orders, Payload {ulids}).\n- Antwort: erzeugte Bestellungen in `orders` ({ulid, supplierRoleId} je Lieferant).\n- Markenlose Produkt-Stammdaten, kein Brand-Scope."},{"name":"PurchaseSuggestionParameterSet","description":"Gespeicherte Parameter-Sets für den Bestellvorschlag (Doc 25 AP 7.2, B2 (b)).\n\nEin Set gehört seinem Anleger. Sichtbar sind die eigenen plus die ausdrücklich geteilten —\nändern und löschen darf nur der Eigentümer, auch bei einem geteilten Set: „geteilt\" heißt\nmitbenutzen, nicht mitverwalten."},{"name":"QuoteExpiryRun","description":"`POST /v1/quotes/expiry-run` — API-Pendant zu `finance:expire-quotes` (Audit R21 PAR-5: zuvor nur CLI/Cron).\nNutzt {@see \\Octi\\Plugin\\Quote\\Service\\QuoteExpiryService::expireDue()} unter demselben\n`default-schedule`-Lock wie Scheduler/CLI (belegt → 409).\nLiteral `expiry-run` kollidiert nicht mit `{ulid}`-Routen (nur suffigiert, z. B. `…/{ulid}/send`)."},{"name":"Quote","description":"Angebots-Resource (04-06 §5). CRUD + Workflow-Aktionen (send/accept/reject/convert).\nPositionen eingebettet (`items`), Bepreisung via LineCalculator beim Speichern.\nSummen read-only; Nummer erst beim Versand vergeben."},{"name":"QuoteStatus","description":"Angebots-Status als Daten (04-06 §3), konfigurierbar ohne Code.\n`key` == Quote::STATUS_*-Konstanten; `category` = Lebenszyklus-Phase (open/active/done/cancelled)."},{"name":"QuoteSummary","description":"Angebots-Kennzahl-Aggregat für die Liste (Perf, Muster\n{@see \\Octi\\Plugin\\Contract\\ApiResource\\ContractSummaryResource}): offene Gesamtsumme (Status\ndraft|sent) über den GESAMTbestand, nicht nur die geladene Seite. Ersetzt frühere clientseitige\n`listAll`-Reduktion (stille 5000er-Truncation). Read-only, markenscope-gefiltert, Ein-Element-Collection."},{"name":"QuoteTextTemplate","description":"Wiederverwendbarer Angebots-Textbaustein (Einleitung/Footer) mit Standard-Markierung.\nLesen: jeder Angebots-Bearbeiter; Pflege: Finance-Konfiguration. Inhalt serverseitig sanitisiert."},{"name":"ReportingDashboard","description":"Dashboard/Cockpit (04-11 §4.1). CRUD + Widget-Set.\n`/data`: aufgelöste Widget-Daten, Query-Override brandId/range.\nSichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\DashboardVoter}."},{"name":"ReportingDataset","description":"Report-Datensätze/Quellbereiche (04-11 §4.2), read-only.\nBasis für dataset-Auswahl im Report-Builder (statt Freitext); MCP-/OpenAPI-sichtbar."},{"name":"ReportingKpi","description":"Kennzahl je Dimensionswert (04-11 §4.2/§4.3), read-only.\n- GET /kpis: Aufschlüsselung je Dimension, Soll-Ist-Ampel + Vergleichs-Delta\n- GET /kpis/series: Zeitreihe je Periode\n- Filter: metric (Pflicht), dimension, from/to|range, period, brandId, compare\n- Drill-down-Eltern-Schnitt: parentDimension + parentValue (VOR17-14) — nur gemeinsam wirksam\n- Sensible Finanz-/HR-Kennzahlen ohne Recht maskiert."},{"name":"ReportingTarget","description":"Soll-Wert (Ziel) je Kennzahl/Dimension (04-11 §4.2).\n- Lesen: reporting.dashboard.view · Pflege: reporting.report.manage\n- Ampel-Vergleich gegen Ist-Wert; Scheduler nutzt es für Abweichungs-Alerts."},{"name":"ReportingMetric","description":"Kennzahlen-Definitionen (04-11 §6), read-only.\nJe Kennzahl: Label, Einheit, Berechtigungs-Gate, Optimierungsrichtung. Basis für Report-Builder/Widget-Konfigurator."},{"name":"ReportDefinition","description":"Gespeicherte Auswertung (04-11 §4.2).\n- CRUD + /result (ausgeführte Tabelle, Soll-Ist/Vergleich) + /run (Export-Lauf anstoßen)\n- Sichtbarkeit/Verwaltung: {@see \\Octi\\Plugin\\Reporting\\Security\\ReportDefinitionVoter} (persönlich/rolle/geteilt, markenbewusst)."},{"name":"ReportRun","description":"Ausführungs-/Export-Lauf (04-11 §3, §4.4), read-only.\n/download: Verweis-Metadaten auf Export-Datei (DMS); Byte-Auslieferung übernimmt Datei-/DMS-Layer.\nFilter (Liste): reportDefinitionUlid, status."},{"name":"ReportSchedule","description":"Geplanter Export/Versand einer Auswertung (04-11 §4.4): Frequenz, Format, Empfänger.\nLesen/Pflege: reporting.export. Scheduler erzeugt zur Fälligkeit einen {@see \\Octi\\Plugin\\Reporting\\Entity\\ReportRun}."},{"name":"ReportTemplate","description":"Report-Vorlage der Galerie (Doc 26 6.2): read-only Blaupause aus dem\n{@see \\Octi\\Plugin\\Reporting\\Catalog\\ReportTemplateCatalog}. Materialisiert wird sie über\n`POST /v1/reporting/reports/from-template`.\n\nAusgeliefert werden nur Vorlagen, die für den aufrufenden Nutzer auch berechenbar UND sichtbar\nsind ({@see \\Octi\\Plugin\\Reporting\\Service\\ReportTemplateResolver}). Labels kommen aus der SPA\n(`reporting.reportTemplates.<key>.title` / `.summary`), nicht aus dem Backend."},{"name":"ReportingInsight","description":"KI-Auswertung des Reportings (04-11 §13 S11-2).\n- GET /insights/narrative: automatisches Narrativ zur Lage\n- GET /insights/anomalies: Anomalie-Erkennung ggü. Vormonat\n- POST /insights/query: natürlichsprachige Abfrage\n- Heuristik-first über AI-Gateway; maskiert sensible Kennzahlen gemäß Berechtigung."},{"name":"ReportingWidgetType","description":"Widget-Typen der Registry (04-11 §3, §5), read-only.\nBasis für Widget-Konfigurator (KPI-Kachel, Linien-/Balkendiagramm, Tabelle, Gauge, Funnel, Heatmap)."},{"name":"RepricingRule","description":"Preisregel für Verkaufskanäle (Doc 25 AP 9.7).\n\n- `simulate` rechnet OHNE zu speichern: eine Preisregel, die man erst im Shop sieht, ist eine\n  Regel, die man im Shop korrigiert"},{"name":"SalesGoal","description":"Vertriebsziel (Doc 19 Phase 4) — CRUD `/api/v1/sales-goals`.\n{@see $currentAmount}/{@see $progressPercent}: read-only, berechnet bei jedem Read.\nSecurity via Operations-`security`; Marken-Scope/IDOR in Provider/Processor."},{"name":"SalesGoalRoll","description":"Roll-Lauf der wiederkehrenden Vertriebsziele als API-Aktion\n(`POST /v1/sales-goals/roll-recurring` → `{rolled, asOf}`).\n\n- API-Pendant zu `octibiz:sales-goals:roll-recurring` und zum täglichen Zeitplan-Lauf; vorher gab\n  es die Fähigkeit NUR auf der Konsole (Systemaudit R38-22, P-1/P-2)\n- dieselbe Fachlogik unter demselben `default-schedule`-Lock wie Zeitplan/CLI (belegt → 409)\n- die ULID-Routen der Ziel-Resource sind GET/PATCH/DELETE — das POST-Literal `roll-recurring`\n  kollidiert deshalb nicht (Muster {@see \\Octi\\Plugin\\Billing\\ApiResource\\RecurringRunResource})."},{"name":"SalesOrder","description":"Auftrags-Resource (04-19 §8).\n- Positionen (`items`) eingebettet, Bepreisung via Kernel-LineCalculator, Summen read-only.\n- PATCH/DELETE nur im Entwurf (sonst 409) — Änderung sonst über Storno/Neuanlage.\n- ULID-Requirement nötig, damit `statuses`/`from-quote` nicht als {ulid} matchen."},{"name":"SalesOrderStatus","description":"Auftrags-Status als Daten (04-19 §3, Muster QuoteStatusResource) — konfigurierbar ohne Code.\nUnter `sales-orders` geführt (`/v1/sales-orders/statuses`, Modul-Gate ohne Descriptor-Erweiterung);\nULID-Routen matchen `statuses` nicht (Format-Requirement)."},{"name":"SalesOrderVoucher","description":"Gutschein-Einlösung am Auftrag (Doc 25 AP 6.3).\n\nDie Einlösung sitzt beim BELEG, nicht beim Gutschein: eingelöst wird immer „auf diesen\nAuftrag\", und wer den Auftrag bearbeiten darf, darf auch den Code eintragen. Der Gutschein\nselbst (Anlage, Restwert, Gültigkeit) wird in `/v1/promotions/vouchers` gepflegt und braucht\nein anderes Recht."},{"name":"SalesOrderShippingReadiness","description":"Auftragsampel (Doc 25 AP 3.1, B4a) — Versandfreigabe je Auftrag.\n\nDie Antwort nennt **jedes Kriterium einzeln mit Begründung**, nicht nur eine Gesamtfarbe. Ein\nblankes „rot\" ist im Betrieb wertlos: die Frage am Packtisch lautet nicht, ob der Auftrag\nblockiert ist, sondern warum — und wer das abstellen kann."},{"name":"SchedulingAppointment","description":"Admin-Sicht gebuchter Termine (04-33 §7/§8) — read-only + Cancel/Reschedule.\nDelegiert an {@see \\Octi\\Plugin\\Scheduling\\Service\\AppointmentManager} (keine eigene Fachlogik).\nview_any/manage: alle Termine der Marke; view_own: nur Termine mit sich selbst als Host (404 sonst).\nBuchen läuft ausschließlich über die öffentliche Buchungsstrecke."},{"name":"SchedulingSchedule","description":"Verfügbarkeits-Schedules (04-33 §3): benannte Wochenpläne pro Owner (Mitarbeiter/Ressource).\n`weekly` = Map \"mon\"..\"sun\" → Liste [start,end] als \"HH:MM\".\nRechte: Lesen `scheduling.schedule.view`, Schreiben `scheduling.schedule.manage`."},{"name":"SchedulingAvailableCalendar","description":"Wählbare Kalender einer Verbindung (Doc 18 §3) — für Ziel-/Konflikt-Kalender-Auswahl im\nVerbindungs-Editor. Nur Google/Microsoft liefern eine Liste; CalDAV/ICS geben eine leere zurück\n(genau ein Kalender). Read-only, owner-gebunden über die Eltern-Verbindung."},{"name":"SchedulingBookingPage","description":"Admin-CRUD der Buchungsseiten (04-33 §5) über die öffentlichen Landingpages mit mehreren Termintypen.\nRechte: `scheduling.booking_page.view`/`.manage`; marken-scoped/IDOR über\n{@see BookingPageProvider}/{@see BookingPageProcessor}; Slug-Konflikt → 409."},{"name":"SchedulingCalDavDiscovery","description":"CalDAV-Autodiscovery (04-33 §8, Doc 18 §3): löst aus Server-URL + Basic-Auth die Kollektions-URL\ndes Standard-Kalenders auf (RFC 6764) — Komfort vor Verbindungsanlage ({@see CalendarConnectionResource}).\nURL läuft durch den SSRF-Guard; nicht erreichbar/kein Kalender gefunden ⇒ 422. Kein Persistenz-RPC."},{"name":"SchedulingCalendarConnection","description":"Kalender-Verbindungen des angemeldeten Mitarbeiters (04-33 §8, Doc 18 §3): ICS-Feed/CalDAV.\nNicht-destruktiv: Status → revoked, Reconnect reaktiviert die Zeile.\nStrikt \"manage_own\" — fremde ULIDs liefern 404; Nutzer-URLs durch den SSRF-Guard.\nOAuth (Google/Microsoft) nicht hier, sondern über Consent-Flow in\n{@see \\Octi\\Plugin\\Scheduling\\Controller\\CalendarConnectionController}."},{"name":"SchedulingDateOverride","description":"Admin-API der Datums-Overrides (04-33 §6): tagesspezifische Abweichung eines Schedules\n(Sonderöffnungszeiten oder ganztägige Sperre bei leeren Intervallen). Gehört zu `scheduleUlid`;\nRechte/Marke über den Eltern-Schedule. Collection erwartet den `schedule`-Filter."},{"name":"SchedulingEventType","description":"Termintyp-Verwaltung (04-33 §3/§8) — Admin-CRUD der öffentlichen Buchungs-Termintypen.\nRechte: Lesen `scheduling.event_type.view`, Schreiben `.manage`. Marken-IDOR in\nProvider/Processor (SchedulingAccessResolver)."},{"name":"SchedulingResource","description":"Admin-CRUD der buchbaren Ressourcen (Räume/Geräte, 04-33 §3 · Doc 18 Stufe 3). Rechte\n`scheduling.resource.view`/`.manage`; marken-scoped/IDOR über {@see ResourceProvider}/\n{@see ResourceProcessor}. Automatisch MCP-sichtbar (OpenAPI-Export)."},{"name":"SchedulingRoutingForm","description":"Admin-CRUD der Routing-Formulare (04-33 §4): öffentliche Frageseite + Weiterleitungs-Regeln.\nRechte: `scheduling.routing_form.view`/`.manage`; marken-scoped/IDOR über\n{@see RoutingFormProvider}/{@see RoutingFormProcessor}."},{"name":"ShippingAutoShipRun","description":"`POST /v1/delivery-notes/auto-ship-run` — API-Pendant zu `shipping:auto-ship` (Befund R38-21:\nder Lauf war zuvor NUR auf der Konsole anstoßbar).\n\nNutzt denselben {@see \\Octi\\Plugin\\Shipping\\Service\\AutoShippingService} wie Kommando und\nZeitplan, unter demselben `default-schedule`-Lock (belegt → 409). Der Lauf legt Lieferscheine an\nund kauft KEINE Labels. Literal `auto-ship-run` kollidiert nicht mit der `{ulid}`-Route."},{"name":"DeliveryNote","description":"Lieferschein-Resource (04-22 §8).\n- Erzeugung: POST /v1/delivery-notes {orderUlid, items?}\n- Aktionen: pick, ship (Sendung+Packstücke, Carrier-Label via Kernel-SPI, Bestandsabbuchung, Event), delivered\n- PDF ohne Preise\n- ULID-Routen: Format-Requirement wie SalesOrder."},{"name":"ReturnOrder","description":"Retouren-Resource (04-22 §8, RMA).\n- Anlage: POST /v1/return-orders {orderUlid, reason, items}\n- Aktionen: approve, receive (restock zubuchen + Gutschrift-Signal), refund, reject\n- ULID-Routen: Format-Requirement wie SalesOrder."},{"name":"ShippingReturnQuota","description":"Retourenquote je Grund (Doc 25 AP 3.7, B7).\n\nDie wichtigste Zahl ist `ourFaultQty`: eine Quote von 30 % ist harmlos, wenn Kunden Größen\nbestellen und aussuchen — und ein Alarm, wenn wir falsch liefern. Ohne diese Trennung sagt die\nQuote nichts darüber, ob etwas zu tun ist."},{"name":"ReturnReason","description":"Retourengrund-Katalog (Doc 25 AP 3.7, B7).\n\n**Warum diese Resource überhaupt existiert:** der Katalog wurde mit AP 3.7 angelegt und vom\nQuoten-Report gelesen — erreichbar war er von außen nie. Wer eine Retoure anlegt, konnte die\nGründe weder abfragen noch setzen; der Report meldete deshalb strukturell „ohne Grund\"\n(Befund `SESS-RETREASON-01`). Lesen darf, wer Retouren bearbeitet; ändern nur die\nVersand-Konfiguration — ein Grund ist Stammdatum, kein Vorgangsdatum."},{"name":"Shipment","description":"Sendungs-Resource (04-22 §8) — Lese-Sicht auf physische Sendungen.\n- Entstehen über ship-Aktion des Lieferscheins; Fortschritt via delivered-Aktion / Tracking-Sync\n- Einzige Schreib-Aktion: retry-label (Label-Nachkauf nach fehlgeschlagenem Carrier-Call, Audit R18 #17)\n- Marken-Scope über den Lieferschein."},{"name":"ShippingCenterStats","description":"Versandzentrum-Kennzahlen (04-35 §3/§4): aggregierte Arbeitsvorräte des Versand-Dashboards.\n- Read-only, markenscope-gefiltert (Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource}), Ein-Element-Collection\n- ordersReadyToShip/readyOrders fail-closed 0/leer wenn module.sales inaktiv (ENT-ERP-OPTDEP-01)."},{"name":"ShippingCostRule","description":"Versandkosten-Regel-Resource (04-22 §6/§8, Entscheidung S5).\n- CRUD regelbasierter Versandkosten (Gewicht/Wert/fix je Zone/Carrier/Marke, Free-Shipping-Schwelle)\n- Versand-Konfiguration ⇒ durchgängig shipping.config.manage."},{"name":"ShippingTrackingSyncRun","description":"`POST /v1/shipments/tracking-sync-run` — API-Pendant zu `shipping:tracking-sync` (Befund R38-20:\nder Abgleich war zuvor NUR auf der Konsole anstoßbar, damit für Oberfläche, MCP und Automation\nnicht vorhanden).\n\nNutzt denselben {@see \\Octi\\Plugin\\Shipping\\Service\\TrackingSyncService} wie Kommando und\nZeitplan, unter demselben `default-schedule`-Lock (belegt → 409). Literal `tracking-sync-run`\nkollidiert nicht mit der `{ulid}`-Route (ULID-Format-Requirement, Muster QuoteExpiryRun)."},{"name":"SiteCollectionCsv","description":"CSV-Austausch einer Collection (Doc 37 §7.3, Stufe 6).\n\nBewusst als API-Ressource mit JSON-Nutzlast und NICHT als Datei-Endpunkt: so ist der Weg\n„Bestand herausziehen, aendern, zurueckspielen\" auch fuer MCP und Automation erreichbar\n(P-1/P-2) — die Oberflaeche macht daraus einen Download bzw. nimmt eine Datei entgegen."},{"name":"SiteCollectionItem","description":"Collection-Eintrag (ENT-BUILDER-13): fields = {key: wert} gegen das Schema; uebersetzbare\nWerte in {i18n:{de,en}}-Form (werden NIE flachgeklopft). EIN Slug fuer alle Sprachen —\ndas Sprachpraefix macht die URL. /publish schaltet die Auslieferung frei (404 sonst)."},{"name":"SiteCollection","description":"Collection-Schema (ENT-BUILDER-13, Doc 35 §13a): Felderliste mit Typ/Pflicht/uebersetzbar/\nReferenz-Ziel; Slug = URL-Segment der Eintrags-Seiten. Item-Rechte oeffnen die Lese-Sicht\n(Eintrags-Editor braucht das Schema), Schreiben nur mit site.collection.manage."},{"name":"SiteConsentEvent","description":"Cookie-Einwilligungs-Nachweise (W-e, nur lesend): Abgabe erfolgt ueber den\noeffentlichen Endpunkt POST /api/v1/site/public/consent."},{"name":"SiteMenuItem","description":"Menue-Eintrag (verschachtelbar): Ziel Seite (pageUlid) oder freie URL;\n`label` mehrsprachig als {locale: Text}."},{"name":"SiteMenu","description":"Navigationsmenue einer Site (W-a): mehrere je Site, `key` als stabiler Einbau-Anker."},{"name":"SitePageLocalization","description":"Sprach-Auspraegung eines Strukturknotens (B22/ENT-BUILDER-12): POST stellt die GETEILTE\nBuilderPage des Knotens sicher (EIN Baum, Feld-Uebersetzung im Element, Release je\nSprache) — Inhalt wird im Builder bearbeitet und EINMAL veroeffentlicht.\nSlug-Aenderung schreibt die URL mit 301 fort (W-c)."},{"name":"SitePage","description":"Strukturknoten des Seitenbaums (B22): sprachneutral, traegt Baum/Sortierung/Art.\nTitel/Slug/Inhalt je Sprache: SitePageLocalization. Umhaengen via PATCH (parent/position)\noder POST /move; beides schreibt die URLs des Teilbaums mit 301 fort (W-c)."},{"name":"SitePostCategory","description":"Blog-Kategorie (B11/W-b)."},{"name":"SitePost","description":"Blog-Beitrag (B11/W-b): Inhalt ist eine automatisch angelegte Builder-Flaeche.\nPOST /{ulid}/publish veroeffentlicht (Status, publishedAt, URL-Zeile /{locale?}/blog/{slug},\nLesezeit aus dem Inhalt)."},{"name":"Site","description":"Site der Marke (Doc 35 Stufe 4, W-a). Seiten-Referenzen (Startseite, Fehler-, Wartungs-,\nPflichtseiten) laufen als Seiten-ULIDs; `legalStatus` (W-e) zeigt, ob die Pflichtseiten\ngesetzt UND veroeffentlicht sind."},{"name":"SiteUrl","description":"URL-Tabelle der Site (B10/W-c): aktive Pfade + 301-Historie einsehbar; manuelle\nRedirect-Zeilen anlegbar; nur redirect-Zeilen loeschbar (aktive Zeilen pflegt das System)."},{"name":"SlackInstallation","description":"Installations-ZUSTAND der Slack-App (Doc 27 6.1).\n\nDas MCP-sichtbare Admin-Pendant zur browser-gebundenen OAuth-Strecke\n({@see \\Octi\\Plugin\\Slack\\Controller\\SlackOAuthController}): „ist installiert, mit welchem\nWorkspace, ist der Eingang scharf\". Bewusst nur LESEND — installiert wird über die\nZustimmungs-Strecke, nicht per API-Aufruf.\n\nEnthaelt niemals Token oder Secrets, nur deren VORHANDENSEIN. Ein Statusfeld, das ein Geheimnis\nmitliefert, waere ein Leck mit Ansage.\n\nRechte-Schnitt (R36-31): bewusst SUBJEKTLOS geprueft. Es gibt genau einen Zustand je System, er\ntraegt weder Marke noch Eigentuemer — {@see \\Octi\\Plugin\\Slack\\Security\\OctiSlackVoter}\nkennt dieses Subjekt deshalb nicht, und der Katalog-Check ist hier der ganze Schnitt."},{"name":"SlackProjectLink","description":"Verwaltung der Projekt-↔-Channel-Verknüpfungen (Doc 27 6.1).\n\nDas **Admin-Pendant** zum MCP-unsichtbaren Webhook-Empfänger\n({@see \\Octi\\Plugin\\Slack\\Controller\\SlackInboundController}) — die Konfiguration ist damit\nregulär über API/MCP steuerbar, der anonyme Empfänger bewusst nicht.\n\nBeide Richtungen sind 1:1 (siehe {@see \\Octi\\Plugin\\Slack\\Entity\\SlackProjectLink}); Verstöße\nbeantwortet der Processor mit 422 statt mit einem Datenbank-Fehler.\n\nRechte-Schnitt (R36-31):\n- Item-Operationen prüfen MIT `object` — nur so wird {@see \\Octi\\Plugin\\Slack\\Security\\OctiSlackVoter}\n  überhaupt befragt (der Core-`PermissionVoter` enthält sich bei vorhandenem Subjekt, der\n  Objekt-Voter bei fehlendem — subjektlos befragt also KEINER die Objekt-Regel).\n- Collection und `Post` bleiben subjektlos: dort existiert zum Prüfzeitpunkt kein Objekt.\n- Wächter: `SlackItemVoterErreichbarkeitTest`."},{"name":"SmsCampaign","description":"Bulk-SMS-Kampagne (Programm 46 F-L, ENT-MKT-09).\n\nDER VERSAND IST EINE EIGENE OPERATION MIT EIGENEM RECHT. Er kostet Geld je Empfaenger und\nlaesst sich nicht zurueckholen — wer Entwuerfe pflegen darf, soll damit nicht tausend\nNachrichten ausloesen koennen. Dasselbe Muster wie beim Mail-Versand."},{"name":"SocialChannelStatus","description":"Verbindungsstatus je Social-Kanal (ENT-MKT-SOCIAL-01, 04-13 §4.3), read-only Aggregat für die SPA.\nPro {@see \\Octi\\Plugin\\Social\\Contract\\SocialPostPayload}-Kanal: `connected` (real angebunden?) + `mode`\n— `native` (Adapter, Credentials via Platform/Integration), `webhook` (generisch) oder `none`."},{"name":"SocialConnection","description":"Verbindungs-ZUSTAND der Social-Kanaele (Programm 46 C2, ENT-MKT-05).\n\nDas Admin-Pendant zum browser-gebundenen Verbindungs-Einstieg: hier steht, was verbunden ist,\nwann es ablaeuft und welche Konten zur Wahl stehen. Diese Flaeche ist Schnittstelle und damit\nauch fuer Automatisierung und KI erreichbar — der Weiterleitungs-Einstieg selbst kann das\nnaturgemaess nicht sein.\n\nMARKENSCHARF, und das ist kein Detail: der Beitrags-Weg schreibt markenscharf. Eine global\ngelesene Statusleiste behauptete „verbunden\" fuer eine Marke, die gar kein Konto hat — und der\nFehler faellt erst auf, wenn ein geplanter Beitrag nicht erscheint."},{"name":"SupplierFrameworkAgreement","description":"Rahmenvereinbarungen eines Lieferanten (04-29 §8): Laufzeit, Konditionstext, bonusRule\n(Umsatzstufe→%); /v1/suppliers/{ulid}/agreements."},{"name":"SupplierArticle","description":"Lieferantenartikel (EK je Lieferant × Artikel, 04-29 §8), Sub-Resource unter\n`/v1/suppliers/{ulid}/articles`.\n- POST: Upsert je (Lieferant, productId) via SupplierArticleService; Preisänderung\n  schreibt EK-Historie fort; `scales` synct Staffelsatz vollständig; isPreferred=true\n  löst bisherigen Vorzugslieferanten ab.\n- EK-Historie: `…/articles/{articleUlid}/history` (eigene Resource).\n- Leeren-Semantik (POST/PATCH): weggelassene Felder unverändert; explizites null leert\n  (einziger Leeren-Kanal für ?int-Felder); '' leert String-/Dezimal-/Datumsfelder."},{"name":"SupplierCertificate","description":"Zertifikate eines Lieferanten (04-29 §8): Typ, optionaler Datei-Nachweis (fileId),\nAblaufdatum (Basis Ablaufwarnung); /v1/suppliers/{ulid}/certificates."},{"name":"SupplierPriceHistory","description":"EK-Historie eines Lieferantenartikels (04-29 §8, read-only, append-only).\nGET .../history: absteigend nach validFrom; Schreiben nur via SupplierArticleService."},{"name":"SupplierRating","description":"Lieferantenbewertung (04-29 §8): Scores 0–100 je Periode (YYYY-MM);\n/v1/suppliers/{ulid}/ratings. POST=Upsert je (Lieferant, Periode) via\nSupplierRatingService; overall=gerundetes Mittel (read-only)."},{"name":"Supplier","description":"Lieferanten-Rolle am geteilten Geschäftspartner (04-29 §8), CRUD unter `suppliers`.\n- POST löst businessPartnerUlid zum Kunden-Stamm auf (Partner-Master, ENT-ERP-PARTNER-01);\n  Rolle bereits vorhanden → 409.\n- DELETE: soft, nur ohne gelistete Lieferantenartikel (sonst 409).\n- Markenübergreifende Stammdaten, kein Brand-Scope (04-29 §6).\n- ULID-Routen mit Format-Requirement (Literal-Segmente ≠ {ulid}, Muster SalesOrder).\n- PATCH = Merge-Patch (Provider-Prefill, OBJECT_TO_POPULATE): weggelassene Keys bleiben;\n  explizites null leert paymentTerms/cashDiscountTerms/incoterms/blockReason/notes;\n  genulltes currency fällt auf EUR zurück (Spalte NOT NULL)."},{"name":"BusinessHours","description":"Geschäftszeiten/Feiertagskalender als Daten (04-04 §3/§6/AK11) für die SLA-Fristenrechnung."},{"name":"CannedResponse","description":"Textbaustein/Makro (04-04 §4.2, S4-1) — Platzhalter {{customer}}, {{ticketNumber}}, {{agent}}\nbeim Einfügen ersetzt."},{"name":"CsatRating","description":"CSAT-Bewertung (04-04 §4 S4-1/T7) — Liste/Detail für Reporting + Abgabe via Einmal-Token.\nAbgabe bewusst öffentlich (`security: \"true\"`, PUBLIC_ACCESS `/v1/tickets/public/`) — Mail-Link\nohne Login, Autorisierung via Einmal-Token (unguessbar, 32 Hex). Unbekannte/verbrauchte Token:\nabgelehnt in {@see \\Octi\\Plugin\\Tickets\\Service\\CsatService::submit()}."},{"name":"InboundForm","description":"Öffentliches Kontakt-/Support-Webformular (AP-6.3) — erster Eingangskanal neben Mail.\nBewusst öffentlich (`security: 'true'`, PUBLIC_ACCESS `/v1/tickets/public/`); Bot-Schutz via\nHoneypot-Feld ({@see $website}). Läuft durch dieselbe Pipeline wie Mail\n({@see \\Octi\\Plugin\\Tickets\\Service\\MessageIngestionService}): Identitäts-Matching → Routing/Triage\n→ Vorgang/Eingangskorb. Formularfelder Betreff/Kategorie = Erstklassifikation."},{"name":"MailBlock","description":"Mail-Blacklist-Eintrag (04-04 §4 S4-2): blockt Absender/Domains global oder je Marke."},{"name":"MailLayoutPreview","description":"Live-Vorschau eines (auch ungespeicherten) Mail-Layouts — POST mit Layout-Feldern + optionalem\nBeispieltext liefert gerendertes HTML mit Demo-Platzhaltern. Nutzt denselben Renderer wie der\nreale Versand (Vorschau = 1:1 spätere Mail)."},{"name":"MailLayout","description":"Mail-Layout (Kopf-/Fußzeile, Marken-CI) für ausgehende Kommunikations-/Ticket-Mails — settings-\npflegbar, wird beim Versand um den Nachrichtentext gelegt (Fallback: roh ohne Layout).\n`brandId = null` = markenübergreifendes Standard-Layout."},{"name":"TicketMailPollRun","description":"Support-Mail-Abruf als API-Aktion (`POST /v1/tickets/mail-poll-run` → {dispatched}) — API-Pendant\nzu `support:mail-poll` (P-1/P-3, Audit R21 PAR-5: Abruf zuvor nur per CLI/Cron auslösbar;\nVorbild `POST /v1/tickets/triage-calibrate`). Nutzt dieselbe inkrementell-idempotente Service-Logik\nüber ALLE Kanäle ({@see \\Octi\\Plugin\\Tickets\\Service\\MailPollCoordinator::pollAll()}), synchron;\nMail-Verarbeitung selbst läuft wie beim Cron async über Messenger. Literal `mail-poll-run`\nkollidiert mit keiner `{ulid}`-Route (Muster TriageCalibrationResource)."},{"name":"MailRule","description":"Mail-Filterregel (04-04 §6, S4-2) — geordnete Regeln werten Support-Mails vor Ticket-Erzeugung\naus: verwerfen oder Auto-Triage (Kategorie/Priorität/Status/Marke/Tags/Zuweisung). Settings-\npflegbar, Reihenfolge via `sortOrder`."},{"name":"RuleSuggestion","description":"Regel-Vorschläge aus dem Triage-Korrektur-Log (AP-7.2, assistiertes Lernen). Read-only;\njeder Vorschlag trägt eine fertige Regel im {@see \\Octi\\Plugin\\Tickets\\Entity\\MailRule}-Format\n(`rule.conditions`/`rule.actions`) → 1-Klick-Übernahme über `POST /v1/ticket-mail-rules`."},{"name":"SavedView","description":"Gespeicherte Ansicht / Queue (04-04 §4.7/§5): persönlich oder geteilt; Filter/Sortierung/\nSpalten als Sicht auf die Ticket-Work-Items."},{"name":"Sla","description":"SLA-Definition als Daten (04-04 §3/§4.3/AK11). Quelle-Priorität: contractId > priorityLevel\n> isDefault."},{"name":"SupportMailbox","description":"Support-Postfach je Marke (04-04 T2, S4-3) — Postfach-Zuordnung inkl. generischer IMAP/SMTP-\nVerbindungsdaten. Passwort write-only (verschlüsselt, nie ausgelesen). Typ `gmail`: OAuth-\nCredentials weiterhin separat über `support:mailbox:connect` (nicht über die API).\n\n`active` ist der Handschalter, `connectionState` der GEMESSENE Zustand des letzten Abrufs/Tests\n(SESS-MAILBOX-02) — beides getrennt lesbar, damit ein abgelehntes Postfach nicht länger wie ein\ngesundes aussieht. `test-connection` prüft denselben Verbindungsweg, den der Abruf nimmt."},{"name":"TicketCategory","description":"Ticket-Kategorie/Queue als Daten (04-04 §3/AK11). `defaultAssigneeId` ermöglicht die\nStammbearbeiter-Auto-Zuweisung (T6), `parentId` die Hierarchie."},{"name":"TicketPriority","description":"Ticket-Priorität als Daten (04-04 §3/AK11). `level` 1–4; `defaultSlaId` liefert die\nPrioritäts-Default-SLA."},{"name":"TicketReport","description":"Support-Kennzahlen für das SLA-/Support-Dashboard (04-04 §5). Aggregat-Read; filterbar über\n?brandId."},{"name":"Ticket","description":"Ticket-Resource (04-04 §4/§5, API-First) — Ticket = WorkItem(kind=ticket). Neben CRUD:\nSupport-Workflows als diskrete POSTs (antworten/Notiz, zuweisen, Status/Reopen, Merge/Split,\nKI-Triage, KI-Assistenz). Listen serverseitig gefiltert (Queue-Sichten); interne Felder\nPortal-getrennt."},{"name":"TicketStatus","description":"Ticket-Status als Daten (04-04 §3/AK11): konfigurierbar ohne Code. `stopsSlaClock` pausiert\ndie SLA-Uhr, `isResolved` erfüllt die Lösungsfrist."},{"name":"TicketTeam","description":"Support-Team (benannte Bearbeitergruppe) als Ziel für Ticket-Zuweisung und Mail-Routing.\n- Lesen: jeder mit Ticket-Sicht (Auswahl-Picker in Zuweisung/Mail-Regeln)\n- Verwalten: `tickets.team.manage`\n- `id` (numerisch, read-only) ist der Picker-Wert; `memberIds` = Member-Ids (Assignee-Raum)."},{"name":"TicketTriageCalibration","description":"KI-Triage-Kalibrierung als API-Aktion (`POST /v1/tickets/triage-calibrate` → Messwerte +\nalte/neue Schwelle) — API-Pendant zu `support:calibrate-triage` (P-1/P-3, Sauberkeits-Runde\n2026-07-16: Auto-Apply-Schwelle zuvor nur per CLI justierbar). Nutzt dieselbe Service-Logik\n({@see \\Octi\\Plugin\\Tickets\\Service\\TriageCalibrationService::recalibrate()}); ULID-Routen der\nTicket-Resource matchen `triage-calibrate` nicht (Format-Requirement)."},{"name":"ExternalTimeEntry","description":"Zeiterfassung EXTERNER Mitwirkender (Doc 27 Stufe 7, E-5 · ENT-PM-PAR-13).\n\nWarum eine EIGENE Ressource statt Serialisierungsgruppen an {@see TimeEntryResource}: Sätze und\nKosten (`rateAmount`, `costRateAmount`) hängen an derselben Entität wie die Zeitdaten. „Externe\nerfassen Zeit ohne Sätze\" ist damit keine Rechte-, sondern eine Serialisierungsfrage — und eine\n * Gruppen-Konfiguration an einer geteilten Ressource vergisst man beim nächsten Feld. Hier gibt es\n * die Felder schlicht nicht; sie können nicht vergessen werden.\n *\n * Die Route liegt unter dem plugin-eigenen Segment `time` (`/v1/time/external-entries`) und nicht\n * unter einem generischen `/v1/external`: Segmente sind Eigentum, und „external\" gehoert keinem\nModul allein — es waere ein Name, den das naechste Modul genauso beanspruchen wuerde. Damit greift\nzugleich das fail-closed Modul-Gating von OctiTime.\n\nDer Schnitt ist doppelt: nur EIGENE Einträge (Employee = angemeldeter Nutzer) und nur auf\nVorgängen, die der Externen-Schnitt ohnehin freigibt\n({@see \\App\\WorkItem\\Contract\\ExternalWorkItemScopeInterface}). Für Mitarbeiter ist die Ressource\nerreichbar, aber uninteressant — sie sehen dasselbe reicher unter `/v1/time-entries`."},{"name":"TimeCalendarSuggestion","description":"Kalender-Termine als Zeiterfassungs-Vorschläge (Doc 27 3.1/G17, awork „Termin übernehmen\") —\nread-only. Liefert die Termine der EIGENEN Kalender-Verknüpfungen für einen Tag; die Übernahme\nlegt daraus mit einem Klick einen Zeiteintrag an (Dauer + Titel vorbelegt, Work-Item-Zuordnung\nnachgelagert wie beim geparkten Timer).\n\nBewusst nur die eigenen Termine: Kalenderinhalte sind persönlich — es gibt keinen Fremd-Zugriff\nüber diese Fläche (kein `employeeId`-Filter)."},{"name":"TimeCategory","description":"Resource 'TimeCategory' operations."},{"name":"TimeDayOverview","description":"Tagesübersicht „My Day\" des angemeldeten Mitarbeiters (Doc 27 3.1/G17).\n\nLiefert Soll/Ist des Tages (Fortschrittsring) plus den Tages-Zeitstrahl: erfasste Zeiten und die\neigenen Kalender-Termine als Segmente in Minuten ab Mitternacht. Immer NUR die eigenen Daten —\nder Mitarbeiter kommt aus der Session, nie aus der Anfrage."},{"name":"TimeEntry","description":"TimeEntry (04-03 §5/§8).\n- Dauer: durationMinutes ODER durationHours (S3-2); intern immer Minuten.\n- rateAmount/costRateAmount: read-only Snapshots."},{"name":"TimeReportDefinition","description":"Gespeicherter Zeitreport (Doc 27 3.3/G19): wiederverwendbare Report-Definition mit relativem oder\nabsolutem Zeitfenster, Datenfiltern, Gruppierung, Rundung und Spaltenwahl; privat oder geteilt.\n\nAusführung über die `run`-Aktion — sie löst das relative Fenster gegen „heute\" auf und liefert die\ngerundeten Report-Zeilen (Rundung wirkt nur auf die Ausgabe, nie auf die erfassten Roh-Zeiten)."},{"name":"TimeReport","description":"TimeReport (04-03 §4.4): erfasst/abrechenbar/fakturiert + Quote.\n- Filter: from/to/brandId/customerId/projectId/employeeId.\n- groupBy: project|customer|employee|brand|none."},{"name":"TimeRoundingRule","description":"TimeRoundingRule (04-03 §6.2, Z1).\n- Bindung: projectId ODER contractId (Modul 05) ODER global (beide null).\n- Auflösung Projekt → Vertrag → Default: {@see \\Octi\\Plugin\\Time\\Service\\RoundingRuleResolver}."},{"name":"TimeWorkItemOption","description":"Schlanke Work-Item-Auswahl für die Zeit-Schnellbuchung (Picker, inkl. numerischer id).\nSuche über q (Titel/Referenz); Recht = Zeit-Buchungsrecht."},{"name":"Timer","description":"Timer (04-03 §4.1/§5, S3-4/S3-5/S3-6).\n- Mehrere parallele, server-persistente Timer je Mitarbeiter; action: pause/resume/stop.\n- Stop erzeugt TimeEntry, ulid in createdEntryUlid."},{"name":"Timesheet","description":"Timesheet-Genehmigung (04-03 §4.3/§5, Z2/Z3).\n- POST: Wochen-Einreichung (weekDate → Kalenderwoche).\n- PATCH action: approve/reject/reopen (PM-Genehmigungs-Inbox)."},{"name":"ClarificationCase","description":"Klärfälle aus dem Lager (Doc 25 AP 4.2 / B3).\n\nLesen und Auflösen — angelegt werden sie nicht von Hand, sondern aus dem Scan-Flow\n(`/v1/wms/pick-lists/{ulid}/shortage`). Ein Klärfall ohne Fehlmenge dahinter wäre eine Notiz,\nund dafür gibt es Notizen."},{"name":"PackSession","description":"Der Packtisch (Doc 25 AP 4.3 / B4 (b)).\n\nFünf Operationen, weil der Packtisch fünf Handgriffe hat: identifizieren, scannen, Packstück\nzumachen, abschließen, abbrechen. Alles andere ist Anzeige.\n\n`identify` nimmt einen ROHEN Scan — Auftragsnummer oder Picklisten-Nummer. Am Packtisch tippt\nniemand eine ULID ab; der Scanner liefert, was auf dem Zettel steht."},{"name":"PickAlternativeBin","description":"Ersatzplätze zu einem Greifvorgang (Doc 25 AP 4.2).\n\n- eigene Operation statt Feld am Picklisten-Detail: sonst je Position eine Platz-Abfrage bei\n  jedem Listen-Aufruf, für eine Auskunft, die nur bei „Platz leer\" gebraucht wird"},{"name":"PickList","description":"Picklisten (Doc 25 AP 4.1/4.2 / B3).\n\nAnlage auf zwei Wegen: aus einer Vorlage (`templateUlid`) oder über eine ausdrückliche\nAuftragsliste (`orderUlids`). Der Rest sind Aktionen — greifen, Fehlmenge melden, Auftrag\nentfernen, abbrechen. Es gibt bewusst kein PATCH auf der Liste: eine Pickliste ist ein\nArbeitsvorrat, kein Formular."},{"name":"PickListTemplate","description":"Pickvorlagen (Doc 25 AP 4.1 / B3 (c)) — das Regelwerk, aus dem Picklisten entstehen.\n\n`preview` beantwortet die Frage, die man vor dem Speichern hat: „welche Aufträge greift diese\nVorlage GERADE?\" Ohne sie müsste man eine Liste anlegen, um es zu erfahren — und die reserviert\ndann Aufträge, die man nur sehen wollte."},{"name":"ReplenishmentTask","description":"Nachschub-Aufträge Reserve → Pickplatz (Doc 25 AP 4.7, B3).\n\nAngelegt werden sie nicht von Hand, sondern aus den Nachschubregeln (`generate`) — ein Auftrag\nohne unterschrittenes Minimum wäre ein Weg ohne Grund. Bestätigt wird per Scan; die Aktion ist\nüber `X-Idempotency-Key` benennbar, damit die Scanner-Warteschlange nach einem WLAN-Aussetzer\nwiederholen darf, ohne doppelt umzulagern."},{"name":"WorkforceAttendanceDay","description":"Tagesarbeitszeit (04-32 §8) — Liste/Detail Anwesenheitstage; Aktionen approve/correct.\nKennzahlen read-only, aggregiert aus Stempelungen."},{"name":"WorkforceAttendanceEvent","description":"Stempelung (04-32 §8): Live-Stempeln, idempotenter Offline-Sync, Liste der Stempelungen.\nAnwesenheitszeit — bewusst getrennt von Projektzeit (src/Time)."},{"name":"WorkforceClockState","description":"Stempel-Zustand des angemeldeten Mitarbeiters (04-32 §8) fürs Widget + heutige Tages-Aggregation.\nEin-Element-Collection (Muster {@see \\Octi\\Plugin\\Licensing\\ApiResource\\LicenseSummaryResource})."},{"name":"WorkforcePayrollExport","description":"Monatlicher Lohn-Export (04-32 Stufe E, Recht `workforce.export.payroll`).\n\n - `GET /v1/workforce/payroll-export` — Lohnart-Zeilen als JSON (gleiche Daten wie Datei-Download, P-1/P-2).\n - `GET /v1/workforce/payroll-export/file` — Download DATEV-LODAS (Default) oder CSV.\n\nQuelle: freigegebene Anwesenheitstage + Konto-Deltas + genehmigte bezahlte Abwesenheiten\n({@see \\Octi\\Plugin\\Workforce\\Service\\PayrollExportService}). Ungesperrter Monat → Warnung,\nkein Blocker. Marken-IDOR: fremde `brandId` → 404."},{"name":"WorkforcePeriodLock","description":"Zeitraum-Sperre Lohnabrechnung (04-32 Stufe E, „Monatsabschluss\"): Marke × Zeitraum friert\nAnwesenheits-/Konto-/Schicht-Schreibpfade ein (422).\n\n - Anlegen: `workforce.period_lock.manage`, per Monat oder freiem Zeitraum.\n - Aufheben: separates Recht `workforce.period_lock.release` (Soft-Delete, Audit).\n - Marken-IDOR: fremde Marke → 404; `brandId = null` nur für markenübergreifende Rechteinhaber."},{"name":"WorkforceShift","description":"Schichtplan (04-32 Stufe D): Wochen-Abfrage, CRUD (`workforce.shift.manage`), Publish\n(`workforce.shift.publish`) mit Mitarbeiter-Benachrichtigung.\n\n - Mitarbeiter sehen nur VERÖFFENTLICHTE Schichten.\n - Konflikt-Checks: harte Konflikte → 422, Warnungen im Feld `warnings`.\n - Marken-IDOR: fremde Marke → 404."},{"name":"WorkforceShiftTemplate","description":"Schichtvorlagen (04-32 Stufe D): benannte Zeitfenster (Wandzeit, ggf. über Mitternacht) + Farbe,\nStandard-Pause, optionaler Arbeitsbereich.\n\n - Lesen: alle Schichtplan-Sichten; Pflege: `workforce.shift.manage`.\n - Marken-IDOR: fremde Marke → 404."},{"name":"WorkforceWorkTimeAccount","description":"Arbeitszeitkonto (04-32 §B): Saldo + jüngste Ledger-Buchungen (eigener Mitarbeiter oder\n`?employeeId` mit `view_any`) + manuelle Korrektur (`.../adjust`).\nEin-Element-Collection (Muster ClockState/LicenseSummary)."}],"webhooks":{}}