From 34f8d54b08b7034b5cc0c4816786234e195aeab7 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Fri, 16 Jan 2026 21:57:24 +0100 Subject: [PATCH] update demo data --- demo/spaces_processes.xml | 48 + .../dynamixs/model/builder/GenerateModel.java | 7 +- .../builder/ProcessDescriptionParser.java | 36 +- .../ProcessDescriptionParserClaude.java | 303 ++++ .../ProcessDescriptionParserGemini.java | 303 ++++ .../ai/dynamixs/website/SVGConverter.java | 597 ++++++++ .../src/test/resources/contract-de-1.0.0.bpmn | 583 ++++++++ .../src/test/resources/contract.txt | 144 ++ .../test/resources/process-description.txt | 107 +- .../src/test/resources/riskmanagement.txt | 77 + .../supplier-compliance-process.bpmn | 770 +++++----- .../resources/website/background-001.bpmn | 146 ++ .../test/resources/website/background-001.svg | 254 ++++ .../resources/website/background-001_dark.svg | 148 ++ .../website/background-001_default.svg | 148 ++ .../website/background-001_light.svg | 148 ++ .../src/test/resources/website/index.html | 494 +++++++ workflow/en/offer-en-1.0.1.bpmn | 3 - workflow/en/risk-de-1.0.0.bpmn | 1282 +++++++++++++++++ workflow/office/posteingang-de-3.0.2.bpmn | 1133 +++++++-------- .../office/rechnungseingang-de-1.0.1.bpmn | 2 +- 21 files changed, 5703 insertions(+), 1030 deletions(-) create mode 100644 demo/spaces_processes.xml create mode 100644 dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParserClaude.java create mode 100644 dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParserGemini.java create mode 100644 dynamixs-ai-app/src/test/java/ai/dynamixs/website/SVGConverter.java create mode 100644 dynamixs-ai-app/src/test/resources/contract-de-1.0.0.bpmn create mode 100644 dynamixs-ai-app/src/test/resources/contract.txt create mode 100644 dynamixs-ai-app/src/test/resources/riskmanagement.txt create mode 100644 dynamixs-ai-app/src/test/resources/website/background-001.bpmn create mode 100644 dynamixs-ai-app/src/test/resources/website/background-001.svg create mode 100644 dynamixs-ai-app/src/test/resources/website/background-001_dark.svg create mode 100644 dynamixs-ai-app/src/test/resources/website/background-001_default.svg create mode 100644 dynamixs-ai-app/src/test/resources/website/background-001_light.svg create mode 100644 dynamixs-ai-app/src/test/resources/website/index.html create mode 100644 workflow/en/risk-de-1.0.0.bpmn diff --git a/demo/spaces_processes.xml b/demo/spaces_processes.xml new file mode 100644 index 0000000..79a87bf --- /dev/null +++ b/demo/spaces_processes.xml @@ -0,0 +1,48 @@ + +2026-01-14T15:07:23.013+01:00ralph.soika@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-14T15:07:23.001980543+01:00|system-de-1.3|300|12|301|ralph.soika@dynamixs.ai|2026-01-14T15:15:16.72202+01:00|system-de-1.3|301|10|301|ralph.soika@dynamixs.ai|2026-01-14T15:20:37.285211784+01:00|system-de-1.3|301|10|301|ralph.soika@dynamixs.ai|2026-01-16T17:27:42.098991348+01:00|system-de-1.3|301|10|301|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_16trueralph.soika@dynamixs.ai102026-01-16T17:27:42.074+01:00301system-de-1.32026-01-16T17:27:42.103+01:00ralph.soika@dynamixs.airalph.soika@dynamixs.aihans-peter.fischer@dynamixs.ai3012d40a0e6-543a-43fc-9c30-0321203edeb2-1768580862116301ce4483c765eeb79e2d40a0e6-543a-43fc-9c30-0321203edeb24ProzessAktiv (Öffentlich)880af8c5-1482-4f62-9dad-3595a425a642/pages/admin/organisationralph.soika@dynamixs.aihans-peter.fischer@dynamixs.aiGlobal Quality Management Systemralph.soika@dynamixs.airalph.soika@dynamixs.aiAssistancehans-peter.fischer@dynamixs.aiManagerralph.soika@dynamixs.aiTeamIATF 16949 & ISO 9001: Dies ist das Herzstück. Sie benötigen ein Global Quality Management System. Alle Werke (auch Malaysia oder Bulgarien) müssen nach demselben Standard zertifiziert sein. Abweichungen in Polen müssen genauso behandelt werden wie in Deutschland. +ProzessRiskmanagementAktiv (Öffentlich)process2025-06-26T10:54:14.999+02:00rsoikahans-peter.fischer@dynamixs.ai02025-06-26T10:54:14.997504669+02:00|system-de-1.3|300|12|301|rsoika|2025-06-26T12:01:35.436142038+02:00|system-de-1.3|301|10|301|rsoika|2025-12-06T19:09:42.548198725+01:00|system-de-1.3|301|10|301|ralph.soika@imixs.com|2026-01-16T17:29:44.717704548+01:00|system-de-1.3|301|10|301|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_16trueralph.soika@imixs.com102026-01-16T17:29:44.692+01:00301system-de-1.32026-01-16T17:29:44.722+01:00rsoikarsoikaralph.soika@imixs.comhans-peter.fischer@dynamixs.ai301c51a4a54-110f-42d7-a273-ef08bfa612cb-176858098473630190795c21fd09944ac51a4a54-110f-42d7-a273-ef08bfa612cb4ProzessAktiv (Öffentlich)a1faea2e-a60b-4252-a1a8-f6ed9047e6a5/pages/admin/organisationrsoikahans-peter.fischer@dynamixs.aiLkSG (Lieferkettensorgfaltspflichtengesetz)ralph.soika@imixs.comrsoikaAssistenzralph.soika@imixs.comVerantwortlichTeamLkSG (Lieferkettensorgfaltspflichtengesetz): +Pflicht: Seit 2024 gilt dies auch für Unternehmen Ihrer Größe (>1000 MA in DE). +Prozess: Sie müssen ein Risikomanagement für Menschenrechte und Umweltstandards installieren – nicht nur für Ihre Standorte (z.B. Arbeitsschutz in Malaysia), sondern auch für Ihre Lieferanten (Tier 3/4). +ProzessAktiv (Öffentlich)process2025-06-26T10:55:47.333+02:00rsoikahans-peter.fischer@dynamixs.ai02025-06-26T10:55:47.332065638+02:00|system-de-1.3|300|12|301|rsoika|2025-10-06T15:02:36.573744019+02:00|system-de-1.3|301|10|301|rsoika|2025-10-06T15:12:53.298645156+02:00|system-de-1.3|301|10|301|rsoika|2026-01-16T17:28:51.420952256+01:00|system-de-1.3|301|10|301|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_16truersoika102026-01-16T17:28:51.395+01:00301system-de-1.32026-01-16T17:28:51.425+01:00rsoikarsoikahans-peter.fischer@dynamixs.ai301cde20e21-5c83-46b1-a27f-f908d494ecd8-1768580931438301f3824b5fe26e5cb6cde20e21-5c83-46b1-a27f-f908d494ecd84ProzessAktiv (Öffentlich)1617275b-6286-4199-9afd-fafe4e5cf7cf/pages/admin/organisationrsoikahans-peter.fischer@dynamixs.aiTrusted Information Security Assessment ExchangersoikarsoikaAssistenzVerantwortlichTeamTISAX (Trusted Information Security Assessment Exchange): Zwingend erforderlich für die Zusammenarbeit mit deutschen OEMs (Datensicherheit, Prototypenschutz). Governance-Prozess für IT-Sicherheit muss global ausgerollt sein. +ProzessCustomerAktiv (Öffentlich)process2025-06-26T10:54:31.627+02:00rsoikahans-peter.fischer@dynamixs.ai02025-06-26T10:54:31.625278665+02:00|system-de-1.3|300|12|301|rsoika|2025-06-26T10:55:04.026529791+02:00|system-de-1.3|301|10|301|rsoika|2025-06-26T10:55:27.868954948+02:00|system-de-1.3|301|10|301|rsoika|2026-01-16T17:30:29.71781847+01:00|system-de-1.3|301|10|301|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_16truersoika102026-01-16T17:30:29.693+01:00301system-de-1.32026-01-16T17:30:29.722+01:00rsoikarsoikahans-peter.fischer@dynamixs.ai301e8824e0c-17aa-4803-9599-03c45f088a52-1768581029735301b2f2a5e8ab7546cfe8824e0c-17aa-4803-9599-03c45f088a524ProzessAktiv (Öffentlich)e1fb4bb2-7988-40b9-8125-bfabe8382917/pages/admin/organisationrsoikahans-peter.fischer@dynamixs.aiGlobal InboxrsoikarsoikaAssistenzVerantwortlichTeamImport von Geschäftsdokumenten und E-MailsProzessInboxAktiv (Öffentlich)process2026-01-16T17:34:32.377+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:34:32.366492596+01:00|system-de-1.3|300|10|300|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_1true102026-01-16T17:34:32.338+01:00300system-de-1.32026-01-16T17:34:32.378+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai300ebf30a61-60ac-43cf-91ff-5c17641eaf76-176858127239130039e1ef96215dcea6ebf30a61-60ac-43cf-91ff-5c17641eaf761ProzessAktiv (Eingeschränkt)eb364978-2938-4e12-bf17-a1f2a8f77d7c/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiCode of Conduct & Whistleblowinghans-peter.fischer@dynamixs.aiAssistenzVerantwortlichTeamCode of Conduct & Whistleblowing: +Einrichtung eines globalen Hinweisgebersystems (Pflicht in der EU), das auch kulturell in Japan oder den USA funktioniert. +ProzessAktiv (Eingeschränkt)process2026-01-16T17:33:06.501+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:33:06.491081443+01:00|system-de-1.3|300|10|300|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_1true102026-01-16T17:33:06.469+01:00300system-de-1.32026-01-16T17:33:06.501+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai3006a40c8a6-13c2-4ee5-a4fb-91c7b8af1ebc-17685811865143004951a1c04d3962a56a40c8a6-13c2-4ee5-a4fb-91c7b8af1ebc1ProzessAktiv (Eingeschränkt)9264bce7-a5b6-4ba3-9fa2-e484d2d92bc7/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiExport control & Tax Managementhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichTeamExportkontrolle & Zoll: +Da Sie in den USA und Asien produzieren und handeln, müssen Sanktionslisten und Dual-Use-Verordnungen automatisiert geprüft werden. +ProzessAktiv (Eingeschränkt)process2026-01-16T17:31:08.888+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:31:08.876350856+01:00|system-de-1.3|300|10|300|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_1true102026-01-16T17:31:08.851+01:00300system-de-1.32026-01-16T17:31:08.888+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai3004ddb0848-a3ce-456b-bac5-aeccb5da62ce-1768581068901300dab01092b04fbf7a4ddb0848-a3ce-456b-bac5-aeccb5da62ce1ProzessAktiv (Eingeschränkt)eea3cefd-05a9-43f9-8967-afd767affb71/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiTransfer Pricinghans-peter.fischer@dynamixs.aiAssistenzVerantwortlichTeamTransfer Pricing (Verrechnungspreise): +Risiko: Das Finanzamt prüft streng, zu welchen Preisen das deutsche HQ Dienstleistungen oder Vorprodukte an das Werk in Polen oder die USA verkauft. +Prozess: Erstellung einer globalen Verrechnungspreisdokumentation (Master File / Local File) zur Vermeidung von Steuernachzahlungen. +ProzessAktiv (Eingeschränkt)process2026-01-16T17:36:52.464+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:36:52.455080343+01:00|system-de-1.3|300|10|300|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_1true102026-01-16T17:36:52.430+01:00300system-de-1.32026-01-16T17:36:52.464+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai3002d413cfc-1905-4f0f-8a3a-d90cc605fa78-17685814124763005df3c393342385782d413cfc-1905-4f0f-8a3a-d90cc605fa781ProzessAktiv (Eingeschränkt)c44f2f18-45e9-4b93-b8fe-9cc96de0afbd/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiRisk Managementhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichTeamRisikomanagement nach KontraGProzessAktiv (Eingeschränkt)process2026-01-16T17:33:43.447+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:33:43.43674436+01:00|system-de-1.3|300|10|300|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_1true102026-01-16T17:33:43.413+01:00300system-de-1.32026-01-16T17:33:43.447+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai30025e049b0-3fe0-4882-8a66-907163fa1eee-1768581223460300898f144e2d62078f25e049b0-3fe0-4882-8a66-907163fa1eee1ProzessAktiv (Eingeschränkt)258f42d4-45da-45c4-a384-4219ca1b5347/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiCSRDhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichTeamNachhaltigkeitsberichterstattung (CSRD): +Als großes Unternehmen müssen Sie detailliert über CO2-Fußabdruck (Scope 1, 2 und 3) berichten. +Prozess: Datenerfassung des Energieverbrauchs an allen Standorten (Malaysia bis USA) und Konsolidierung im HQ. +ProzessAktiv (Eingeschränkt)process2026-01-16T16:15:41.240+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T16:15:41.232843681+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T16:15:41.178+01:00100system-de-1.32026-01-16T16:15:41.240+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1001dd9aff3-a589-4915-8377-23aedf5ed2b0-17685765412531001451653c51266d821dd9aff3-a589-4915-8377-23aedf5ed2b01OrganisationseinheitAktiv3e8fde52-ecd9-4556-95e4-965015272009/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbHhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichDYNAMO GmbHTeamOrganisationseinheitAktivspace2026-01-16T17:04:46.892+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:04:46.884020625+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:04:46.798+01:00100system-de-1.32026-01-16T17:04:46.893+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100b0125bfd-87f2-4efb-9357-23f1a0ba571b-17685794869061004ccc31e8cfffa269b0125bfd-87f2-4efb-9357-23f1a0ba571b7aeed90c-38f5-4b83-8160-cf136911de071OrganisationseinheitAktiv25ec7345-3beb-4913-8705-ac9078714f51/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CFO Office.Accounting, Tax & Treasuryhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichAccounting, Tax & TreasuryDYNAMO GmbH.CFO OfficeTeamHead of Accounting, Tax & Treasury: +Jahresabschlüsse (HGB/IFRS), Währungsabsicherung (Hedging USD/JPY), Verrechnungspreise (Transfer Pricing). +OrganisationseinheitAktivspace2026-01-16T17:03:52.962+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:03:52.954135981+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:03:52.873+01:00100system-de-1.32026-01-16T17:03:52.962+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100532a4397-f448-4c2a-9065-00003b91c264-1768579432976100c5599ff0329daf45532a4397-f448-4c2a-9065-00003b91c2647aeed90c-38f5-4b83-8160-cf136911de071OrganisationseinheitAktivc0d29bc3-0995-42d2-965d-0bfafe7595e7/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CFO Office.Global Controllinghans-peter.fischer@dynamixs.aiAssistenzVerantwortlichGlobal ControllingDYNAMO GmbH.CFO OfficeTeamHead of Global Controlling: +Werkscontrolling, Projektcontrolling. Erstellt das monatliche Reporting für alle Standorte. +OrganisationseinheitAktivspace2026-01-16T16:55:05.013+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T16:55:05.006312379+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T16:55:04.930+01:00100system-de-1.32026-01-16T16:55:05.015+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100c13f7e8b-4853-4841-8c39-89bdae87aac6-17685789050281007739866e1a7b0cb0c13f7e8b-4853-4841-8c39-89bdae87aac61dd9aff3-a589-4915-8377-23aedf5ed2b01OrganisationseinheitAktiv49dce724-148f-4925-af7d-ba858c1a2ff2/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CTO Officehans-peter.fischer@dynamixs.aiAssistenzVerantwortlichCTO OfficeDYNAMO GmbHTeamCTO (Chief Technology Officer) +Fokus: Innovation & ProduktreifeOrganisationseinheitAktivspace2026-01-16T16:17:31.186+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T16:17:31.177051235+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T16:17:31.093+01:00100system-de-1.32026-01-16T16:17:31.186+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100e5289ee9-3466-489d-9df4-f6192dd5645f-176857665119910093ef625a9028a6bfe5289ee9-3466-489d-9df4-f6192dd5645f1dd9aff3-a589-4915-8377-23aedf5ed2b01OrganisationseinheitAktivfeb17a93-fb11-409d-9032-1c987b6a958a/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Officehans-peter.fischer@dynamixs.aiAssistenzVerantwortlichCOO OfficeDYNAMO GmbHTeamCOO (Chief Operating Officer) – Der größte Bereich +Fokus: Operative Exzellenz, Kosten & LieferfähigkeitOrganisationseinheitAktivspace2026-01-16T16:19:33.562+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T16:19:33.553479677+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T16:19:33.469+01:00100system-de-1.32026-01-16T16:19:33.562+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100119629e4-5a4b-42e7-a043-11caf319fec0-1768576773574100923ef0d2acde8827119629e4-5a4b-42e7-a043-11caf319fec01dd9aff3-a589-4915-8377-23aedf5ed2b01OrganisationseinheitAktiv5b6379b1-061b-48d7-848d-eee3e78d252d/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CSO Officehans-peter.fischer@dynamixs.aiAssistenzVerantwortlichCSO OfficeDYNAMO GmbHTeamCSO (Chief Sales Officer) +Fokus: Kundenbindung & UmsatzOrganisationseinheitAktivspace2026-01-16T17:02:27.183+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:02:27.173441+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:02:27.091+01:00100system-de-1.32026-01-16T17:02:27.183+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1007aeed90c-38f5-4b83-8160-cf136911de07-1768579347196100251c7e3fcca8681f7aeed90c-38f5-4b83-8160-cf136911de071dd9aff3-a589-4915-8377-23aedf5ed2b01OrganisationseinheitAktiv8fc6303e-77ea-4db0-9a28-e5d7625ebab7/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CFO Officehans-peter.fischer@dynamixs.aiAssistenzVerantwortlichCFO OfficeDYNAMO GmbHTeamCFO (Chief Financial Officer) +Fokus: Liquidität, Daten & SicherheitOrganisationseinheitAktivspace2026-01-16T16:16:38.198+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T16:16:38.187660689+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T16:16:38.107+01:00100system-de-1.32026-01-16T16:16:38.199+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1000b589a26-07b6-43c0-adf7-a24dec40a203-1768576598211100f5ee5cdbcc4592ce0b589a26-07b6-43c0-adf7-a24dec40a2031dd9aff3-a589-4915-8377-23aedf5ed2b01OrganisationseinheitAktiv45c85e17-9c00-418c-8705-8211261411eb/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CEO Officehans-peter.fischer@dynamixs.aiAssistenzVerantwortlichCEO OfficeDYNAMO GmbHTeamCEO (Chief Executive Officer) +Fokus: Strategie, Kultur & ComplianceOrganisationseinheitAktivspace2026-01-16T17:12:46.917+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:12:46.911030716+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:12:46.837+01:00100system-de-1.32026-01-16T17:12:46.917+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100dccb1d61-c861-4c01-b143-cd795d09f633-17685799669301007e54805e60252658dccb1d61-c861-4c01-b143-cd795d09f6330b589a26-07b6-43c0-adf7-a24dec40a2031OrganisationseinheitAktivdcc300fa-343f-47ad-9f1c-2c21d7f91024/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CEO Office.Corporate Strategy & ESGhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichCorporate Strategy & ESGDYNAMO GmbH.CEO OfficeTeamHead of Corporate Strategy & ESG: +Treibt M&A-Themen, Nachhaltigkeitsreporting (CSRD) und die langfristige Ausrichtung +OrganisationseinheitAktivspace2026-01-16T17:08:12.547+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:08:12.539820347+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:08:12.466+01:00100system-de-1.32026-01-16T17:08:12.547+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100265b2598-3574-47d8-8416-01f24a09cb0c-1768579692559100406f206905e39ac6265b2598-3574-47d8-8416-01f24a09cb0ce5289ee9-3466-489d-9df4-f6192dd5645f1OrganisationseinheitAktivfda3676c-3e82-4309-a9b5-2741da956b6e/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations AMERICAShans-peter.fischer@dynamixs.aiAssistenzVerantwortlichVP Operations AMERICASDYNAMO GmbH.COO OfficeTeamVP Operations AMERICAS: +Führt das Werk USA. +Ziel: USMCA-Compliance, Nähe zu US-Kunden +OrganisationseinheitAktivspace2026-01-16T17:07:18.360+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:07:18.353438552+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|2026-01-16T17:09:49.06377382+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:09:48.943+01:00100system-de-1.32026-01-16T17:09:49.069+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1003b6d422e-9e06-42db-a0da-c7fa296f3a1c-176857978908310048f0767a05df4bf23b6d422e-9e06-42db-a0da-c7fa296f3a1ce5289ee9-3466-489d-9df4-f6192dd5645f2OrganisationseinheitAktive0001de8-e3c2-48fb-bd30-eb2b9984122e/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations EMEAhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichVP Operations EMEADYNAMO GmbH.COO OfficeTeamVP Operations EMEA (Europa): +Führt die 3 Werke in Deutschland + Polen + Bulgarien. +Ziel: Balance zwischen High-Tech (DE) und Best-Cost (PL/BG).OrganisationseinheitAktivspace2026-01-16T17:11:52.197+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:11:52.190818925+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|2026-01-16T17:12:05.897305245+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:12:05.819+01:00100system-de-1.32026-01-16T17:12:05.902+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1007d271628-a524-4a58-9c62-aef39490964b-1768579925915100df0b52e93f2afab17d271628-a524-4a58-9c62-aef39490964b0b589a26-07b6-43c0-adf7-a24dec40a2032OrganisationseinheitAktivcbbdb1ee-e031-477d-96c9-8ace8018cae9/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CEO Office.Legal & Compliancehans-peter.fischer@dynamixs.aiAssistenzVerantwortlichLegal & ComplianceDYNAMO GmbH.CEO OfficeTeamHead of Legal & Compliance: +Zentrales Vertragsmanagement, Einhaltung des LkSG (Lieferkettengesetz) und Exportkontrolle.OrganisationseinheitAktivspace2026-01-16T17:09:08.223+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:09:08.213167566+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:09:07.550+01:00100system-de-1.32026-01-16T17:09:08.223+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100cf04cb8a-8a53-4212-873f-c165c8487840-1768579748237100ee62eb3f860bf513cf04cb8a-8a53-4212-873f-c165c8487840e5289ee9-3466-489d-9df4-f6192dd5645f1OrganisationseinheitAktiv122e1514-2c6d-4c7a-88c5-5848a27796c7/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations APAChans-peter.fischer@dynamixs.aiAssistenzVerantwortlichVP Operations APACDYNAMO GmbH.COO OfficeTeamVP Operations APAC: +Führt Werke Japan & Malaysia. +Ziel: Qualitätsanspruch Japan vs. Kostenführerschaft Malaysia. +OrganisationseinheitAktivspace2026-01-16T17:06:03.439+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:06:03.431262229+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:06:03.354+01:00100system-de-1.32026-01-16T17:06:03.439+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai10079c25be8-0caa-4898-9080-b8ec6ce62804-1768579563451100bcdb86f3ae9f563979c25be8-0caa-4898-9080-b8ec6ce628047aeed90c-38f5-4b83-8160-cf136911de071OrganisationseinheitAktiv8d56adc4-cd4b-43a7-ae97-afcde9badcd1/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CFO Office.CIO Officehans-peter.fischer@dynamixs.aiAssistenzVerantwortlichCIO OfficeDYNAMO GmbH.CFO OfficeTeamCIO (Chief Information Officer): +Verantwortlich für ERP, Office-IT, TISAX-Sicherheit und globale Vernetzung der Werke. +OrganisationseinheitAktivspace2026-01-16T17:11:09.884+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:11:09.876615957+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:11:09.678+01:00100system-de-1.32026-01-16T17:11:09.885+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1006e5b463a-e35b-4060-bbfe-1e9ac97bfea2-17685798698971007548db86ff2b93476e5b463a-e35b-4060-bbfe-1e9ac97bfea20b589a26-07b6-43c0-adf7-a24dec40a2031OrganisationseinheitAktiv77b871bc-480b-4a30-9dc6-0f7867da7eaf/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CEO Office.HR Globalhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichHR GlobalDYNAMO GmbH.CEO OfficeTeamHead of Global HR: +Verantwortlich für globale Personalstandards, Entsendungsrichtlinien (Expats nach USA/Asien) und Talentmanagement. Wichtig: Harmonisierung der Führungskultur zwischen Deutschland und den internationalen Werken.OrganisationseinheitAktivspace2026-01-16T17:15:21.535+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:15:21.529004903+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:15:21.454+01:00100system-de-1.32026-01-16T17:15:21.535+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1005ea23089-d3aa-43e2-be7f-73c8d6768a35-1768580121547100baad278c008189265ea23089-d3aa-43e2-be7f-73c8d6768a35119629e4-5a4b-42e7-a043-11caf319fec01OrganisationseinheitAktiv2fcb42d5-ec7d-4f57-8249-f28b3d39b178/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CSO Office.Marketing & Business Developmenthans-peter.fischer@dynamixs.aiAssistenzVerantwortlichMarketing & Business DevelopmentDYNAMO GmbH.CSO OfficeTeamHead of Marketing & Business Development: +Messeauftritte, Marktbeobachtung, Erschließung neuer Tier-1 Kunden. +OrganisationseinheitAktivspace2026-01-16T17:20:14.054+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:20:14.045834434+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:20:13.963+01:00100system-de-1.32026-01-16T17:20:14.054+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1002fc0ece5-b72a-4065-b9cb-0c7e0aafb5b2-17685804140671002c2ad37d040191312fc0ece5-b72a-4065-b9cb-0c7e0aafb5b27aeed90c-38f5-4b83-8160-cf136911de071OrganisationseinheitAktivac7eac50-9c95-427a-9b13-ed0ec1ec6bf3/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CFO Office.Purchasing & Quality Managementhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPurchasing & Quality ManagementDYNAMO GmbH.CFO OfficeTeamHead of Purchasing Management & Quality ControlOrganisationseinheitAktivspace2026-01-16T17:22:38.901+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:22:38.892176169+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:22:38.800+01:00100system-de-1.32026-01-16T17:22:38.901+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1000e1f6c2a-6faf-4bae-97e2-d763a764a432-17685805589141001787aaae417cc2eb0e1f6c2a-6faf-4bae-97e2-d763a764a432265b2598-3574-47d8-8416-01f24a09cb0c1OrganisationseinheitAktiv585c9c84-df24-4d55-aa49-507a53c9f0d7/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations AMERICAS.Plant USAhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPlant USADYNAMO GmbH.COO Office.VP Operations AMERICASTeamPlant USAOrganisationseinheitAktivspace2026-01-16T17:14:59.116+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:14:59.109623464+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:14:59.037+01:00100system-de-1.32026-01-16T17:14:59.116+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100e5e21eda-a759-48f1-ac18-5ca13ffc6ef6-176858009912810042d609485db9101e5e21eda-a759-48f1-ac18-5ca13ffc6ef6119629e4-5a4b-42e7-a043-11caf319fec01OrganisationseinheitAktivf56f70cd-7f8b-4813-83db-0ef618eee6a8/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CSO Office.Sales Operations & Pricinghans-peter.fischer@dynamixs.aiAssistenzVerantwortlichSales Operations & PricingDYNAMO GmbH.CSO OfficeTeamHead of Sales Operations & Pricing: +Kalkulation, Angebotserstellung und Vertragsmanagement (damit nicht ein Sales-Mitarbeiter in USA billiger anbietet als einer in DE für das gleiche Teil).OrganisationseinheitAktivspace2026-01-16T17:16:55.638+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:16:55.631801333+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:16:55.553+01:00100system-de-1.32026-01-16T17:16:55.638+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai10036a3338e-ceb5-4906-8ec8-b3b885717045-17685802156511003ce673b4d9482e5536a3338e-ceb5-4906-8ec8-b3b885717045c13f7e8b-4853-4841-8c39-89bdae87aac61OrganisationseinheitAktiv45c0eb54-a0dd-4565-99a0-569c985ba8d0/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CTO Office.Research & Pre-Developmenthans-peter.fischer@dynamixs.aiAssistenzVerantwortlichResearch & Pre-DevelopmentDYNAMO GmbH.CTO OfficeTeamHead of Advanced Engineering (Vorentwicklung): +Forschung an neuen Materialien/VerfahrenOrganisationseinheitAktivspace2026-01-16T17:18:35.174+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:18:35.167099346+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:18:35.090+01:00100system-de-1.32026-01-16T17:18:35.174+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1006fc8d167-a8ff-4274-934b-2dfd4d6ffbd3-1768580315187100b405b92a2e6e71646fc8d167-a8ff-4274-934b-2dfd4d6ffbd3c13f7e8b-4853-4841-8c39-89bdae87aac61OrganisationseinheitAktiv312c6381-bdbb-47d3-9f0f-f2a549f3c4ec/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CTO Office.Industrial Engineeringhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichIndustrial EngineeringDYNAMO GmbH.CTO OfficeTeamHead of Industrial Engineering: +Plant die Produktionsanlagen in allen StandortenOrganisationseinheitAktivspace2026-01-16T17:17:47.193+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:17:47.185404334+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:17:47.106+01:00100system-de-1.32026-01-16T17:17:47.193+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100152f0be7-d623-4bb9-9677-f494af2911bc-176858026720610032d1bacdc90e9f8152f0be7-d623-4bb9-9677-f494af2911bcc13f7e8b-4853-4841-8c39-89bdae87aac61OrganisationseinheitAktiv15c6c93d-a58d-4cc4-9297-7b625fc4a98c/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CTO Office.Product Engineeringhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichProduct EngineeringDYNAMO GmbH.CTO OfficeTeamHead of Product Engineering (Serienentwicklung): +Verantwortlich für die kundennahe Entwicklung. +OrganisationseinheitAktivspace2026-01-16T17:14:11.348+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:14:11.340755372+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:14:11.266+01:00100system-de-1.32026-01-16T17:14:11.348+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100ee72d780-77c6-4f79-8574-450016b5a0e1-1768580051360100838e9ed3e60ab5ccee72d780-77c6-4f79-8574-450016b5a0e1119629e4-5a4b-42e7-a043-11caf319fec01OrganisationseinheitAktiv6534105e-7677-4df2-96e7-2990484574f3/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.CSO Office.Global KAMhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichGlobal KAMDYNAMO GmbH.CSO OfficeTeamVP Global Key Account Management (GKAM): +Hierunter hängen die Key Account Manager für die großen Gruppen (z.B. Head of VW Group, Head of BMW, Head of US-OEMs, Head of Asian-OEMs). Sie verhandeln die globalen Preise.OrganisationseinheitAktivspace2026-01-16T17:24:44.110+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:24:44.100928796+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:24:44.020+01:00100system-de-1.32026-01-16T17:24:44.110+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai10003d54fa2-e76c-4a73-96f9-8d7ed6687b66-1768580684123100185d348a4b5f794703d54fa2-e76c-4a73-96f9-8d7ed6687b663b6d422e-9e06-42db-a0da-c7fa296f3a1c1OrganisationseinheitAktiv1181f0ff-aa19-4d09-9ce3-70e2a4786faa/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations EMEA.Plant Brandenburghans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPlant BrandenburgDYNAMO GmbH.COO Office.VP Operations EMEATeamPlant BrandenburgOrganisationseinheitAktivspace2026-01-16T17:25:13.332+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:25:13.325242698+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:25:13.247+01:00100system-de-1.32026-01-16T17:25:13.333+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai1003387701c-8699-4a85-a544-85b806b91697-1768580713345100fd2e1c5a455d4e243387701c-8699-4a85-a544-85b806b916973b6d422e-9e06-42db-a0da-c7fa296f3a1c1OrganisationseinheitAktiv35cd60b6-dbe4-47d2-8238-bbc46be0e544/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations EMEA.Plant Frankfurthans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPlant FrankfurtDYNAMO GmbH.COO Office.VP Operations EMEATeamPlant FrankfurtOrganisationseinheitAktivspace2026-01-16T17:23:36.304+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:23:36.296620668+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:23:36.220+01:00100system-de-1.32026-01-16T17:23:36.304+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100ca34ea8e-631d-447a-afd7-b6abec4df556-1768580616317100bf32c53d3f2bb5f8ca34ea8e-631d-447a-afd7-b6abec4df556cf04cb8a-8a53-4212-873f-c165c84878401OrganisationseinheitAktiv32db31dd-c81e-4b10-883a-ee17de22965b/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations APAC.Plant Malaysiahans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPlant MalaysiaDYNAMO GmbH.COO Office.VP Operations APACTeamPlant MalaysiaOrganisationseinheitAktivspace2026-01-16T17:26:08.400+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:26:08.394023959+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:26:08.320+01:00100system-de-1.32026-01-16T17:26:08.400+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100f7cc767a-3544-4b35-a868-a62983484d92-1768580768412100f446851d5cd52228f7cc767a-3544-4b35-a868-a62983484d923b6d422e-9e06-42db-a0da-c7fa296f3a1c1OrganisationseinheitAktiv9c89fcd3-0c4c-4ad4-a89c-a57079acd1ea/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations EMEA.Plant Bulgariahans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPlant BulgariaDYNAMO GmbH.COO Office.VP Operations EMEATeamPlant BulgariaOrganisationseinheitAktivspace2026-01-16T17:24:15.201+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:24:15.191674246+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:24:15.112+01:00100system-de-1.32026-01-16T17:24:15.201+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100edc38c86-db87-49be-b4c6-89d76096310d-176858065521410055224051ee7c1a4bedc38c86-db87-49be-b4c6-89d76096310d3b6d422e-9e06-42db-a0da-c7fa296f3a1c1OrganisationseinheitAktiv1b36d08e-f489-48c1-aa1c-d7e1fc4e3e0c/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations EMEA.Plant Munichhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPlant MunichDYNAMO GmbH.COO Office.VP Operations EMEATeamPlant MunichOrganisationseinheitAktivspace2026-01-16T17:25:39.288+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:25:39.280441845+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:25:39.157+01:00100system-de-1.32026-01-16T17:25:39.288+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100f6d4384d-2ce6-43ef-b39b-88a5eba47f5f-176858073930110059078afe981d737df6d4384d-2ce6-43ef-b39b-88a5eba47f5f3b6d422e-9e06-42db-a0da-c7fa296f3a1c1OrganisationseinheitAktiva504735d-2ea3-4daf-a365-40a691874655/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations EMEA.Plant Polandhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPlant PolandDYNAMO GmbH.COO Office.VP Operations EMEATeamPlant PolandOrganisationseinheitAktivspace2026-01-16T17:23:07.439+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai02026-01-16T17:23:07.433073971+01:00|system-de-1.3|100|10|100|hans-peter.fischer@dynamixs.ai|IntermediateCatchEvent_2true102026-01-16T17:23:07.358+01:00100system-de-1.32026-01-16T17:23:07.439+01:00hans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.ai100d25ea929-0868-4e64-b505-f656810d8645-1768580587452100f14e4760d6b81311d25ea929-0868-4e64-b505-f656810d8645cf04cb8a-8a53-4212-873f-c165c84878401OrganisationseinheitAktivf2b34580-3726-43b9-824c-cee7c62447bf/pages/admin/organisationhans-peter.fischer@dynamixs.aihans-peter.fischer@dynamixs.aiDYNAMO GmbH.COO Office.VP Operations APAC.Plant Japanhans-peter.fischer@dynamixs.aiAssistenzVerantwortlichPlant JapanDYNAMO GmbH.COO Office.VP Operations APACTeamPlant JapanOrganisationseinheitAktivspace \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModel.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModel.java index a909456..1cfdd75 100644 --- a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModel.java +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/GenerateModel.java @@ -30,8 +30,9 @@ public class GenerateModel { @Test public void buildModel() { try { - String out = "src/test/resources/supplier-compliance-process.bpmn"; - String descriptionFile = "src/test/resources/process-description.txt"; + String out = "src/test/resources/risk-de-1.0.0.bpmn"; + // String descriptionFile = "src/test/resources/process-description.txt"; + String descriptionFile = "src/test/resources/riskmanagement.txt"; logger.info("...read template"); BPMNModel model = BPMNModelFactory.read("/template-en-0.0.0.bpmn"); @@ -45,7 +46,7 @@ public class GenerateModel { Event referenceEvent = (Event) process.findElementById("event_vIjHLQ"); // Parse description and generate BPMN elements - ProcessDescriptionParser parser = new ProcessDescriptionParser(); + ProcessDescriptionParserGemini parser = new ProcessDescriptionParserGemini(); parser.getLayoutCalculator().setStartPosition(300, 300); parser.parseAndGenerate(descriptionFile, process, referenceTask, referenceEvent); diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParser.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParser.java index 5720dc7..8acdc0e 100644 --- a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParser.java +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParser.java @@ -18,18 +18,22 @@ import org.openbpmn.bpmn.elements.core.BPMNPoint; import org.openbpmn.bpmn.exceptions.BPMNModelException; /** - * Parses a process description file and generates BPMN elements. Uses - * LayoutCalculator for positioning of elements. + * Parses a process description file and generates BPMN elements. + * Uses LayoutCalculator for positioning of elements. + * + * Supports both plain text and Markdown-formatted descriptions. */ public class ProcessDescriptionParser { private static final Logger logger = Logger.getLogger(ProcessDescriptionParser.class.getName()); - // Regex patterns + // Regex patterns (flexible for plain text and Markdown) private static final Pattern TASK_PATTERN = Pattern.compile( "\\|-\\s*\\[Task:\\s*(\\d+)\\]\\s*(.+)$"); private static final Pattern EVENT_PATTERN = Pattern.compile( - "\\|--\\s*\\[Event:\\s*(\\d+)\\]\\s*([^(]+)\\s*\\([^)]*\\)\\s*-->\\s*\\[Task:\\s*(\\d+)\\]"); + "\\|--\\s*\\[Event:\\s*(\\d+)\\]\\s*(.+?)\\s*-->\\s*\\[Task:\\s*(\\d+)\\]"); + private static final Pattern TEAM_PATTERN = Pattern.compile( + "Team:\\s*(.+)$"); // Layout calculator private LayoutCalculator layoutCalculator = new LayoutCalculator(); @@ -76,6 +80,19 @@ public class ProcessDescriptionParser { } } + /** + * Removes Markdown formatting (**, *, etc.) from a string. + */ + private String cleanMarkdown(String text) { + if (text == null) + return null; + // Remove ** and * markers + String cleaned = text.replaceAll("\\*\\*", "").replaceAll("\\*", ""); + // Remove trailing comments like (Iteration für Korrekturen) + cleaned = cleaned.replaceAll("\\s*\\([^)]*\\)\\s*$", ""); + return cleaned.trim(); + } + /** * Parses the description file and creates all BPMN elements in the process. */ @@ -153,7 +170,7 @@ public class ProcessDescriptionParser { } currentTask = new TaskData( Integer.parseInt(taskMatcher.group(1)), - taskMatcher.group(2).trim()); + cleanMarkdown(taskMatcher.group(2))); taskDataList.add(currentTask); descBuilder = new StringBuilder(); readingDesc = false; @@ -161,9 +178,9 @@ public class ProcessDescriptionParser { } // Match team - if (trimmed.contains("Team:") && currentTask != null) { - int teamIndex = trimmed.indexOf("Team:"); - currentTask.team = trimmed.substring(teamIndex + 5).trim(); + Matcher teamMatcher = TEAM_PATTERN.matcher(trimmed); + if (teamMatcher.find() && currentTask != null) { + currentTask.team = cleanMarkdown(teamMatcher.group(1)); continue; } @@ -173,7 +190,7 @@ public class ProcessDescriptionParser { readingDesc = false; events.add(new EventData( Integer.parseInt(eventMatcher.group(1)), - eventMatcher.group(2).trim(), + cleanMarkdown(eventMatcher.group(2)), currentTask.id, Integer.parseInt(eventMatcher.group(3)))); continue; @@ -242,6 +259,7 @@ public class ProcessDescriptionParser { Event event = (Event) process.cloneBPMNElementNode(referenceEvent); event.setName(eventData.name); event.setPosition(new BPMNPoint(pos[0], pos[1])); + // Calculate activity ID: first event = 10, second = 20, etc. (per task) int eventIndex = getEventIndex(eventData.sourceTaskId, eventData.eventId); int activityId = (eventIndex + 1) * 10; diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParserClaude.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParserClaude.java new file mode 100644 index 0000000..4c0c1b6 --- /dev/null +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParserClaude.java @@ -0,0 +1,303 @@ +package ai.dynamixs.model.builder; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.openbpmn.bpmn.elements.Activity; +import org.openbpmn.bpmn.elements.BPMNProcess; +import org.openbpmn.bpmn.elements.Event; +import org.openbpmn.bpmn.elements.core.BPMNPoint; +import org.openbpmn.bpmn.exceptions.BPMNModelException; + +/** + * Parses a process description file and generates BPMN elements. Uses + * LayoutCalculator for positioning of elements. + */ +public class ProcessDescriptionParserClaude { + + private static final Logger logger = Logger.getLogger(ProcessDescriptionParser.class.getName()); + + // Regex patterns + private static final Pattern TASK_PATTERN = Pattern.compile( + "\\|-\\s*\\[Task:\\s*(\\d+)\\]\\s*(.+)$"); + private static final Pattern EVENT_PATTERN = Pattern.compile( + "\\|--\\s*\\[Event:\\s*(\\d+)\\]\\s*([^(]+)\\s*\\([^)]*\\)\\s*-->\\s*\\[Task:\\s*(\\d+)\\]"); + + // Layout calculator + private LayoutCalculator layoutCalculator = new LayoutCalculator(); + + // Storage for created elements + private Map tasks = new HashMap<>(); + private List events = new ArrayList<>(); + private Map taskLanes = new HashMap<>(); + private int sequenceFlowCounter = 1; + + /** + * Internal class to hold event data before creating BPMN elements. + */ + private static class EventData { + int eventId; + String name; + int sourceTaskId; + int targetTaskId; + + EventData(int eventId, String name, int sourceTaskId, int targetTaskId) { + this.eventId = eventId; + this.name = name; + this.sourceTaskId = sourceTaskId; + this.targetTaskId = targetTaskId; + } + + String getKey() { + return sourceTaskId + "_" + eventId; + } + } + + /** + * Simple data holder for tasks during parsing. + */ + private static class TaskData { + int id; + String name; + String description; + String team; + + TaskData(int id, String name) { + this.id = id; + this.name = name; + } + } + + /** + * Parses the description file and creates all BPMN elements in the process. + */ + public void parseAndGenerate(String filePath, BPMNProcess process, + Activity referenceTask, Event referenceEvent) throws IOException, BPMNModelException { + + tasks.clear(); + events.clear(); + taskLanes.clear(); + + // Parse file and collect task/event data + List taskDataList = parseFile(filePath); + + // Collect unique lanes (in order of first appearance) + List laneNames = new ArrayList<>(); + for (TaskData taskData : taskDataList) { + if (taskData.team != null && !laneNames.contains(taskData.team)) { + laneNames.add(taskData.team); + } + taskLanes.put(taskData.id, taskData.team); + } + + // Create BPMN lanes + for (String laneName : laneNames) { + process.addLane(laneName); + logger.info("Created lane: " + laneName); + } + + // Calculate layout + layoutCalculator.calculateLanePositions(laneNames); + + List taskIds = taskDataList.stream().map(t -> t.id).toList(); + layoutCalculator.calculateTaskPositions(taskIds, taskLanes); + + // Calculate layout for all events + for (EventData eventData : events) { + int eventIndex = getEventIndex(eventData.sourceTaskId, eventData.eventId); + String laneName = taskLanes.get(eventData.sourceTaskId); + layoutCalculator.calculateEventPosition(eventData.sourceTaskId, eventData.eventId, eventIndex, laneName); + } + + // Create BPMN tasks + createTasks(taskDataList, process, referenceTask); + + // Create BPMN events + Map createdEvents = createEvents(process, referenceEvent); + + // Create sequence flows + createSequenceFlows(process, createdEvents); + + logger.info("Generated " + tasks.size() + " tasks, " + createdEvents.size() + " events, " + laneNames.size() + + " lanes"); + } + + /** + * Parses the file and returns task data list. Also populates events list. + */ + private List parseFile(String filePath) throws IOException { + List taskDataList = new ArrayList<>(); + + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line; + TaskData currentTask = null; + StringBuilder descBuilder = new StringBuilder(); + boolean readingDesc = false; + + while ((line = reader.readLine()) != null) { + String trimmed = line.trim(); + + // Match task + Matcher taskMatcher = TASK_PATTERN.matcher(trimmed); + if (taskMatcher.find()) { + if (currentTask != null) { + currentTask.description = descBuilder.toString().trim(); + } + currentTask = new TaskData( + Integer.parseInt(taskMatcher.group(1)), + taskMatcher.group(2).trim()); + taskDataList.add(currentTask); + descBuilder = new StringBuilder(); + readingDesc = false; + continue; + } + + // Match team + if (trimmed.contains("Team:") && currentTask != null) { + int teamIndex = trimmed.indexOf("Team:"); + currentTask.team = trimmed.substring(teamIndex + 5).trim(); + continue; + } + + // Match event + Matcher eventMatcher = EVENT_PATTERN.matcher(trimmed); + if (eventMatcher.find() && currentTask != null) { + readingDesc = false; + events.add(new EventData( + Integer.parseInt(eventMatcher.group(1)), + eventMatcher.group(2).trim(), + currentTask.id, + Integer.parseInt(eventMatcher.group(3)))); + continue; + } + + // Description handling + if (trimmed.contains("Description:")) { + readingDesc = true; + continue; + } + + if (readingDesc && currentTask != null && !trimmed.startsWith("|--")) { + String descLine = trimmed.replaceAll("^\\|\\s*", "").trim(); + if (!descLine.isEmpty()) { + if (descBuilder.length() > 0) + descBuilder.append(" "); + descBuilder.append(descLine); + } + } + } + + if (currentTask != null) { + currentTask.description = descBuilder.toString().trim(); + } + } + + return taskDataList; + } + + /** + * Creates BPMN task elements. + */ + private void createTasks(List taskDataList, BPMNProcess process, + Activity referenceTask) throws BPMNModelException { + + for (TaskData taskData : taskDataList) { + double[] pos = layoutCalculator.getTaskPosition(taskData.id); + + Activity task = (Activity) process.cloneBPMNElementNode(referenceTask); + task.setName(taskData.name); + task.setPosition(new BPMNPoint(pos[0], pos[1])); + task.setAttribute("imixs:processid", String.valueOf(taskData.id)); + + if (taskData.description != null && !taskData.description.isEmpty()) { + task.setDocumentation(taskData.description); + } + + tasks.put(taskData.id, task); + logger.info("Created task: " + taskData.id + " - " + taskData.name); + } + } + + /** + * Creates BPMN event elements. + */ + private Map createEvents(BPMNProcess process, + Event referenceEvent) throws BPMNModelException { + + Map createdEvents = new HashMap<>(); + + for (EventData eventData : events) { + double[] pos = layoutCalculator.getEventPosition(eventData.sourceTaskId, eventData.eventId); + if (pos == null) + continue; + + Event event = (Event) process.cloneBPMNElementNode(referenceEvent); + event.setName(eventData.name); + event.setPosition(new BPMNPoint(pos[0], pos[1])); + // Calculate activity ID: first event = 10, second = 20, etc. (per task) + int eventIndex = getEventIndex(eventData.sourceTaskId, eventData.eventId); + int activityId = (eventIndex + 1) * 10; + event.setAttribute("imixs:activityid", String.valueOf(activityId)); + + createdEvents.put(eventData.getKey(), event); + logger.info("Created event: " + eventData.getKey() + " - " + eventData.name); + } + + return createdEvents; + } + + /** + * Creates sequence flows between tasks and events. + */ + private void createSequenceFlows(BPMNProcess process, + Map createdEvents) throws BPMNModelException { + + for (EventData eventData : events) { + Activity sourceTask = tasks.get(eventData.sourceTaskId); + Event event = createdEvents.get(eventData.getKey()); + Activity targetTask = tasks.get(eventData.targetTaskId); + + if (sourceTask == null || event == null || targetTask == null) + continue; + + if (eventData.sourceTaskId == eventData.targetTaskId) { + // Self-loop (CatchEvent): only sequence flow from event to task + process.addSequenceFlow("sf-" + sequenceFlowCounter++, event.getId(), targetTask.getId()); + } else { + // Normal flow: task -> event -> target task + process.addSequenceFlow("sf-" + sequenceFlowCounter++, sourceTask.getId(), event.getId()); + process.addSequenceFlow("sf-" + sequenceFlowCounter++, event.getId(), targetTask.getId()); + } + } + } + + /** + * Returns the index of an event among all events of a source task. + */ + private int getEventIndex(int taskId, int eventId) { + int index = 0; + for (EventData e : events) { + if (e.sourceTaskId == taskId) { + if (e.eventId == eventId) + return index; + index++; + } + } + return 0; + } + + /** + * Returns the layout calculator for configuration. + */ + public LayoutCalculator getLayoutCalculator() { + return layoutCalculator; + } +} \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParserGemini.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParserGemini.java new file mode 100644 index 0000000..813b9aa --- /dev/null +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/model/builder/ProcessDescriptionParserGemini.java @@ -0,0 +1,303 @@ +package ai.dynamixs.model.builder; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.openbpmn.bpmn.elements.Activity; +import org.openbpmn.bpmn.elements.BPMNProcess; +import org.openbpmn.bpmn.elements.Event; +import org.openbpmn.bpmn.elements.core.BPMNPoint; +import org.openbpmn.bpmn.exceptions.BPMNModelException; + +/** + * Parses a process description file and generates BPMN elements. Uses + * LayoutCalculator for positioning of elements. + */ +public class ProcessDescriptionParserGemini { + + private static final Logger logger = Logger.getLogger(ProcessDescriptionParser.class.getName()); + + // Regex patterns + private static final Pattern TASK_PATTERN = Pattern.compile( + "\\|-\\s*\\[Task:\\s*(\\d+)\\]\\s*(.+)$"); + private static final Pattern EVENT_PATTERN = Pattern.compile( + "\\|--\\s*\\[Event:\\s*(\\d+)\\]\\s*([^(]+)\\s*\\([^)]*\\)\\s*-->\\s*\\[Task:\\s*(\\d+)\\]"); + + // Layout calculator + private LayoutCalculator layoutCalculator = new LayoutCalculator(); + + // Storage for created elements + private Map tasks = new HashMap<>(); + private List events = new ArrayList<>(); + private Map taskLanes = new HashMap<>(); + private int sequenceFlowCounter = 1; + + /** + * Internal class to hold event data before creating BPMN elements. + */ + private static class EventData { + int eventId; + String name; + int sourceTaskId; + int targetTaskId; + + EventData(int eventId, String name, int sourceTaskId, int targetTaskId) { + this.eventId = eventId; + this.name = name; + this.sourceTaskId = sourceTaskId; + this.targetTaskId = targetTaskId; + } + + String getKey() { + return sourceTaskId + "_" + eventId; + } + } + + /** + * Simple data holder for tasks during parsing. + */ + private static class TaskData { + int id; + String name; + String description; + String team; + + TaskData(int id, String name) { + this.id = id; + this.name = name; + } + } + + /** + * Parses the description file and creates all BPMN elements in the process. + */ + public void parseAndGenerate(String filePath, BPMNProcess process, + Activity referenceTask, Event referenceEvent) throws IOException, BPMNModelException { + + tasks.clear(); + events.clear(); + taskLanes.clear(); + + // Parse file and collect task/event data + List taskDataList = parseFile(filePath); + + // Collect unique lanes (in order of first appearance) + List laneNames = new ArrayList<>(); + for (TaskData taskData : taskDataList) { + if (taskData.team != null && !laneNames.contains(taskData.team)) { + laneNames.add(taskData.team); + } + taskLanes.put(taskData.id, taskData.team); + } + + // Create BPMN lanes + for (String laneName : laneNames) { + process.addLane(laneName); + logger.info("Created lane: " + laneName); + } + + // Calculate layout + layoutCalculator.calculateLanePositions(laneNames); + + List taskIds = taskDataList.stream().map(t -> t.id).toList(); + layoutCalculator.calculateTaskPositions(taskIds, taskLanes); + + // Calculate layout for all events + for (EventData eventData : events) { + int eventIndex = getEventIndex(eventData.sourceTaskId, eventData.eventId); + String laneName = taskLanes.get(eventData.sourceTaskId); + layoutCalculator.calculateEventPosition(eventData.sourceTaskId, eventData.eventId, eventIndex, laneName); + } + + // Create BPMN tasks + createTasks(taskDataList, process, referenceTask); + + // Create BPMN events + Map createdEvents = createEvents(process, referenceEvent); + + // Create sequence flows + createSequenceFlows(process, createdEvents); + + logger.info("Generated " + tasks.size() + " tasks, " + createdEvents.size() + " events, " + laneNames.size() + + " lanes"); + } + + /** + * Parses the file and returns task data list. Also populates events list. + */ + private List parseFile(String filePath) throws IOException { + List taskDataList = new ArrayList<>(); + + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line; + TaskData currentTask = null; + StringBuilder descBuilder = new StringBuilder(); + boolean readingDesc = false; + + while ((line = reader.readLine()) != null) { + String trimmed = line.trim(); + + // Match task + Matcher taskMatcher = TASK_PATTERN.matcher(trimmed); + if (taskMatcher.find()) { + if (currentTask != null) { + currentTask.description = descBuilder.toString().trim(); + } + currentTask = new TaskData( + Integer.parseInt(taskMatcher.group(1)), + taskMatcher.group(2).trim()); + taskDataList.add(currentTask); + descBuilder = new StringBuilder(); + readingDesc = false; + continue; + } + + // Match team + if (trimmed.contains("Team:") && currentTask != null) { + int teamIndex = trimmed.indexOf("Team:"); + currentTask.team = trimmed.substring(teamIndex + 5).trim(); + continue; + } + + // Match event + Matcher eventMatcher = EVENT_PATTERN.matcher(trimmed); + if (eventMatcher.find() && currentTask != null) { + readingDesc = false; + events.add(new EventData( + Integer.parseInt(eventMatcher.group(1)), + eventMatcher.group(2).trim(), + currentTask.id, + Integer.parseInt(eventMatcher.group(3)))); + continue; + } + + // Description handling + if (trimmed.contains("Description:")) { + readingDesc = true; + continue; + } + + if (readingDesc && currentTask != null && !trimmed.startsWith("|--")) { + String descLine = trimmed.replaceAll("^\\|\\s*", "").trim(); + if (!descLine.isEmpty()) { + if (descBuilder.length() > 0) + descBuilder.append(" "); + descBuilder.append(descLine); + } + } + } + + if (currentTask != null) { + currentTask.description = descBuilder.toString().trim(); + } + } + + return taskDataList; + } + + /** + * Creates BPMN task elements. + */ + private void createTasks(List taskDataList, BPMNProcess process, + Activity referenceTask) throws BPMNModelException { + + for (TaskData taskData : taskDataList) { + double[] pos = layoutCalculator.getTaskPosition(taskData.id); + + Activity task = (Activity) process.cloneBPMNElementNode(referenceTask); + task.setName(taskData.name); + task.setPosition(new BPMNPoint(pos[0], pos[1])); + task.setAttribute("imixs:processid", String.valueOf(taskData.id)); + + if (taskData.description != null && !taskData.description.isEmpty()) { + task.setDocumentation(taskData.description); + } + + tasks.put(taskData.id, task); + logger.info("Created task: " + taskData.id + " - " + taskData.name); + } + } + + /** + * Creates BPMN event elements. + */ + private Map createEvents(BPMNProcess process, + Event referenceEvent) throws BPMNModelException { + + Map createdEvents = new HashMap<>(); + + for (EventData eventData : events) { + double[] pos = layoutCalculator.getEventPosition(eventData.sourceTaskId, eventData.eventId); + if (pos == null) + continue; + + Event event = (Event) process.cloneBPMNElementNode(referenceEvent); + event.setName(eventData.name); + event.setPosition(new BPMNPoint(pos[0], pos[1])); + // Calculate activity ID: first event = 10, second = 20, etc. (per task) + int eventIndex = getEventIndex(eventData.sourceTaskId, eventData.eventId); + int activityId = (eventIndex + 1) * 10; + event.setAttribute("imixs:activityid", String.valueOf(activityId)); + + createdEvents.put(eventData.getKey(), event); + logger.info("Created event: " + eventData.getKey() + " - " + eventData.name); + } + + return createdEvents; + } + + /** + * Creates sequence flows between tasks and events. + */ + private void createSequenceFlows(BPMNProcess process, + Map createdEvents) throws BPMNModelException { + + for (EventData eventData : events) { + Activity sourceTask = tasks.get(eventData.sourceTaskId); + Event event = createdEvents.get(eventData.getKey()); + Activity targetTask = tasks.get(eventData.targetTaskId); + + if (sourceTask == null || event == null || targetTask == null) + continue; + + if (eventData.sourceTaskId == eventData.targetTaskId) { + // Self-loop (CatchEvent): only sequence flow from event to task + process.addSequenceFlow("sf-" + sequenceFlowCounter++, event.getId(), targetTask.getId()); + } else { + // Normal flow: task -> event -> target task + process.addSequenceFlow("sf-" + sequenceFlowCounter++, sourceTask.getId(), event.getId()); + process.addSequenceFlow("sf-" + sequenceFlowCounter++, event.getId(), targetTask.getId()); + } + } + } + + /** + * Returns the index of an event among all events of a source task. + */ + private int getEventIndex(int taskId, int eventId) { + int index = 0; + for (EventData e : events) { + if (e.sourceTaskId == taskId) { + if (e.eventId == eventId) + return index; + index++; + } + } + return 0; + } + + /** + * Returns the layout calculator for configuration. + */ + public LayoutCalculator getLayoutCalculator() { + return layoutCalculator; + } +} \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/java/ai/dynamixs/website/SVGConverter.java b/dynamixs-ai-app/src/test/java/ai/dynamixs/website/SVGConverter.java new file mode 100644 index 0000000..86fa2e7 --- /dev/null +++ b/dynamixs-ai-app/src/test/java/ai/dynamixs/website/SVGConverter.java @@ -0,0 +1,597 @@ +package ai.dynamixs.website; + +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +/** + * This class loads an SVG file and performs various cleanup and color + * replacement operations to create background textures in different color + * variants. + */ +public class SVGConverter { + + private static Logger logger = Logger.getLogger(SVGConverter.class.getName()); + + // Color variants for different themes + private static final String COLOR_DEFAULT = "#ffffff24"; + private static final String COLOR_DARK = "#00000024"; + private static final String COLOR_LIGHT = "#ffffff0a"; + + // Scale factor for the SVG output + private static final double SCALE_FACTOR = 1.5; + + // Current target color (set during conversion) + private String targetColor; + + /** + * Loads an SVG file and generates three color variants. + */ + @Test + public void convertSVG() { + String input = "src/test/resources/website/background-001.svg"; + String outputBase = "src/test/resources/website/background-001"; + + // Generate all three variants + convertWithColor(input, outputBase + "_default.svg", COLOR_DEFAULT); + convertWithColor(input, outputBase + "_dark.svg", COLOR_DARK); + convertWithColor(input, outputBase + "_light.svg", COLOR_LIGHT); + } + + /** + * Converts an SVG file with a specific target color. + * + * @param input the input SVG file path + * @param output the output SVG file path + * @param color the target color to use + */ + private void convertWithColor(String input, String output, String color) { + try { + this.targetColor = color; + logger.info("Converting SVG with color: " + color); + + // Load the SVG file + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(new File(input)); + + // Get the root SVG element + Element svgRoot = document.getDocumentElement(); + + // Remove the style attribute from root element + if (svgRoot.hasAttribute("style")) { + svgRoot.removeAttribute("style"); + logger.info("Removed 'style' attribute from SVG root element"); + } + // Scale the SVG to 150% + scaleSVG(svgRoot, SCALE_FACTOR); + + // Remove grid pattern and its usage + removeGridPattern(document); + + // Replace colors in all element types + replaceTaskNodeColors(document); + replaceBPMNLabelColors(document); + replaceEdgeColors(document); + replaceDataElementColors(document); + replaceEventColors(document); + + // Save the modified SVG to output file + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + DOMSource source = new DOMSource(document); + StreamResult result = new StreamResult(new File(output)); + transformer.transform(source, result); + + logger.info("...svg converted successful: " + output); + + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } + + /** + * Removes the background grid pattern definition and all rect elements that + * reference it. + */ + private void removeGridPattern(Document document) { + List elementsToRemove = new ArrayList<>(); + + NodeList patterns = document.getElementsByTagName("pattern"); + for (int i = 0; i < patterns.getLength(); i++) { + Element pattern = (Element) patterns.item(i); + String id = pattern.getAttribute("id"); + if (id != null && id.startsWith("bpmn-grid-root")) { + elementsToRemove.add(pattern); + logger.info("Found grid pattern to remove: " + id); + + NodeList rects = document.getElementsByTagName("rect"); + for (int j = 0; j < rects.getLength(); j++) { + Element rect = (Element) rects.item(j); + String fill = rect.getAttribute("fill"); + if (fill != null && fill.equals("url(#" + id + ")")) { + elementsToRemove.add(rect); + logger.info("Found rect using grid pattern to remove"); + } + } + } + } + + for (Element element : elementsToRemove) { + element.getParentNode().removeChild(element); + } + + logger.info("Removed " + elementsToRemove.size() + " grid-related elements"); + } + + /** + * Replaces colors in task node elements. + */ + private void replaceTaskNodeColors(Document document) { + int pathCount = 0; + int textCount = 0; + + NodeList groups = document.getElementsByTagName("g"); + for (int i = 0; i < groups.getLength(); i++) { + Element group = (Element) groups.item(i); + String className = group.getAttribute("class"); + + if (className != null && className.contains("node") && className.contains("task")) { + + NodeList paths = group.getElementsByTagName("path"); + for (int j = 0; j < paths.getLength(); j++) { + Element path = (Element) paths.item(j); + String pathClass = path.getAttribute("class"); + + if (pathClass != null && pathClass.contains("sprotty-node")) { + String style = path.getAttribute("style"); + if (style != null && !style.isEmpty()) { + String newStyle = replaceStyleColors(style); + path.setAttribute("style", newStyle); + pathCount++; + } + } + } + + NodeList texts = group.getElementsByTagName("text"); + for (int j = 0; j < texts.getLength(); j++) { + Element text = (Element) texts.item(j); + String style = text.getAttribute("style"); + if (style != null && !style.isEmpty()) { + String newStyle = replaceTextFillColor(style); + text.setAttribute("style", newStyle); + textCount++; + } + } + } + } + + logger.info("Replaced colors in " + pathCount + " task node path elements"); + logger.info("Replaced colors in " + textCount + " task node text elements"); + } + + /** + * Parses a CSS style string and replaces fill and stroke colors. + */ + private String replaceStyleColors(String style) { + StringBuilder newStyle = new StringBuilder(); + + String[] properties = style.split(";"); + for (String property : properties) { + property = property.trim(); + if (property.isEmpty()) { + continue; + } + + int colonIndex = property.indexOf(':'); + if (colonIndex == -1) { + continue; + } + + String name = property.substring(0, colonIndex).trim(); + String value = property.substring(colonIndex + 1).trim(); + + if (name.equals("fill")) { + value = "transparent"; + } else if (name.equals("stroke")) { + value = targetColor; + } + + if (newStyle.length() > 0) { + newStyle.append(" "); + } + newStyle.append(name).append(": ").append(value).append(";"); + } + + return newStyle.toString(); + } + + /** + * Replaces colors in BPMNLabel elements. + */ + private void replaceBPMNLabelColors(Document document) { + int count = 0; + + NodeList groups = document.getElementsByTagName("g"); + for (int i = 0; i < groups.getLength(); i++) { + Element group = (Element) groups.item(i); + String className = group.getAttribute("class"); + + if (className != null && className.contains("BPMNLabel")) { + + NodeList texts = group.getElementsByTagName("text"); + for (int j = 0; j < texts.getLength(); j++) { + Element text = (Element) texts.item(j); + String textClass = text.getAttribute("class"); + + if (textClass != null && textClass.contains("sprotty-label")) { + String style = text.getAttribute("style"); + if (style != null && !style.isEmpty()) { + String newStyle = replaceTextFillColor(style); + text.setAttribute("style", newStyle); + count++; + } + } + } + } + } + + logger.info("Replaced colors in " + count + " BPMNLabel text elements"); + } + + /** + * Parses a CSS style string and replaces only the fill color (for text + * elements). + */ + private String replaceTextFillColor(String style) { + StringBuilder newStyle = new StringBuilder(); + + String[] properties = style.split(";"); + for (String property : properties) { + property = property.trim(); + if (property.isEmpty()) { + continue; + } + + int colonIndex = property.indexOf(':'); + if (colonIndex == -1) { + continue; + } + + String name = property.substring(0, colonIndex).trim(); + String value = property.substring(colonIndex + 1).trim(); + + if (name.equals("fill")) { + value = targetColor; + } + + if (newStyle.length() > 0) { + newStyle.append(" "); + } + newStyle.append(name).append(": ").append(value).append(";"); + } + + return newStyle.toString(); + } + + /** + * Replaces colors in edge elements (sequenceFlow, association, etc.). + */ + private void replaceEdgeColors(Document document) { + int groupCount = 0; + int arrowCount = 0; + int textCount = 0; + + NodeList groups = document.getElementsByTagName("g"); + for (int i = 0; i < groups.getLength(); i++) { + Element group = (Element) groups.item(i); + String className = group.getAttribute("class"); + + if (className != null && className.contains("sprotty-edge") && className.contains("bpmnedge")) { + + String groupStyle = group.getAttribute("style"); + if (groupStyle != null && !groupStyle.isEmpty()) { + String newStyle = replaceStrokeColor(groupStyle); + group.setAttribute("style", newStyle); + groupCount++; + } + + NodeList paths = group.getElementsByTagName("path"); + for (int j = 0; j < paths.getLength(); j++) { + Element path = (Element) paths.item(j); + String pathClass = path.getAttribute("class"); + + if (pathClass != null && pathClass.contains("arrow")) { + String style = path.getAttribute("style"); + if (style != null && !style.isEmpty()) { + String newStyle = replaceTextFillColor(style); + path.setAttribute("style", newStyle); + arrowCount++; + } + } + } + + NodeList texts = group.getElementsByTagName("text"); + for (int j = 0; j < texts.getLength(); j++) { + Element text = (Element) texts.item(j); + String style = text.getAttribute("style"); + if (style != null && !style.isEmpty()) { + String newStyle = replaceTextFillColor(style); + text.setAttribute("style", newStyle); + textCount++; + } + } + } + } + + logger.info("Replaced colors in " + groupCount + " edge groups"); + logger.info("Replaced colors in " + arrowCount + " edge arrows"); + logger.info("Replaced colors in " + textCount + " edge text elements"); + } + + /** + * Parses a CSS style string and replaces only the stroke color. + */ + private String replaceStrokeColor(String style) { + StringBuilder newStyle = new StringBuilder(); + + String[] properties = style.split(";"); + for (String property : properties) { + property = property.trim(); + if (property.isEmpty()) { + continue; + } + + int colonIndex = property.indexOf(':'); + if (colonIndex == -1) { + continue; + } + + String name = property.substring(0, colonIndex).trim(); + String value = property.substring(colonIndex + 1).trim(); + + if (name.equals("stroke")) { + value = targetColor; + } + + if (newStyle.length() > 0) { + newStyle.append(" "); + } + newStyle.append(name).append(": ").append(value).append(";"); + } + + return newStyle.toString(); + } + + /** + * Replaces colors in dataStoreReference and dataObject elements. + */ + private void replaceDataElementColors(Document document) { + int count = 0; + + NodeList groups = document.getElementsByTagName("g"); + for (int i = 0; i < groups.getLength(); i++) { + Element group = (Element) groups.item(i); + String className = group.getAttribute("class"); + + if (className != null && (className.contains("dataStoreReference") || className.contains("dataObject"))) { + + NodeList paths = group.getElementsByTagName("path"); + for (int j = 0; j < paths.getLength(); j++) { + Element path = (Element) paths.item(j); + + String stroke = path.getAttribute("stroke"); + if (stroke != null && stroke.equals("currentColor")) { + path.setAttribute("stroke", targetColor); + count++; + } + + String style = path.getAttribute("style"); + if (style != null && !style.isEmpty()) { + String newStyle = replaceAllColors(style); + path.setAttribute("style", newStyle); + } + } + + NodeList ellipses = group.getElementsByTagName("ellipse"); + for (int j = 0; j < ellipses.getLength(); j++) { + Element ellipse = (Element) ellipses.item(j); + + String stroke = ellipse.getAttribute("stroke"); + if (stroke != null && stroke.equals("currentColor")) { + ellipse.setAttribute("stroke", targetColor); + count++; + } + } + } + } + + logger.info("Replaced colors in " + count + " data element shapes"); + } + + /** + * Parses a CSS style string and replaces both fill and stroke colors. + */ + private String replaceAllColors(String style) { + StringBuilder newStyle = new StringBuilder(); + + String[] properties = style.split(";"); + for (String property : properties) { + property = property.trim(); + if (property.isEmpty()) { + continue; + } + + int colonIndex = property.indexOf(':'); + if (colonIndex == -1) { + continue; + } + + String name = property.substring(0, colonIndex).trim(); + String value = property.substring(colonIndex + 1).trim(); + + if (name.equals("fill") && !value.equals("none")) { + value = targetColor; + } else if (name.equals("stroke") && !value.equals("none")) { + value = targetColor; + } + + if (newStyle.length() > 0) { + newStyle.append(" "); + } + newStyle.append(name).append(": ").append(value).append(";"); + } + + return newStyle.toString(); + } + + /** + * Replaces colors in event elements (startEvent, endEvent, etc.). + */ + private void replaceEventColors(Document document) { + int circleCount = 0; + int symbolCount = 0; + + NodeList groups = document.getElementsByTagName("g"); + for (int i = 0; i < groups.getLength(); i++) { + Element group = (Element) groups.item(i); + String className = group.getAttribute("class"); + + if (className != null && className.contains("event") && !className.contains("BPMNLabel")) { + + NodeList circles = group.getElementsByTagName("circle"); + for (int j = 0; j < circles.getLength(); j++) { + Element circle = (Element) circles.item(j); + String circleClass = circle.getAttribute("class"); + + if (circleClass != null && circleClass.contains("sprotty-node")) { + String style = circle.getAttribute("style"); + if (style != null && !style.isEmpty()) { + String newStyle = replaceEventCircleStyle(style); + circle.setAttribute("style", newStyle); + circleCount++; + } + } + } + + NodeList symbolGroups = group.getElementsByTagName("g"); + for (int j = 0; j < symbolGroups.getLength(); j++) { + Element symbolGroup = (Element) symbolGroups.item(j); + String symbolClass = symbolGroup.getAttribute("class"); + + if (symbolClass != null && symbolClass.contains("symbol")) { + NodeList paths = symbolGroup.getElementsByTagName("path"); + for (int k = 0; k < paths.getLength(); k++) { + Element path = (Element) paths.item(k); + String style = path.getAttribute("style"); + if (style != null && !style.isEmpty()) { + String newStyle = replaceTextFillColor(style); + path.setAttribute("style", newStyle); + symbolCount++; + } + } + } + } + } + } + + logger.info("Replaced colors in " + circleCount + " event circles"); + logger.info("Replaced colors in " + symbolCount + " event symbols"); + } + + /** + * Parses a CSS style string for event circles. Sets fill to transparent and + * stroke to targetColor. Ensures stroke-width is visible (at least 2px). + */ + private String replaceEventCircleStyle(String style) { + StringBuilder newStyle = new StringBuilder(); + boolean hasStrokeWidth = false; + + String[] properties = style.split(";"); + for (String property : properties) { + property = property.trim(); + if (property.isEmpty()) { + continue; + } + + int colonIndex = property.indexOf(':'); + if (colonIndex == -1) { + continue; + } + + String name = property.substring(0, colonIndex).trim(); + String value = property.substring(colonIndex + 1).trim(); + + if (name.equals("fill")) { + value = "transparent"; + } else if (name.equals("stroke")) { + value = targetColor; + } else if (name.equals("stroke-width")) { + hasStrokeWidth = true; + if (value.equals("0px") || value.equals("0")) { + value = "2px"; + } + } + + if (newStyle.length() > 0) { + newStyle.append(" "); + } + newStyle.append(name).append(": ").append(value).append(";"); + } + + if (!hasStrokeWidth) { + newStyle.append(" stroke-width: 2px;"); + } + + return newStyle.toString(); + } + + /** + * Scales the SVG content by adjusting the viewBox. A smaller viewBox means the + * content appears larger. + * + * @param svgRoot the root SVG element + * @param scaleFactor the scale factor (e.g., 1.5 for 150%) + */ + private void scaleSVG(Element svgRoot, double scaleFactor) { + // Adjust viewBox to scale content (divide by scale factor to make content + // larger) + String viewBox = svgRoot.getAttribute("viewBox"); + if (viewBox != null && !viewBox.isEmpty()) { + String[] parts = viewBox.split("\\s+"); + if (parts.length == 4) { + double minX = Double.parseDouble(parts[0]); + double minY = Double.parseDouble(parts[1]); + double width = Double.parseDouble(parts[2]); + double height = Double.parseDouble(parts[3]); + + // Divide by scale factor - smaller viewBox = larger content + double newWidth = width / scaleFactor; + double newHeight = height / scaleFactor; + + String newViewBox = String.format("%.0f %.0f %.0f %.0f", minX, minY, newWidth, newHeight); + svgRoot.setAttribute("viewBox", newViewBox); + logger.info("Scaled viewBox: " + viewBox + " -> " + newViewBox); + } + } + + // Keep width and height as original (or remove them for responsive sizing) + // The viewBox change alone will scale the content + } +} \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/resources/contract-de-1.0.0.bpmn b/dynamixs-ai-app/src/test/resources/contract-de-1.0.0.bpmn new file mode 100644 index 0000000..85d0836 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/contract-de-1.0.0.bpmn @@ -0,0 +1,583 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + StartEvent_1 + EndEvent_2 + task_yrC2dw + event_J0JjAg + event_1FAZgA + event_cjoSqg + gateway_SVo89A + event_5P6uhg + + + + task_0W5Llw + event_0k30Ug + task_vJ0eNA + + + + task_GgAr6w + event_zpkT5A + event_v7oUjw + + + + + + + + sequenceFlow_mCJiSA + + + + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-5 + sequenceFlow_mCJiSA + sf-8 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sequenceFlow_4076SQ + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-44 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-4 + sf-9 + sf-45 + + + + sf-4 + + + + sf-5 + + + + sf-6 + sequenceFlow_4076SQ + + + + sequenceFlow_Jp2oQQ + sf-9 + + + + + + + + + + + + + + + + + + + + + + sf-44 + sf-45 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-8 + sequenceFlow_Jp2oQQ + sf-6 + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynamixs-ai-app/src/test/resources/contract.txt b/dynamixs-ai-app/src/test/resources/contract.txt new file mode 100644 index 0000000..83d71ac --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/contract.txt @@ -0,0 +1,144 @@ +START + | + |- [Task: 2000] **New Contract Request** + Team: **Contract Management** + Description: + Ein neuer Vertragsanfrag wird eingereicht (z. B. durch Vertrieb oder Einkauf). Grundlegende Daten wie Vertragstyp (Kauf/Verkauf/Leasing) und Verantwortlicher müssen erfasst werden. + |-- [Event: 10] **Forward to Contract Creation** --> [Task: 2100] **Contract Creation** + |-- [Event: 20] **Reject Request** --> [Task: 2990] **Request Rejected** + + | + |- [Task: 2100] **Contract Creation** + Team: **Contract Management** + Description: + Erstellung eines neuen Vertrags mit folgenden Pflichtfeldern: + - **Vertragspartner** (Name, Adresse, Kontaktdaten, Vertragsnummer) + - **Waren/Lieferungen** (Beschreibung, Menge, Einheit, Preis pro Einheit, Gesamtpreis, ggf. SKU/Artikelnummer) + - **Lagerort** (falls relevant: Lagerstandort, Lagerverantwortlicher) + - **Termine** (Liefertermin(e), Vertragslaufzeit, Fristen für Zahlungen/Meldungen) + Optional: **Sonderbedingungen** (z. B. Rabatte, Penalties, Zahlungsmodalitäten). + |-- [Event: 10] **Save Draft** --> [Task: 2100] **Contract Creation** *(Iteration für Korrekturen)* + |-- [Event: 20] **Submit for Review** --> [Task: 2200] **Legal Review** + |-- [Event: 30] **Cancel Request** --> [Task: 2990] **Request Rejected** + + | + |- [Task: 2200] **Legal Review** + Team: **Legal/Compliance** + Description: + Prüfung auf rechtliche Korrektheit und Vollständigkeit: + - Vertragsklauseln (AGB, Gewährleistungen, Haftung) + - Compliance mit internen Richtlinien (z. B. Risikobewertung bei neuen Partnern) + - Terminpläne (z. B. Prüfung von Fristen) + |-- [Event: 10] **Request Changes** --> [Task: 2100] **Contract Creation** *(Rückgabe zur Korrektur)* + |-- [Event: 20] **Approve Contract** --> [Task: 2300] **Approval by Management** + |-- [Event: 30] **Reject Contract** --> [Task: 2990] **Contract Rejected** + + | + |- [Task: 2300] **Approval by Management** + Team: **Senior Management/Finance** + Description: + Freigabe des Vertrags unter Berücksichtigung: + - **Finanzielle Auswirkungen** (Budget, Liquidität, Forecast) + - **Strategische Bedeutung** (Neukunde, Langfristpartner) + - **Risikoanalyse** (Bonität des Partners, Marktrisiken) + |-- [Event: 10] **Request Adjustments** --> [Task: 2100] **Contract Creation** *(z. B. Preisanpassung)* + |-- [Event: 20] **Final Approval** --> [Task: 2400] **Contract Execution** + |-- [Event: 30] **Decline Approval** --> [Task: 2990] **Contract Rejected** + + | + |- [Task: 2400] **Contract Execution** + Team: **Contract Management / Operations** + Description: + **Finaler Schritt zur Vertragsaktivierung:** + - **Vertragsunterzeichnung** (digital/physisch) durch beide Parteien. + - **Datenaktualisierung im System**: + - **Vertragspartner** → CRM/ERP (z. B. SAP, Salesforce). + - **Waren/Lieferungen** → Lagerverwaltung/Logistik (z. B. Warehouse-Management-System). + - **Termine** → Kalender/Projektmanagement (z. B. Microsoft Project, Jira). + - **Finanzen** → Buchhaltung (Rechnungslauf, Zahlungspläne). + - **Lagerort** → Bei physischen Gütern: Einlagerung und Zuordnung (z. B. per Barcode). + |-- [Event: 10] **Contract Signed** --> [Task: 2500] **Post-Contract Setup** + |-- [Event: 20] **Execution Failed** --> [Task: 2990] **Contract Rejected** *(z. B. Unterzeichnung gescheitert)* + + | + |- [Task: 2500] **Post-Contract Setup** + Team: **Cross-Functional (Logistik, Sales, Finance)** + Description: + **Nachbereitung nach Vertragsunterzeichnung:** + - **Logistik**: + - Lagerbestände anpassen (bei Lieferverträgen). + - Lieferpläne erstellen (Termine, Routen, Verantwortliche). + - **Vertrieb**: + - Kundenkommunikation (Bestätigungsmail, nächste Schritte). + - **Finanzen**: + - Zahlungsbedingungen konfigurieren (z. B. Skonto, Raten). + - Budgetreservierungen freigeben. + - **Monitoring**: + - **KPIs** festlegen (z. B. Liefertreue, Zahlungseingänge). + - **Audit-Trail** für Nachverfolgung. + |-- [Event: 10] **Setup Completed** --> [Task: 2600] **Contract Active** + |-- [Event: 20] **Correction Needed** --> [Task: 2400] **Contract Execution** *(z. B. Lagerfehler korrigieren)* + + | + |- [Task: 2600] **Contract Active** + Team: **Contract Owner (z. B. Account Manager)** + Description: + **Laufender Vertrag:** + - **Regelmäßige Überprüfungen**: + - Terminpläne (Lieferungen, Zahlungen, Kündigungsfristen). + - Performance des Partners (z. B. Lieferzuverlässigkeit). + - **Änderungsmanagement**: + - Anpassungen (z. B. Mengenänderungen, Preisanpassungen) müssen neu freigegeben werden (→ Rückkehr zu [Task: 2100]). + |-- [Event: 10] **Renewal Due** --> [Task: 2700] **Contract Renewal** + |-- [Event: 20] **Termination Requested** --> [Task: 2900] **Contract Termination** + |-- [Event: 30] **Escalation** --> [Task: 2800] **Contract Dispute** + + | + |- [Task: 2700] **Contract Renewal** + Team: **Contract Management / Sales** + Description: + **Vertragsverlängerung/Anpassung:** + - Analyse der Vertragsperformance (z. B. Umsatz, Partnerzufriedenheit). + - Angebot für Verlängerung oder neue Bedingungen erstellen. + - Prozess wie [Task: 2100] **Contract Creation** wiederholen. + |-- [Event: 10] **Renewal Approved** --> [Task: 2600] **Contract Active** + |-- [Event: 20] **Renewal Rejected** --> [Task: 2900] **Contract Termination** + + | + |- [Task: 2800] **Contract Dispute** + Team: **Legal / Dispute Resolution** + Description: + **Konfliktmanagement:** + - Ursache analysieren (z. B. nicht erfüllte Liefertermine, Preisstreitigkeiten). + - Mediation oder rechtliche Schritte einleiten. + - Bei Einigung: Anpassung des Vertrags ([Task: 2100]). + - Bei Scheitern: [Task: 2900] **Contract Termination**. + |-- [Event: 10] **Dispute Resolved** --> [Task: 2600] **Contract Active** + |-- [Event: 20] **Termination Due to Dispute** --> [Task: 2900] **Contract Termination** + + | + |- [Task: 2900] **Contract Termination** + Team: **Contract Management / Legal** + Description: + **Vertragsbeendigung:** + - Kündigungsfristen einhalten. + - **Liquidation**: + - Offene Rechnungen prüfen (Zahlungseingang/Stornierung). + - Lagerbestände bereinigen (Rücklieferung/Rücknahme). + - **Dokumentation**: + - Grund der Kündigung festhalten (für zukünftige Entscheidungen). + - Vertrag aus dem System löschen. + |-- [Event: 10] **Termination Completed** --> [Task: 2990] **Process Ended** + + | + |- [Task: 2990] **Request/Contract Rejected** + Team: **Contract Management** + Description: + **Abgelehter Vertrag oder Anfrage:** + - Grund für die Ablehnung dokumentieren (z. B. "Partner nicht solvent"). + - Feedback an Initiator geben. + |-- [Event: 10] **Close Case** --> END + + | + |- END + Description: **Workflow abgeschlossen** (Vertrag aktiv, beendet oder abgelehnt). \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/resources/process-description.txt b/dynamixs-ai-app/src/test/resources/process-description.txt index a7caf51..1399d9c 100644 --- a/dynamixs-ai-app/src/test/resources/process-description.txt +++ b/dynamixs-ai-app/src/test/resources/process-description.txt @@ -1,73 +1,78 @@ -Business Process: Supplier Compliance Check +Business Process: Risk Management START | - |- [Task: 2000] Supplier Data Input - | Team: Purchasing + |- [Task: 1000] Risk Identification + | Team: Risk Owner (Operational Unit) | Description: - | A new potential supplier needs to be checked for compliance. All relevant data (e.g., company details, location, product category) is initially entered or imported into the system. - | |-- [Event: 10] Submit for Initial Check (Data complete) --> [Task: 2100] Initial Compliance Screening - | |-- [Event: 20] Hold (Data incomplete/waiting for further information) --> [Task: 2000] Supplier Data Input + | A potential risk has been identified within an operational unit. The Risk Owner captures basic data (Category, Description, Early Warning Indicators) to initiate the process in accordance with KonTraG. + | |-- [Event: 10] Submit Proposal (Forward to Central Risk Management) --> [Task: 1100] Validation + | |-- [Event: 20] Discard (Draft deleted) --> [Task: 1990] Deleted | - |- [Task: 2100] Initial Compliance Screening - | Team: Compliance Department + |- [Task: 1100] Validation + | Team: Central Risk Management | Description: - | The Compliance Department performs an automated and manual screening based on external and internal blacklists, sanctions lists, and basic regulatory requirements. - | |-- [Event: 10] Cleared for DDQ (Initial screening passed) --> [Task: 2200] Send Due Diligence Questionnaire (DDQ) - | |-- [Event: 20] Needs Manual Review (Potential red flags found, requires in-depth investigation) --> [Task: 2150] Detailed Compliance Review - | |-- [Event: 30] Immediate Reject (Severe red flag or sanction match) --> [Task: 2900] Rejected + | Central function checks if the identified issued qualifies as a relevant risk or if it is a duplicate. + | |-- [Event: 10] Confirm Risk (Risk is valid, proceed to assessment) --> [Task: 1200] Gross Assessment + | |-- [Event: 20] Reject (Not a risk or duplicate) --> [Task: 1900] Archived + | |-- [Event: 30] Request Info (Send back to Owner for details) --> [Task: 1000] Risk Identification | - |- [Task: 2150] Detailed Compliance Review - | Team: Compliance Department + |- [Task: 1200] Gross Assessment + | Team: Risk Owner (Operational Unit) | Description: - | Manual and in-depth investigation of potential risks identified during the initial screening. This involves checking public records and specific compliance databases. - | |-- [Event: 10] Cleared for DDQ (Review successful) --> [Task: 2200] Send Due Diligence Questionnaire (DDQ) - | |-- [Event: 20] Request More Info (Information is missing from supplier) --> [Task: 2250] Wait for Supplier Response - | |-- [Event: 30] Final Reject (Risk confirmed after review) --> [Task: 2900] Rejected + | Quantitative assessment of the risk WITHOUT considering planned or existing measures. Impact and Probability are estimated to determine the Gross Risk Score. + | |-- [Event: 10] Save Gross Data (Proceed to Measure Definition) --> [Task: 1300] Measure Definition | - |- [Task: 2200] Send Due Diligence Questionnaire (DDQ) - | Team: Compliance Department + |- [Task: 1300] Measure Definition + | Team: Risk Owner (Operational Unit) | Description: - | The system automatically sends the Due Diligence Questionnaire (DDQ) to the supplier's contact person. - | |-- [Event: 10] DDQ Sent (Waiting for supplier response) --> [Task: 2250] Wait for Supplier Response + | Definition of risk mitigating measures (Avoid, Reduce, Transfer, Accept). Documentation of costs and responsibilities for these measures. + | |-- [Event: 10] Measures Defined (Proceed to Net Assessment) --> [Task: 1400] Net Assessment + | |-- [Event: 20] Update Assessment (Go back to Gross Assessment) --> [Task: 1200] Gross Assessment | - |- [Task: 2250] Wait for Supplier Response - | Team: System / Purchasing + |- [Task: 1400] Net Assessment + | Team: Risk Owner (Operational Unit) | Description: - | The process waits for the supplier to submit the completed DDQ. Automated reminders are sent if the deadline approaches. - | |-- [Event: 10] DDQ Received (Supplier submitted the questionnaire) --> [Task: 2300] Review DDQ - | |-- [Event: 20] Send Reminder (Automated or manual reminder sent) --> [Task: 2250] Wait for Supplier Response - | |-- [Event: 30] Timeout (DDQ not received within the deadline) --> [Task: 2900] Rejected + | Re-evaluation of Impact and Probability taking the defined measures into account (Residual Risk). Crucial for IDW PS 340 compliance. + | |-- [Event: 10] Submit for Aggregation (Forward to Central RM) --> [Task: 1500] Aggregation & Analysis | - |- [Task: 2300] Review DDQ - | Team: Compliance Department + |- [Task: 1500] Aggregation & Analysis + | Team: Central Risk Management | Description: - | Compliance checks the submitted DDQ for completeness and verifies the provided answers. - | |-- [Event: 10] Accept DDQ (All questions answered and satisfactory) --> [Task: 2400] Final Approval - | |-- [Event: 20] Request Clarification (Follow-up questions needed for specific answers) --> [Task: 2250] Wait for Supplier Response - | |-- [Event: 30] Reject DDQ (High compliance risk identified in answers) --> [Task: 2900] Rejected + | The risk is analyzed in the context of the total risk portfolio (Risk Aggregation/Monte Carlo Simulation) to check against the company's Risk Bearing Capacity. + | |-- [Event: 10] Approve (Risk within appetite, standard monitoring) --> [Task: 1600] Monitoring + | |-- [Event: 20] Insufficient Mitigation (Measures not enough, send back) --> [Task: 1300] Measure Definition + | |-- [Event: 30] Critical Escalation (Threat to existence, forward to Board) --> [Task: 1550] Board Review | - |- [Task: 2400] Final Approval - | Team: Compliance Management + |- [Task: 1550] Board Review + | Team: Management Board / Risk Committee | Description: - | Final sign-off by Compliance Management based on the DDQ and all previous screenings. - | |-- [Event: 10] Approved (Supplier cleared for onboarding) --> [Task: 2800] Approved - | |-- [Event: 20] Rejected (Compliance risk too high) --> [Task: 2900] Rejected + | High-level decision required. Risk exceeds risk bearing capacity or is a "bestandsgefährdendes Risiko" (§91 Abs. 2 AktG). + | |-- [Event: 10] Accept Risk (Special approval granted) --> [Task: 1600] Monitoring + | |-- [Event: 20] Demand Action (Force new measures) --> [Task: 1300] Measure Definition | - |- [Task: 2800] Approved - | Team: Purchasing + |- [Task: 1600] Monitoring + | Team: Risk Owner (Operational Unit) | Description: - | Supplier compliance check completed and approved. Supplier status is updated, and the process moves to supplier onboarding (e.g., contract negotiation). - | |-- [Event: 10] Close Process (Compliance status recorded) --> [Task: 2990] Completed + | Continuous surveillance of the risk and the effectiveness of measures. Periodic review (e.g., quarterly). + | |-- [Event: 10] Report: No Change (Keep monitoring) --> [Task: 1600] Monitoring + | |-- [Event: 20] Risk Changed (Values or measures changed) --> [Task: 1200] Gross Assessment + | |-- [Event: 30] Risk Obsolete (Risk no longer exists) --> [Task: 1800] Closure Review | - |- [Task: 2900] Rejected - | Team: Compliance Department + |- [Task: 1800] Closure Review + | Team: Central Risk Management | Description: - | The supplier was rejected at a specific stage due to non-compliance issues. Purchasing is notified. - | |-- [Event: 10] Add Comment --> [Task: 2900] Rejected - | |-- [Event: 20] Close Process (Rejection reason recorded) --> [Task: 2990] Completed + | Final check if the risk can really be closed. + | |-- [Event: 10] Close Risk (Archive) --> [Task: 1900] Archived + | |-- [Event: 20] Deny Closure (Keep active) --> [Task: 1600] Monitoring | - END + |- [Task: 1900] Archived + | Team: System + | Description: + | Risk is closed but kept for audit trails and historical data analysis. + | |-- [Event: 10] Reactivate --> [Task: 1100] Validation + | +END + | + |- [Task: 1990] Deleted | - |- [Task: 2990] Completed - | \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/resources/riskmanagement.txt b/dynamixs-ai-app/src/test/resources/riskmanagement.txt new file mode 100644 index 0000000..5fd31b6 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/riskmanagement.txt @@ -0,0 +1,77 @@ +Business Process: Risk Management Cycle (IDW PS 340) + +START + | + |- [Task: 1000] Risk Identification + | Team: Risk Owner (Operational Unit) + | Description: + | A potential risk has been identified within an operational unit. The Risk Owner captures basic data (Category, Description, Early Warning Indicators) to initiate the process in accordance with KonTraG. + | |-- [Event: 10] Submit Proposal (Forward to Central Risk Management) --> [Task: 1100] Validation + | |-- [Event: 20] Discard (Draft deleted) --> [Task: 1990] Deleted + | + |- [Task: 1100] Validation + | Team: Central Risk Management + | Description: + | Central function checks if the identified issue qualifies as a relevant risk or if it is a duplicate. + | |-- [Event: 10] Confirm Risk (Risk is valid, proceed to assessment) --> [Task: 1200] Gross Assessment + | |-- [Event: 20] Reject (Not a risk or duplicate) --> [Task: 1900] Archived + | |-- [Event: 30] Request Info (Send back to Owner for details) --> [Task: 1000] Risk Identification + | + |- [Task: 1200] Gross Assessment + | Team: Risk Owner (Operational Unit) + | Description: + | Quantitative assessment of the risk WITHOUT considering planned or existing measures. Impact and Probability are estimated to determine the Gross Risk Score. + | |-- [Event: 10] Save Gross Data (Proceed to Measure Definition) --> [Task: 1300] Measure Definition + | + |- [Task: 1300] Measure Definition + | Team: Risk Owner (Operational Unit) + | Description: + | Definition of risk mitigating measures (Avoid, Reduce, Transfer, Accept). Documentation of costs and responsibilities for these measures. + | |-- [Event: 10] Measures Defined (Proceed to Net Assessment) --> [Task: 1400] Net Assessment + | |-- [Event: 20] Update Assessment (Go back to Gross Assessment) --> [Task: 1200] Gross Assessment + | + |- [Task: 1400] Net Assessment + | Team: Risk Owner (Operational Unit) + | Description: + | Re-evaluation of Impact and Probability taking the defined measures into account (Residual Risk). Crucial for IDW PS 340 compliance. + | |-- [Event: 10] Submit for Aggregation (Forward to Central RM) --> [Task: 1500] Aggregation & Analysis + | + |- [Task: 1500] Aggregation & Analysis + | Team: Central Risk Management + | Description: + | The risk is analyzed in the context of the total risk portfolio (Risk Aggregation/Monte Carlo Simulation) to check against the company's Risk Bearing Capacity. + | |-- [Event: 10] Approve (Risk within appetite, standard monitoring) --> [Task: 1600] Monitoring + | |-- [Event: 20] Insufficient Mitigation (Measures not enough, send back) --> [Task: 1300] Measure Definition + | |-- [Event: 30] Critical Escalation (Threat to existence, forward to Board) --> [Task: 1550] Board Review + | + |- [Task: 1550] Board Review + | Team: Management Board / Risk Committee + | Description: + | High-level decision required. Risk exceeds risk bearing capacity or is a "bestandsgefährdendes Risiko" (§91 Abs. 2 AktG). + | |-- [Event: 10] Accept Risk (Special approval granted) --> [Task: 1600] Monitoring + | |-- [Event: 20] Demand Action (Force new measures) --> [Task: 1300] Measure Definition + | + |- [Task: 1600] Monitoring + | Team: Risk Owner (Operational Unit) + | Description: + | Continuous surveillance of the risk and the effectiveness of measures. Periodic review (e.g., quarterly). + | |-- [Event: 10] Report: No Change (Keep monitoring) --> [Task: 1600] Monitoring + | |-- [Event: 20] Risk Changed (Values or measures changed) --> [Task: 1200] Gross Assessment + | |-- [Event: 30] Risk Obsolete (Risk no longer exists) --> [Task: 1800] Closure Review + | + |- [Task: 1800] Closure Review + | Team: Central Risk Management + | Description: + | Final check if the risk can really be closed. + | |-- [Event: 10] Close Risk (Archive) --> [Task: 1900] Archived + | |-- [Event: 20] Deny Closure (Keep active) --> [Task: 1600] Monitoring + | + |- [Task: 1900] Archived + | Team: System + | Description: + | Risk is closed but kept for audit trails and historical data analysis. + | |-- [Event: 10] Reactivate --> [Task: 1100] Validation + | +END + | + |- [Task: 1990] Deleted diff --git a/dynamixs-ai-app/src/test/resources/supplier-compliance-process.bpmn b/dynamixs-ai-app/src/test/resources/supplier-compliance-process.bpmn index db4e033..705f549 100644 --- a/dynamixs-ai-app/src/test/resources/supplier-compliance-process.bpmn +++ b/dynamixs-ai-app/src/test/resources/supplier-compliance-process.bpmn @@ -54,42 +54,43 @@ EndEvent_2 event_vIjHLQ - - task_0Ni3dA - task_bu51Hw - task_eYFfCg - event_JdA0HA - event_LdLZqg - event_qj3K3g + + task_BTkknQ + task_K0XZNg + task_GPjWww + task_V8Ub0w + task_0ssrVg + task_H4vagw + event_qUjCRg + event_oA9lSA + event_GFDBvg + event_fUJCOQ + event_S4wY0A + event_KWTGpA + event_t6oz3Q + event_6kzyHQ + event_B4iE7Q - - task_UB6SdQ - task_CuooOg - task_LEajxw - task_R3enYA - task_UBaJMA - event_205BxA - event_Ufx05Q - event_CdQGKA - event_dIyqPQ - event_65MrZA - event_gYoHBQ - event_rHwjGg - event_wIadug - event_FhUrfg - event_7e0zTg - event_1S96nA + + task_rXEMPg + task_fgL0Qw + task_CtOhQg + event_D4mDAw + event_WyRqeA + event_QJeNYw + event_bk1bhw + event_vFQcLA + event_Pql4iA + event_jre26g + event_qiq1pg - - task_9uAd1w - event_8E1sKQ - event_Y1zrvA - event_cXTXNQ + + task_LsTaRQ + event_ukWzQg + event_AczA2w - - task_Rc2gyQ - event_aecfcQ - event_oMYIsQ + + task_UQIMDQ @@ -157,7 +158,7 @@ - + @@ -196,11 +197,12 @@ - + sf-1 - sf-3 + sf-3 + sf-10 - + @@ -239,13 +241,13 @@ - + sf-2 - sf-4 - sf-6 - sf-8 + sf-5 + sf-7 + sf-9 - + @@ -284,13 +286,13 @@ - - sf-7 - sf-10 - sf-12 - sf-14 + + sf-6 + sf-11 + sf-16 + sf-31 - + @@ -329,12 +331,14 @@ - - sf-5 - sf-11 - sf-16 + + sf-12 + sf-13 + sf-15 + sf-22 + sf-28 - + @@ -373,15 +377,56 @@ - - sf-13 - sf-17 - sf-18 - sf-20 + + sf-14 + sf-17 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-18 + sf-19 sf-21 - sf-26 + sf-23 - + @@ -420,13 +465,12 @@ - - sf-19 - sf-23 + + sf-24 sf-25 sf-27 - + @@ -465,12 +509,15 @@ - - sf-24 - sf-29 - sf-31 + + sf-20 + sf-26 + sf-29 + sf-30 + sf-32 + sf-37 - + @@ -509,11 +556,12 @@ - - sf-30 - sf-33 + + sf-33 + sf-34 + sf-36 - + @@ -552,15 +600,11 @@ - [Task: 2900] Rejected]]> - sf-9 - sf-15 - sf-22 - sf-28 - sf-32 - sf-35 + [Task: 1100] Validation END]]> + sf-8 + sf-35 - + @@ -599,139 +643,140 @@ - - sf-34 - sf-36 + + sf-4 - - + + sf-1 sf-2 - - - sf-3 + + + sf-3 + sf-4 - - - sf-4 - sf-5 + + + sf-5 + sf-6 - - - sf-6 - sf-7 + + + sf-7 + sf-8 - - - sf-8 - sf-9 + + + sf-9 + sf-10 - - - sf-10 - sf-11 + + + sf-11 + sf-12 - - - sf-12 - sf-13 + + + sf-13 + sf-14 - - - sf-14 - sf-15 + + + sf-15 + sf-16 - - - sf-16 - sf-17 + + + sf-17 + sf-18 - - - sf-18 - sf-19 - - - + + + sf-19 sf-20 - - + + sf-21 sf-22 - - + + sf-23 sf-24 - - + + sf-25 sf-26 - - + + sf-27 sf-28 - - - sf-29 - sf-30 + + + sf-29 - - - sf-31 - sf-32 + + + sf-30 + sf-31 - - - sf-33 - sf-34 + + + sf-32 + sf-33 - - - sf-35 - sf-36 + + + sf-34 + sf-35 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + sf-36 + sf-37 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -801,305 +846,312 @@ - + - + - + - + - + - + - - + + - - + + - - + + - + - - + + - + - + - - + + - + + + + - + - + - + - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - - - + + + - - - + + + - + - + - + + + + + + + + + + + + + - + - + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - - - + + + - - + + - - - + + + - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + - + - + + + + + + + + + diff --git a/dynamixs-ai-app/src/test/resources/website/background-001.bpmn b/dynamixs-ai-app/src/test/resources/website/background-001.bpmn new file mode 100644 index 0000000..8976ba7 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/website/background-001.bpmn @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + sequenceFlow_3VLCbQ + sequenceFlow_cE44xg + + + + + + + + sequenceFlow_cE44xg + sequenceFlow_Sl9ddA + + + + + + + + + + + + + + {} + request.subject + +^.+\.eml$ +]]]]> + +FINE + ]]> + + + + + + + + + + association_pNef4Q + sequenceFlow_3VLCbQ + + + + sequenceFlow_Sl9ddA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynamixs-ai-app/src/test/resources/website/background-001.svg b/dynamixs-ai-app/src/test/resources/website/background-001.svg new file mode 100644 index 0000000..d14e3c6 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/website/background-001.svg @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + Id: + 100 + + + + Approve + + + + + + + + + + + + Id: + 200 + + + + Send + + + + + + + + + + + + + + + Start + + + + + + + + + + + + + + + + Completed + + + + + + + + + + + + + + + + + + + Data + + + + + + + + + + + + + + + + + + + + Data Store + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/resources/website/background-001_dark.svg b/dynamixs-ai-app/src/test/resources/website/background-001_dark.svg new file mode 100644 index 0000000..2f1ac87 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/website/background-001_dark.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + Id: + 100 + + + + Approve + + + + + + + + + + + + Id: + 200 + + + + Send + + + + + + + + + + + + + + + Start + + + + + + + + + + + + + + + + Completed + + + + + + + + + + + + + + + + + + + Data + + + + + + + + + + + + + + + + + + + + Data Store + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/resources/website/background-001_default.svg b/dynamixs-ai-app/src/test/resources/website/background-001_default.svg new file mode 100644 index 0000000..68c9597 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/website/background-001_default.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + Id: + 100 + + + + Approve + + + + + + + + + + + + Id: + 200 + + + + Send + + + + + + + + + + + + + + + Start + + + + + + + + + + + + + + + + Completed + + + + + + + + + + + + + + + + + + + Data + + + + + + + + + + + + + + + + + + + + Data Store + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/resources/website/background-001_light.svg b/dynamixs-ai-app/src/test/resources/website/background-001_light.svg new file mode 100644 index 0000000..ffe5711 --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/website/background-001_light.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + Id: + 100 + + + + Approve + + + + + + + + + + + + Id: + 200 + + + + Send + + + + + + + + + + + + + + + Start + + + + + + + + + + + + + + + + Completed + + + + + + + + + + + + + + + + + + + Data + + + + + + + + + + + + + + + + + + + + Data Store + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dynamixs-ai-app/src/test/resources/website/index.html b/dynamixs-ai-app/src/test/resources/website/index.html new file mode 100644 index 0000000..2491d9c --- /dev/null +++ b/dynamixs-ai-app/src/test/resources/website/index.html @@ -0,0 +1,494 @@ + + + + + + + DYNAMIXS.AI - Die TRUSTED Enterprise AI Platform + + + + + + +
+ +
+ +
+

Ihre Geschäftsprozesse sind einzigartig.
Unsere KI versteht sie.

+

Die **TRUSTED Enterprise AI Platform** – Modellierung, Verbesserung und Automatisierung + Ihrer Prozesse, geerdet in Ihrer Business-Realität.

+ + +
+ +
+
+

Warum KI allein nicht genug ist

+

Ohne den Kontext Ihrer Abläufe bleibt KI eine Black Box. Die häufigsten Herausforderungen:

+
    +
  • + +

    Verstreute Workflows

    +

    Komplexe Abläufe sind über viele Systeme verteilt, Tools halten nicht Schritt.

    +
  • +
  • + +

    Datensilos

    +

    Wichtige Informationen sind isoliert, was Entscheidungen verlangsamt und die Zuverlässigkeit + mindert.

    +
  • +
  • + +

    Sicherheitsrisiken

    +

    Compliance- und Sicherheitsauflagen limitieren den Einsatz externer, unkontrollierter KI.

    +
  • +
+
+
+ +
+

Was DYNAMIXS.AI **anders** macht

+

Wir starten mit Ihrer Business-Realität. Die DYNAMIXS.AI Plattform ist Ihre **Process + Context Engine**:

+ +

Ihre Workflows, Regeln, Dokumente und das Expertenwissen Ihrer Teams werden zusammengeführt, um der KI den + notwendigen Kontext zu liefern. Dadurch wird KI **präzise, geschäftsreif und vertrauenswürdig**.

+ + Visuelle Darstellung der Process Context Engine + + Mehr zu AI Modeling +
+ +
+

Drei Säulen für Ihren Erfolg

+ +
+
+ +

Start mit Ihrer Geschäftsrealität

+

Wir modellieren Prozesse, Daten und Regeln exakt so, wie sie existieren. Ihre individuelle Logik ist + die Basis für präzise KI-Aktionen.

+ Mehr erfahren → +
+ +
+ +

AI transformiert Ihre Prozesse

+

Ihre Workflows bilden den Rahmen für KI-gesteuerte Entscheidungen: **Smart, Secure und Trusted.** Das + System lernt mit jedem Workflow.

+ AI Modeling ansehen → +
+ +
+ +

Effiziente Anpassung mit Templates

+

Vordefinierte Bausteine für Finance, HR und Logistik ermöglichen eine schnelle, kosteneffiziente + Implementierung in Stunden statt Wochen.

+ Zur Template Library → +
+
+
+ +
+

In 4 Schritten zur Trusted AI Platform

+

Von der Vision zur Implementierung – schnell und strukturiert.

+ +
+
+
1
+
+

Capture your business reality

+

Ihre Prozesse, Daten und Regeln werden in einem Living Model abgebildet.

+
+
+
+
2
+
+

Build the workflow model

+

Eine erste lauffähige Version Ihres Systems ist innerhalb von Stunden einsatzbereit.

+
+
+
+
3
+
+

Customize with templates

+

Fertige Komponenten verkürzen die Entwicklungszeit und beschleunigen die Implementierung.

+
+
+
+
4
+
+

Deploy, learn, improve

+

Nach dem Live-Gang beginnt die kontinuierliche Optimierung durch gesammelte Prozessdaten.

+
+
+
+
+ +
+

Enterprise-Ready Architektur

+

Ein Technologie-Stack, geformt durch zwei Jahrzehnte Enterprise-Projekte, auf den Sie sich verlassen können: +

+ +
    +
  • **Skalierbar:** Event-driven, BPMN-basiert, Cloud-native und API-first.
  • +
  • **Geschützt:** Daten sind verschlüsselt, auditierbar und DSGVO-konform.
  • +
  • **Bewährt:** Erfolgreich im Einsatz in Logistik, HR, Finance und Government.
  • +
+ Architektur im Detail ansehen +
+ +
+

Messbare Erfolge in realen Unternehmen

+ +
+
+ 2 +

Wochen bis zur vollen Integration in vielen Kundenfällen.

+
+
+ 5,000+ +

Transaktionen und 95 Modelle bei einer Steuerberatung.

+
+
+ 2 +

Stunden bis zum ersten lauffähigen Modell.

+
+
+ +
+

“Unglaublich, wie schnell wir unsere Geschäftsprozesse implementiert haben. Die Ergebnisse fließen direkt + in unser ERP.”

+ — Kunde, Finance +
+ Alle Erfolgsstories → +
+ +
+

Ready to see how?

+

Nutzen Sie das ungenutzte Intelligenzpotenzial Ihrer Workflows. Wir zeigen Ihnen, wie.

+ + Jetzt Beratungstermin vereinbaren +

Oder rufen Sie uns an: +49 (0) XXXX / XXXXXX

+ +
+ + + + + + \ No newline at end of file diff --git a/workflow/en/offer-en-1.0.1.bpmn b/workflow/en/offer-en-1.0.1.bpmn index fd47563..c10c12f 100644 --- a/workflow/en/offer-en-1.0.1.bpmn +++ b/workflow/en/offer-en-1.0.1.bpmn @@ -2741,9 +2741,6 @@ Create a short briefing (3-5 bullet points):
- - - diff --git a/workflow/en/risk-de-1.0.0.bpmn b/workflow/en/risk-de-1.0.0.bpmn new file mode 100644 index 0000000..4be642d --- /dev/null +++ b/workflow/en/risk-de-1.0.0.bpmn @@ -0,0 +1,1282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + task_8to6cg + task_kC5XDQ + task_MWaLBQ + task_tCmyhw + task_nsjabg + task_oTeo4A + event_RpXukQ + event_m1muuA + event_HwQLVQ + event_yuR8rg + event_A8wqWw + event_OupvUQ + event_MyrgCA + event_SJ0e0g + event_OiYnIQ + event_OZetOA + StartEvent_1 + dataObject_FD2Pcg + + + + task_GN080A + task_B7u2Gw + task_njdoHQ + event_Y0znMg + event_3QhxLA + event_t3ES7g + event_Mrz6ZQ + event_W5Qjaw + event_vpW1nw + event_g3z60A + event_A3CXRw + + + + task_IBL0hg + event_ZF0mhg + event_gG2rbw + + + + task_w0QinA + event_l1WXWQ + + + + + sequenceFlow_uvuzWQ + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sequenceFlow_uvuzWQ + sf-1 + sf-3 + sf-10 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-2 + sf-5 + sf-7 + sf-9 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-6 + sf-11 + sf-16 + sf-31 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-12 + sf-13 + sf-15 + sf-22 + sf-28 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-14 + sf-17 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-18 + sf-19 + sf-21 + sf-23 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-24 + sf-25 + sf-27 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-20 + sf-26 + sf-29 + sf-30 + sf-32 + sf-37 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-33 + sf-34 + sf-36 + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + [Task: 1100] Validation END]]> + sf-8 + sf-35 + sequenceFlow_C9blrw + + + + + + + + + + + + + + request.subject]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + sf-4 + sequenceFlow_9bm7Cw + + + + + + + + + sf-1 + sf-2 + + + + sf-3 + sf-4 + + + + sf-5 + sf-6 + + + + sf-7 + sf-8 + + + + + + + + + sf-9 + sf-10 + + + + sf-11 + sf-12 + + + + sf-13 + sf-14 + + + + sf-15 + sf-16 + + + + sf-17 + sf-18 + + + + sf-19 + sf-20 + + + + sf-21 + sf-22 + + + + sf-23 + sf-24 + + + + sf-25 + sf-26 + + + + sf-27 + sf-28 + + + + sf-29 + + + + sf-30 + sf-31 + + + + sf-32 + sf-33 + + + + sf-34 + sf-35 + + + + sf-36 + sf-37 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sequenceFlow_C9blrw + + + + + + + sequenceFlow_9bm7Cw + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/workflow/office/posteingang-de-3.0.2.bpmn b/workflow/office/posteingang-de-3.0.2.bpmn index 4f4be69..e223816 100644 --- a/workflow/office/posteingang-de-3.0.2.bpmn +++ b/workflow/office/posteingang-de-3.0.2.bpmn @@ -1,13 +1,5 @@ - - + @@ -45,15 +37,14 @@ true - + - + - + - + BoundaryEvent_1 @@ -63,7 +54,7 @@ IntermediateCatchEvent_3 StartEvent_1 EndEvent_1 - + dataObject_FS1r0Q task_uB6BGQ textAnnotation_CtU05A @@ -109,8 +100,7 @@ event_psk2mQ - + @@ -133,11 +123,11 @@ Betrag: _amount (Brutto € _amount_brutto) _description]]> - + - + @@ -150,16 +140,16 @@ Betrag: _amount (Brutto € _amount_brutto - + - + home -Empfang +Management @@ -175,14 +165,14 @@ Betrag: _amount (Brutto € _amount_bruttofalse - + sequenceFlow_4gpPgw - + sequenceFlow_O0kbJg sequenceFlow_tZj4qQ - + sequenceFlow_fRPOrw @@ -202,8 +192,8 @@ Betrag: _amount (Brutto € _amount_brutto true - - + + @@ -222,7 +212,7 @@ Betrag: _amount (Brutto € _amount_brutto - + @@ -231,7 +221,7 @@ Betrag: _amount (Brutto € _amount_brutto - + @@ -262,7 +252,7 @@ Betrag: _amount (Brutto € _amount_brutto - + @@ -288,18 +278,18 @@ Betrag: _amount (Brutto € _amount_brutto
SequenceFlow_9 SequenceFlow_2 - + DataOutput_1 DataOutput_1 - + sequenceFlow_VlPVJg
- + @@ -319,13 +309,13 @@ Betrag: _amount (Brutto € _amount_brutto - + - + - + cdtr.name (invoice.language)]]> @@ -337,21 +327,20 @@ Betrag: _amount (Brutto € _amount_brutto SequenceFlow_12 - + - + SequenceFlow_2 1000 - + - - + + @@ -384,13 +373,13 @@ Betrag: _amount (Brutto € _amount_brutto true - - + + - + sequenceFlow_fN22Gg sequenceFlow_bh4DIw sequenceFlow_o80yIg @@ -399,21 +388,19 @@ Betrag: _amount (Brutto € _amount_brutto - + - + - - + + - - + + - + @@ -432,8 +419,8 @@ Assign documents to process 'Front Desk']]> true - - + + @@ -442,14 +429,14 @@ Assign documents to process 'Front Desk']]> Company: document.company
]]>
- + sequenceFlow_JpNUKg sequenceFlow_8SpIiA sequenceFlow_I8o4DA sequenceFlow_n03e7Q sequenceFlow_0m3WTA
- + @@ -458,7 +445,7 @@ Company: document.company
]]>
- + @@ -467,7 +454,7 @@ Company: document.company
]]>
- + @@ -498,7 +485,7 @@ Company: document.company
]]>
- + @@ -528,14 +515,14 @@ Company: document.company
]]>
- + DataOutput_2 DataOutput_2 - + sequenceFlow_aC0skQ sequenceFlow_YMtfiw sequenceFlow_PWXjog @@ -557,13 +544,13 @@ Company: document.company
]]> true - - + + - + sequenceFlow_JpNUKg sequenceFlow_lmU9IA sequenceFlow_aC0skQ @@ -571,14 +558,13 @@ Company: document.company
]]> sequenceFlow_FK6X7g
- + - + - + {"n_predict": 4096, "temperature": 0 } ]]> - - + + @@ -630,7 +615,7 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t - + @@ -639,7 +624,7 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t - + @@ -670,7 +655,7 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t - + @@ -693,8 +678,8 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t ]]> - - + + DataOutput_2 @@ -703,13 +688,13 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t sequenceFlow_gXJm0w sequenceFlow_7t6YqQ - + sequenceFlow_KEUmaw - + - + @@ -718,7 +703,7 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t - + @@ -727,7 +712,7 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t - + @@ -758,7 +743,7 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t - + @@ -784,25 +769,24 @@ Note: Output only the XML object! Don't add explanations or comments. Use only t ]]> - - + + DataOutput_2 DataOutput_2 - + sequenceFlow_fN22Gg sequenceFlow_naZnAA sequenceFlow_PgyOMw - - + + {"n_predict": 512, "temperature": 0 } - ^.+\.([pP][dD][fF])$ @@ -815,7 +799,7 @@ Also determine the company name from which this document originates and the lang Bestimme auch den Firmennamen von diesem Dokument sowie die Sprache. -Hinweis: Der Firmenname ist der Name des Unternehmens, das dieses Dokument erstellt hat, nicht der Name des Empfängers. Der Firmenname steht in der Regel am Anfang oder Ende des Rechnungsbelegs. Es ist nicht Imixs! +Hinweis: Der Firmenname ist der Name des Unternehmens, das dieses Dokument erstellt hat, nicht der Name des Empfängers. Der Firmenname steht in der Regel am Anfang oder Ende des Rechnungsbelegs. Es ist nicht Dynamixs.AI! Gib die die Informationen als ein XML-Objekt aus, das die folgende Struktur aufweist: @@ -831,17 +815,16 @@ Hinweis: Generiere keine anderen Informationen anstelle des XML-Objekts. Generie ]]> - - + + - + - + - + @@ -850,7 +833,7 @@ Hinweis: Generiere keine anderen Informationen anstelle des XML-Objekts. Generie - + @@ -859,7 +842,7 @@ Hinweis: Generiere keine anderen Informationen anstelle des XML-Objekts. Generie - + @@ -890,7 +873,7 @@ Hinweis: Generiere keine anderen Informationen anstelle des XML-Objekts. Generie - + @@ -916,30 +899,29 @@ Hinweis: Generiere keine anderen Informationen anstelle des XML-Objekts. Generie - + DataOutput_2 DataOutput_2 - + sequenceFlow_8SpIiA sequenceFlow_A62nqQ sequenceFlow_Di4BQA - + - + - - + + {"n_predict": 4096, "temperature": 0} - ^.+\.([pP][dD][fF])$ @@ -962,33 +944,32 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder ]]> - - + + - - + + sequenceFlow_PgyOMw - - + + sequenceFlow_Di4BQA - + - + - - + + sequenceFlow_PWXjog - + @@ -1007,7 +988,7 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder - + @@ -1020,12 +1001,12 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder - + - + home @@ -1053,23 +1034,22 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder - + - + - + - + sequenceFlow_oiHd0Q sequenceFlow_eN0BQg - + - - + + sequenceFlow_naZnAA sequenceFlow_tcjWAA sequenceFlow_cY0PYg @@ -1083,7 +1063,7 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder - + @@ -1092,7 +1072,7 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder - + @@ -1123,7 +1103,7 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder - + @@ -1138,8 +1118,8 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder false - - + + DataOutput_2 @@ -1149,48 +1129,43 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder sequenceFlow_tcjWAA sequenceFlow_gpPDLg sequenceFlow_d0zSHA - + - - + + - + - + - - + + sequenceFlow_I8o4DA sequenceFlow_VlPVJg sequenceFlow_bh4DIw sequenceFlow_d0zSHA - + - - + + - - + + sequenceFlow_4gpPgw sequenceFlow_1QjzLw sequenceFlow_7t6YqQ - + - - + + @@ -1210,8 +1185,8 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder true - - + + @@ -1244,11 +1219,11 @@ Verwende nur die Standardwerte und führe keine Berechnungen, Summen oder Änder Betrag: _amount (Brutto € _amount_brutto) _description]]> - + - + @@ -1261,12 +1236,12 @@ Betrag: _amount (Brutto € _amount_brutto - + - + home @@ -1285,39 +1260,35 @@ Betrag: _amount (Brutto € _amount_brutto - + sequenceFlow_fRPOrw sequenceFlow_r48dXQ - + - - + + - + sequenceFlow_tZj4qQ 10 - - + + - - + + sequenceFlow_I8o4DA sequenceFlow_cY0PYg sequenceFlow_I8o4DA sequenceFlow_Gwxq0g - - + + @@ -1334,13 +1305,13 @@ Betrag: _amount (Brutto € _amount_brutto - + - + - + cdtr.name (invoice.language)]]> @@ -1351,11 +1322,11 @@ Betrag: _amount (Brutto € _amount_bruttosequenceFlow_VqjGQg - + sequenceFlow_VqjGQg - + @@ -1374,8 +1345,8 @@ Betrag: _amount (Brutto € _amount_brutto true - - + + @@ -1384,14 +1355,14 @@ Betrag: _amount (Brutto € _amount_bruttodocument.company
]]>
- + sequenceFlow_JpNUKg sequenceFlow_Gwxq0g sequenceFlow_LJ5lZw sequenceFlow_PeYREg
- + @@ -1412,13 +1383,13 @@ Company: document.company
]]> - + - + - + cdtr.name (invoice.language)]]> @@ -1428,7 +1399,7 @@ Company: document.company
]]> sequenceFlow_LZX10Q sequenceFlow_Lk0V9A
- + @@ -1437,7 +1408,7 @@ Company: document.company
]]>
- + @@ -1446,7 +1417,7 @@ Company: document.company
]]>
- + @@ -1477,7 +1448,7 @@ Company: document.company
]]>
- + @@ -1501,40 +1472,39 @@ Company: document.company
]]>
- + DataOutput_2 DataOutput_2 - + sequenceFlow_PWXjog sequenceFlow_LJ5lZw sequenceFlow_zzvN2Q sequenceFlow_PSnrnQ
- + - + - + sequenceFlow_LZX10Q - + - - + + {"n_predict": 4096, "temperature": 0} ^.+\.([pP][dD][fF])$ +^.+\.([pP][dD][fF])$ [INST] @@ -1550,9 +1520,8 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. ]]> - - + + @@ -1563,7 +1532,7 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + @@ -1572,7 +1541,7 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + @@ -1603,7 +1572,7 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + @@ -1626,8 +1595,8 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. ]]> - - + + DataOutput_2 @@ -1637,19 +1606,19 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. sequenceFlow_7t6YqQ sequenceFlow_zzvN2Q sequenceFlow_Lk0V9A - + sequenceFlow_qEdtHQ - + - - + + sequenceFlow_PSnrnQ - + For the OCR Adapter the following minimal options should be set: @@ -1673,43 +1642,43 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. * GRAY Shades of gray * RGB Red, Green, Blue - + - + sequenceFlow_YMtfiw sequenceFlow_KEUmaw sequenceFlow_eN0BQg - + - - + + sequenceFlow_FK6X7g - + sequenceFlow_oiHd0Q - + - + - + - + - - + + sequenceFlow_n03e7Q - + @@ -1728,7 +1697,7 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + @@ -1741,12 +1710,12 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + - + home @@ -1774,21 +1743,21 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + - + - + - - + + sequenceFlow_o80yIg - + @@ -1807,7 +1776,7 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + @@ -1820,12 +1789,12 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + - + home @@ -1853,21 +1822,21 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + - + - + - - + + sequenceFlow_t4fdag - + @@ -1886,7 +1855,7 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + @@ -1899,12 +1868,12 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + - + home @@ -1932,21 +1901,21 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + - + - + - - + + sequenceFlow_jlwCMw - + @@ -1965,7 +1934,7 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + @@ -1978,12 +1947,12 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + - + home @@ -2012,25 +1981,25 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. - + - + - + - - + + sequenceFlow_qEdtHQ sequenceFlow_PeYREg - + - + @@ -2055,11 +2024,11 @@ Erstelle eine kurze Zusammenfassung der wichtigsten Elemente dieses Vertrags. Betrag: _amount (Brutto € _amount_brutto) _description]]> - + - + @@ -2072,12 +2041,12 @@ Betrag: _amount (Brutto € _amount_brutto - + - + home @@ -2096,583 +2065,539 @@ Betrag: _amount (Brutto € _amount_brutto - + sequenceFlow_0m3WTA - + - + - + + + + - - + + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - - - - + + + + + + + - - - - + + + + - - - - - - + + + + + + - + - + - + - + - - - + + + - - - + + + + + - - - + + + - - - - + + + + - + - + - + - + - - - + + + - - - + + + - + - + - - - - - + + + + - + - + - - - + + + - + - + - + - + - - - - - + + + + - - - + + + - - - + + + - + - + - - - + + + - - - + + + - + - + - - - - - + + + + + - + - + - + - + - - - - - + + + + + - - - - - + + + + + - + - + - - - - - + + + + + - + - + - + - + - + - + - - - - + + + + - - - + + + - - - + + + - + - + - - - + + + - - - - + + + + - + - + - - - + + + - - - - - + + + + + - + - + - + - - - + + + - - - + + + + + - + - + - - - - - + + + + + - + - + - - - + + + - + - + - + - - - + + + - + - - - + + + - + - + - + - - - + + + - - - + + + - + - + - - - + + + - + - + - - - - + + + + - + - + - - - + + + - + - + - - - - - + + + + + - + - + - - - + + + - + - + - + - + - - - + + + - - - + + + - - - + + + - + - + - - - + + + - + - + - - - + + + - + - + - - - + + + - + - + - - - + + + - + - + - - - - + + + + - - - + + + - + - + - - - + + + - + - \ No newline at end of file + diff --git a/workflow/office/rechnungseingang-de-1.0.1.bpmn b/workflow/office/rechnungseingang-de-1.0.1.bpmn index 000d7ab..7790094 100644 --- a/workflow/office/rechnungseingang-de-1.0.1.bpmn +++ b/workflow/office/rechnungseingang-de-1.0.1.bpmn @@ -1074,7 +1074,7 @@ result.isValid=true; -Buchhaltung]]> +Management]]>