Save Action Definition
onto_actiondef_saveActiondef anlegen/aendern (Button am Objekt). PFLICHT: body.scopes mit den Scope-IDs, an denen der Button erscheinen soll — du musst dort Manager (can_manage_scope) oder Schreiber (can_write) sein, sonst 403. PUBLIC (15) nur fuer Admins. Beispiel fuer 'Formular am Standort ausfuellen': body = {"object_types":["building"],"scopes":[7],"roles":["member"],"action":{"type":"form_answer","name":"Visite","form":""}}. action.type 'form_answer' oeffnet das Formular und verknuepft die Antwort mit dem Objekt. Actions sind SCOPE-Daten, nicht global. Sehen darf sie, wer einen der Scopes in body.scopes[] lesen darf; AUSFUEHREN nur, wenn das Scope des Objekts in body.scopes[] steht (oder die Def public:true traegt). Ein Mitglied mit can_manage_scope auf SEINEM Scope darf dort eigene Actions anlegen (Kopie der Plattform-Action mit body.scopes=[eigener Scope]) und so die Standard-Actions im eigenen Scope nutzbar machen. Beim Anlegen genau EIN Ziel-Scope. public:true und der PUBLIC-Scope 15 sind Administratoren vorbehalten, SQL-Bedingungen ebenfalls. Ein Scope-Manager kann Actions in seinem Scope per hidden_actions abschalten. | EN: action, button, definition, gate, condition, rule action.result_scope_id (Ergebnis-Scope): bei 'create'/'form_answer' bestimmt er, WO das neue Objekt entsteht. Bei 'update' ist er die BRUECKE: die Aktion darf ein BESTEHENDES Objekt in diesem Scope fortschreiben, auch wenn der Ausfuehrende dort NUR Leserecht hat — schreibbar sind genau die Eigenschaften aus action.props, nur am Zielobjekt der Aktion; danach ist die Bruecke zu (andere Felder 403). Pflicht: Personenbindung ({current_user_email}, {current_profile_id}, {current_user_id}, {user_email} oder {user_person}); bei 'update' zusaetzlich action.props, sonst 400. Merksatz: ein Mitarbeiter braucht KEIN Schreibrecht im Planungs-Scope — Aktion im Planungs-Scope definieren, result_scope_id setzen, Eigenschaften in action.props auflisten. Beispiel Einstempeln: object_types [shift], scopes [80,81], guards [{type: linked_to_user, linktype: worksShift, message: 'Nur die eigene Schicht'}], action {type: update, result_scope_id: 80, props: {actualStart: '{now}', stempelStatus: 'eingestempelt', istGeaendertVon: '{user_email}'}}. guards pruefen VOR dem Ausfuehren und rein lesend: 'linked_to_user' verlangt, dass das Zielobjekt ueber diesen Linktyp mit der handelnden Person verknuepft ist (Richtung egal), sonst 403 mit der eigenen message. Fuer 'nur die eigene Schicht' NIEMALS links.require 'present' nehmen — require ist eine Pruefung, kein Auftrag.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Technischer Schluessel (a-zA-Z0-9_), z.B. pflege_visite | |
| body | Yes | Actiondef-JSON als STRING, z.B. {"object_types":["building"],"scopes":[7],"action":{"type":"form_answer","form":"<udid>"}} | |
| label | Yes | Anzeigetext des Buttons | |
| description | No | Beschreibung (optional) |