146 lines
7.9 KiB
Python
146 lines
7.9 KiB
Python
# Copyright (c) 2025 Patrick Motsch
|
|
# Trustee node definitions - map to methodTrustee actions.
|
|
|
|
from modules.shared.i18nRegistry import t
|
|
|
|
# Typed FeatureInstance binding (replaces legacy `string, hidden`).
|
|
# - type uses the discriminator notation `FeatureInstanceRef[<code>]` so the
|
|
# DataPicker / RequiredAttributePicker can filter compatible upstream paths.
|
|
# - frontendType "featureInstance" is rendered by FeatureInstancePicker which
|
|
# loads /options/feature.instance?featureCode=trustee for the current mandate.
|
|
_TRUSTEE_INSTANCE_PARAM = {
|
|
"name": "featureInstanceId",
|
|
"type": "FeatureInstanceRef[trustee]",
|
|
"required": True,
|
|
"frontendType": "featureInstance",
|
|
"frontendOptions": {"featureCode": "trustee"},
|
|
"description": t("Trustee-Mandant"),
|
|
}
|
|
|
|
TRUSTEE_NODES = [
|
|
{
|
|
"id": "trustee.refreshAccountingData",
|
|
"category": "trustee",
|
|
"label": t("Buchhaltungsdaten aktualisieren"),
|
|
"description": t("Buchhaltungsdaten aus externem System importieren/aktualisieren."),
|
|
"parameters": [
|
|
dict(_TRUSTEE_INSTANCE_PARAM),
|
|
{"name": "forceRefresh", "type": "bool", "required": False, "frontendType": "checkbox",
|
|
"description": t("Import erzwingen"), "default": False},
|
|
{"name": "dateFrom", "type": "str", "required": False, "frontendType": "date",
|
|
"description": t("Startdatum"), "default": ""},
|
|
{"name": "dateTo", "type": "str", "required": False, "frontendType": "date",
|
|
"description": t("Enddatum"), "default": ""},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-database-refresh", "color": "#4CAF50", "usesAi": False},
|
|
"_method": "trustee",
|
|
"_action": "refreshAccountingData",
|
|
},
|
|
{
|
|
"id": "trustee.extractFromFiles",
|
|
"category": "trustee",
|
|
"label": t("Dokumente extrahieren"),
|
|
"description": t("Dokumenttyp und Daten aus PDF/JPG per AI extrahieren."),
|
|
"parameters": [
|
|
{"name": "connectionReference", "type": "str", "required": False, "frontendType": "userConnection",
|
|
"frontendOptions": {"authority": "msft"},
|
|
"description": t("SharePoint-Verbindung"), "default": ""},
|
|
{"name": "sharepointFolder", "type": "str", "required": False, "frontendType": "sharepointFolder",
|
|
"frontendOptions": {"dependsOn": "connectionReference"},
|
|
"description": t("SharePoint-Ordnerpfad"), "default": ""},
|
|
dict(_TRUSTEE_INSTANCE_PARAM),
|
|
{"name": "prompt", "type": "str", "required": False, "frontendType": "textarea",
|
|
"description": t("AI-Prompt für Extraktion"), "default": ""},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["DocumentList", "Transit", "AiResult", "LoopItem", "ActionResult"]}},
|
|
# Runtime returns ActionResult.isSuccess(documents=[...]) — see
|
|
# actions/extractFromFiles.py. Declaring DocumentList here was adapter
|
|
# drift and broke the DataPicker for downstream nodes.
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-file-document-scan", "color": "#4CAF50", "usesAi": True},
|
|
"_method": "trustee",
|
|
"_action": "extractFromFiles",
|
|
},
|
|
{
|
|
"id": "trustee.processDocuments",
|
|
"category": "trustee",
|
|
"label": t("Dokumente verarbeiten"),
|
|
"description": t("TrusteeDocument + TrusteePosition aus Extraktionsergebnis erstellen."),
|
|
"parameters": [
|
|
# Type matches what producers actually emit: ActionResult.documents
|
|
# is List[ActionDocument] (see datamodelChat.ActionResult). The
|
|
# DataPicker uses this string to filter compatible upstream paths.
|
|
{"name": "documentList", "type": "List[ActionDocument]", "required": True, "frontendType": "dataRef",
|
|
"description": t("Dokumentenliste — gebunden via DataRef.")},
|
|
dict(_TRUSTEE_INSTANCE_PARAM),
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["ActionResult", "DocumentList", "Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-file-document-check", "color": "#4CAF50", "usesAi": False},
|
|
"_method": "trustee",
|
|
"_action": "processDocuments",
|
|
},
|
|
{
|
|
"id": "trustee.syncToAccounting",
|
|
"category": "trustee",
|
|
"label": t("In Buchhaltung synchronisieren"),
|
|
"description": t("Trustee-Positionen in Buchhaltungssystem übertragen."),
|
|
"parameters": [
|
|
{"name": "documentList", "type": "List[ActionDocument]", "required": True, "frontendType": "dataRef",
|
|
"description": t("Verarbeitete Dokumentenliste — gebunden via DataRef.")},
|
|
dict(_TRUSTEE_INSTANCE_PARAM),
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["ActionResult", "DocumentList", "Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-calculator", "color": "#4CAF50", "usesAi": False},
|
|
"_method": "trustee",
|
|
"_action": "syncToAccounting",
|
|
},
|
|
{
|
|
"id": "trustee.queryData",
|
|
"category": "trustee",
|
|
"label": t("Treuhand-Daten abfragen"),
|
|
"description": t("Daten aus der Trustee-DB lesen (Lookup, Aggregation, Roh-Export). Pendant zu refreshAccountingData ohne externen Sync."),
|
|
"parameters": [
|
|
dict(_TRUSTEE_INSTANCE_PARAM),
|
|
{"name": "mode", "type": "str", "required": True, "frontendType": "select",
|
|
"frontendOptions": {"options": ["lookup", "raw", "aggregate"]},
|
|
"description": t("Abfragemodus"), "default": "lookup"},
|
|
{"name": "entity", "type": "str", "required": True, "frontendType": "select",
|
|
"frontendOptions": {"options": ["tenantWithRent", "contact", "journalLines", "accounts", "balances"]},
|
|
"description": t("Entität, die gelesen werden soll"), "default": "tenantWithRent"},
|
|
{"name": "tenantNameRef", "type": "str", "required": False, "frontendType": "text",
|
|
"frontendOptions": {"dependsOn": "entity", "showWhen": ["tenantWithRent", "contact"]},
|
|
"description": t("Mietername (oder {{wire.feld}} aus Upstream)"), "default": ""},
|
|
{"name": "tenantAddressRef", "type": "str", "required": False, "frontendType": "text",
|
|
"frontendOptions": {"dependsOn": "entity", "showWhen": ["tenantWithRent", "contact"]},
|
|
"description": t("Mieteradresse (Toleranz für Tippfehler)"), "default": ""},
|
|
{"name": "period", "type": "str", "required": False, "frontendType": "text",
|
|
"frontendOptions": {"dependsOn": "entity", "showWhen": ["tenantWithRent", "journalLines", "balances"]},
|
|
"description": t("Zeitraum (YYYY oder YYYY-MM-DD/YYYY-MM-DD)"), "default": ""},
|
|
{"name": "rentAccountPattern", "type": "str", "required": False, "frontendType": "text",
|
|
"frontendOptions": {"dependsOn": "entity", "showWhen": ["tenantWithRent"]},
|
|
"description": t("Konto-Filter für Mietzins (z.B. '6000-6099' oder '6*')"), "default": ""},
|
|
{"name": "filterJson", "type": "str", "required": False, "frontendType": "textarea",
|
|
"frontendOptions": {"dependsOn": "mode", "showWhen": ["raw", "aggregate"]},
|
|
"description": t("Optionaler JSON-Filter für mode=raw/aggregate"), "default": ""},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["Transit", "AiResult", "ConsolidateResult", "UdmDocument"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-database-search", "color": "#4CAF50", "usesAi": False},
|
|
"_method": "trustee",
|
|
"_action": "queryData",
|
|
},
|
|
]
|