diff --git a/doc/PROMTS/prompt-create_model_de.md b/doc/PROMTS/prompt-create_model_de.md new file mode 100644 index 0000000..dd2acf5 --- /dev/null +++ b/doc/PROMTS/prompt-create_model_de.md @@ -0,0 +1,53 @@ +Du bist Geschäftsprozess Architekt und Modellier. Deine Aufgabe ist es Prozessmodelle zu erstellen. + +Unsere Software basiert auf BPMN 2.0. Wir modellieren Geschäftsprozesse nach folgemden Prinzip: + +**Process** - der Workflow wird jeweils in einem eigenen BPMN Pool abgebildet. Der Prozessname (Name des Pools) bezeichnet den Workflow. + +**Tasks** - bilden die Zustaände in einem Prozess ab die üblicherweise von einem Mitarbeiter im Unternehmen verantwortet werden. Z.b. 'Rechnung erstellen', 'Rechnung prüfen', 'Zahlungseingang buchen'. +Tasks werden innerhalb der Sofware als individuelle Aufgaben für den User in einer Taskliste angezeigt. Jeder Task hat eine eindeutige ID. + +**Events** - werden bei uns genutzt um den Übergang von einem Task in einen anderen zu beschreiben. Ein Event ist damit die Aktion die der Mitarbeiter ausführt. Z.b. 'Rechnung weiterleiten', 'Prüfung ablehnen', 'Buchung abschließen'. +Jedes Event das einem Task zugeordnet ist hat innerhalb dieses Tasks eine eindeutige ID. + +Wir stellen den Prozessablauf textuell stark vereinfacht dar. Diese Darstellung dient dem BPMN Modellierer einen Prozess in unserem Tool zu erstellen. + + + +Beispiel: + +Business Process: Product + +START + | + |- [Task: 1000] Imported + | |-- [Event: 10] Update --> [Task: 1000] Imported + | |-- [Event: 50] (RAG) --> [Task: 1200] In Stock + | + |- [Task: 1200] In Stock + | |-- [Event: 10] Update --> [Task: 1200] In Stock + | |-- [Event: 105] Reindex --> [Task: 1000] Imported + | |-- [Event: 20] Ordered --> [Task: 1400] Ordered + | |-- [Event: 30] Not in Stock --> [Task: 1500] Not in Stock + | |-- [Event: 990] [CSV Import] --> [Task: 1000] Imported + | + |- [Task: 1400] Ordered + | |-- [Event: 10] Update --> [Task: 1400] Ordered + | |-- [Event: 20] Delievered --> [Task: 1000] Imported + | |-- [Event: 99] [Wiedervorlage] --> [Task: 1400] Ordered + | + |- [Task: 1500] Not in Stock + | |-- [Event: 10] Update --> [Task: 1500] Not in Stock + | |-- [Event: 20] Delievered --> [Task: 1000] Imported + | |-- [Event: 30] Delete --> [Task: 1990] Deleted + | + END + | + |- [Task: 1990] Deleted + | + + + +Erstelle einen neuen Prozess für eine "Supplier Compliance Prüfung" innerhalb eines Lieferkettenprozesses für ein großes Export Unternehmen. +Erstelle eine formatierte Text Datei für den Ablauf + diff --git a/doc/PROMTS/result-chatgpt.txt b/doc/PROMTS/result-chatgpt.txt new file mode 100644 index 0000000..8de3c3e --- /dev/null +++ b/doc/PROMTS/result-chatgpt.txt @@ -0,0 +1,50 @@ +START + | + |- [Task: 1000] Supplier angelegt + | |-- [Event: 10] Stammdaten aktualisieren --> [Task: 1000] Supplier angelegt + | |-- [Event: 20] Compliance-Prüfung starten --> [Task: 1100] Compliance-Prüfung in Vorbereitung + | + |- [Task: 1100] Compliance-Prüfung in Vorbereitung + | |-- [Event: 10] Prüfumfang anpassen --> [Task: 1100] Compliance-Prüfung in Vorbereitung + | |-- [Event: 30] Dokumente anfordern --> [Task: 1200] Dokumente angefordert + | |-- [Event: 40] Prüfung abbrechen --> [Task: 1900] Prüfung abgebrochen + | + |- [Task: 1200] Dokumente angefordert + | |-- [Event: 10] Erinnerung senden --> [Task: 1200] Dokumente angefordert + | |-- [Event: 20] Dokumente erhalten --> [Task: 1300] Dokumente eingegangen + | |-- [Event: 99] [Wiedervorlage] --> [Task: 1200] Dokumente angefordert + | + |- [Task: 1300] Dokumente eingegangen + | |-- [Event: 10] Dokumente aktualisieren --> [Task: 1300] Dokumente eingegangen + | |-- [Event: 30] Formale Prüfung durchführen --> [Task: 1400] Formale Prüfung + | + |- [Task: 1400] Formale Prüfung + | |-- [Event: 10] Prüfung wiederholen --> [Task: 1400] Formale Prüfung + | |-- [Event: 20] Formal unvollständig --> [Task: 1250] Nachforderung Dokumente + | |-- [Event: 30] Formal korrekt --> [Task: 1500] Inhaltliche Compliance-Prüfung + | + |- [Task: 1250] Nachforderung Dokumente + | |-- [Event: 10] Nachforderung senden --> [Task: 1200] Dokumente angefordert + | + |- [Task: 1500] Inhaltliche Compliance-Prüfung + | |-- [Event: 10] Prüfung vertiefen --> [Task: 1500] Inhaltliche Compliance-Prüfung + | |-- [Event: 20] Compliance erfüllt --> [Task: 1600] Supplier freigegeben + | |-- [Event: 30] Abweichungen festgestellt --> [Task: 1700] Abweichungen klären + | |-- [Event: 40] Kritischer Verstoß --> [Task: 1800] Supplier gesperrt + | + |- [Task: 1700] Abweichungen klären + | |-- [Event: 10] Maßnahmen anfordern --> [Task: 1700] Abweichungen klären + | |-- [Event: 20] Maßnahmen akzeptiert --> [Task: 1600] Supplier freigegeben + | |-- [Event: 30] Maßnahmen abgelehnt --> [Task: 1800] Supplier gesperrt + | + |- [Task: 1600] Supplier freigegeben + | |-- [Event: 10] Freigabe aktualisieren --> [Task: 1600] Supplier freigegeben + | |-- [Event: 90] Re-Compliance-Prüfung starten --> [Task: 1100] Compliance-Prüfung in Vorbereitung + | + |- [Task: 1800] Supplier gesperrt + | |-- [Event: 10] Sperrung prüfen --> [Task: 1800] Supplier gesperrt + | |-- [Event: 20] Sperrung aufheben --> [Task: 1100] Compliance-Prüfung in Vorbereitung + | + END + | + |- [Task: 1900] Prüfung abgebrochen diff --git a/doc/PROMTS/result-claude.txt b/doc/PROMTS/result-claude.txt new file mode 100644 index 0000000..adb9bc5 --- /dev/null +++ b/doc/PROMTS/result-claude.txt @@ -0,0 +1,178 @@ +================================================================================ +BUSINESS PROCESS: Supplier Compliance Prüfung +================================================================================ +Beschreibung: Workflow zur Prüfung und Freigabe von Lieferanten gemäß + Export-Compliance-Anforderungen (Sanktionslisten, Zertifikate, + Dual-Use-Prüfung, Qualitätsstandards) +================================================================================ + +START + | + |- [Task: 1000] Lieferant erfasst + | |-- [Event: 10] Update --> [Task: 1000] Lieferant erfasst + | |-- [Event: 20] Zur Vorprüfung --> [Task: 1100] Vorprüfung + | |-- [Event: 30] Direktablehnung --> [Task: 9000] Abgelehnt + | |-- [Event: 990] [CSV Import] --> [Task: 1000] Lieferant erfasst + | + |- [Task: 1100] Vorprüfung + | |-- [Event: 10] Update --> [Task: 1100] Vorprüfung + | |-- [Event: 20] Stammdaten vollständig --> [Task: 1200] Sanktionsprüfung + | |-- [Event: 30] Daten unvollständig --> [Task: 1050] Datenanforderung + | |-- [Event: 40] Abbrechen --> [Task: 9000] Abgelehnt + | + |- [Task: 1050] Datenanforderung + | |-- [Event: 10] Update --> [Task: 1050] Datenanforderung + | |-- [Event: 20] Daten erhalten --> [Task: 1100] Vorprüfung + | |-- [Event: 30] Keine Rückmeldung --> [Task: 9000] Abgelehnt + | |-- [Event: 99] [Wiedervorlage] --> [Task: 1050] Datenanforderung + | + |- [Task: 1200] Sanktionsprüfung + | |-- [Event: 10] Update --> [Task: 1200] Sanktionsprüfung + | |-- [Event: 20] Keine Treffer --> [Task: 1300] Export-Kontrollprüfung + | |-- [Event: 30] Treffer gefunden --> [Task: 1250] Sanktionstreffer Klärung + | |-- [Event: 40] (API Sanktionsliste) --> [Task: 1200] Sanktionsprüfung + | + |- [Task: 1250] Sanktionstreffer Klärung + | |-- [Event: 10] Update --> [Task: 1250] Sanktionstreffer Klärung + | |-- [Event: 20] False Positive bestätigt --> [Task: 1300] Export-Kontrollprüfung + | |-- [Event: 30] Treffer bestätigt --> [Task: 9100] Gesperrt + | |-- [Event: 40] Eskalation --> [Task: 1260] Compliance Officer Review + | + |- [Task: 1260] Compliance Officer Review + | |-- [Event: 10] Update --> [Task: 1260] Compliance Officer Review + | |-- [Event: 20] Freigabe erteilt --> [Task: 1300] Export-Kontrollprüfung + | |-- [Event: 30] Sperrung angeordnet --> [Task: 9100] Gesperrt + | + |- [Task: 1300] Export-Kontrollprüfung + | |-- [Event: 10] Update --> [Task: 1300] Export-Kontrollprüfung + | |-- [Event: 20] Keine Einschränkungen --> [Task: 1400] Dokumentenprüfung + | |-- [Event: 30] Dual-Use relevant --> [Task: 1350] Dual-Use Bewertung + | |-- [Event: 40] Embargo betroffen --> [Task: 9100] Gesperrt + | + |- [Task: 1350] Dual-Use Bewertung + | |-- [Event: 10] Update --> [Task: 1350] Dual-Use Bewertung + | |-- [Event: 20] Genehmigung vorhanden --> [Task: 1400] Dokumentenprüfung + | |-- [Event: 30] Genehmigung erforderlich --> [Task: 1360] Genehmigungsantrag + | |-- [Event: 40] Nicht genehmigungsfähig --> [Task: 9000] Abgelehnt + | + |- [Task: 1360] Genehmigungsantrag + | |-- [Event: 10] Update --> [Task: 1360] Genehmigungsantrag + | |-- [Event: 20] Genehmigung erteilt --> [Task: 1400] Dokumentenprüfung + | |-- [Event: 30] Genehmigung abgelehnt --> [Task: 9000] Abgelehnt + | |-- [Event: 99] [Wiedervorlage] --> [Task: 1360] Genehmigungsantrag + | + |- [Task: 1400] Dokumentenprüfung + | |-- [Event: 10] Update --> [Task: 1400] Dokumentenprüfung + | |-- [Event: 20] Dokumente vollständig --> [Task: 1500] Qualitätsprüfung + | |-- [Event: 30] Dokumente fehlen --> [Task: 1450] Dokumentenanforderung + | |-- [Event: 40] Dokumente ungültig --> [Task: 1450] Dokumentenanforderung + | + |- [Task: 1450] Dokumentenanforderung + | |-- [Event: 10] Update --> [Task: 1450] Dokumentenanforderung + | |-- [Event: 20] Dokumente erhalten --> [Task: 1400] Dokumentenprüfung + | |-- [Event: 30] Frist abgelaufen --> [Task: 9000] Abgelehnt + | |-- [Event: 99] [Wiedervorlage] --> [Task: 1450] Dokumentenanforderung + | + |- [Task: 1500] Qualitätsprüfung + | |-- [Event: 10] Update --> [Task: 1500] Qualitätsprüfung + | |-- [Event: 20] Qualität bestätigt --> [Task: 1600] Freigabeentscheidung + | |-- [Event: 30] Audit erforderlich --> [Task: 1550] Lieferanten-Audit + | |-- [Event: 40] Qualität unzureichend --> [Task: 9000] Abgelehnt + | + |- [Task: 1550] Lieferanten-Audit + | |-- [Event: 10] Update --> [Task: 1550] Lieferanten-Audit + | |-- [Event: 20] Audit bestanden --> [Task: 1600] Freigabeentscheidung + | |-- [Event: 30] Audit nicht bestanden --> [Task: 1560] Maßnahmenplan + | |-- [Event: 40] Audit abgebrochen --> [Task: 9000] Abgelehnt + | |-- [Event: 99] [Wiedervorlage] --> [Task: 1550] Lieferanten-Audit + | + |- [Task: 1560] Maßnahmenplan + | |-- [Event: 10] Update --> [Task: 1560] Maßnahmenplan + | |-- [Event: 20] Maßnahmen umgesetzt --> [Task: 1550] Lieferanten-Audit + | |-- [Event: 30] Maßnahmen abgelehnt --> [Task: 9000] Abgelehnt + | |-- [Event: 99] [Wiedervorlage] --> [Task: 1560] Maßnahmenplan + | + |- [Task: 1600] Freigabeentscheidung + | |-- [Event: 10] Update --> [Task: 1600] Freigabeentscheidung + | |-- [Event: 20] Vollfreigabe --> [Task: 2000] Aktiver Lieferant + | |-- [Event: 30] Bedingte Freigabe --> [Task: 2100] Bedingt freigegeben + | |-- [Event: 40] Ablehnung --> [Task: 9000] Abgelehnt + | + |- [Task: 2000] Aktiver Lieferant + | |-- [Event: 10] Update --> [Task: 2000] Aktiver Lieferant + | |-- [Event: 20] Re-Validierung fällig --> [Task: 3000] Re-Validierung + | |-- [Event: 30] Compliance-Vorfall --> [Task: 3500] Vorfallprüfung + | |-- [Event: 40] Lieferant deaktivieren --> [Task: 9200] Inaktiv + | |-- [Event: 99] [Wiedervorlage] --> [Task: 2000] Aktiver Lieferant + | + |- [Task: 2100] Bedingt freigegeben + | |-- [Event: 10] Update --> [Task: 2100] Bedingt freigegeben + | |-- [Event: 20] Bedingungen erfüllt --> [Task: 2000] Aktiver Lieferant + | |-- [Event: 30] Bedingungen nicht erfüllt --> [Task: 9000] Abgelehnt + | |-- [Event: 40] Re-Validierung fällig --> [Task: 3000] Re-Validierung + | |-- [Event: 99] [Wiedervorlage] --> [Task: 2100] Bedingt freigegeben + | + |- [Task: 3000] Re-Validierung + | |-- [Event: 10] Update --> [Task: 3000] Re-Validierung + | |-- [Event: 20] Validierung bestanden --> [Task: 2000] Aktiver Lieferant + | |-- [Event: 30] Sanktionsprüfung erforderlich --> [Task: 1200] Sanktionsprüfung + | |-- [Event: 40] Dokumentenprüfung erforderlich --> [Task: 1400] Dokumentenprüfung + | |-- [Event: 50] Validierung nicht bestanden --> [Task: 9100] Gesperrt + | + |- [Task: 3500] Vorfallprüfung + | |-- [Event: 10] Update --> [Task: 3500] Vorfallprüfung + | |-- [Event: 20] Vorfall unbegründet --> [Task: 2000] Aktiver Lieferant + | |-- [Event: 30] Vorfall bestätigt --> [Task: 3600] Maßnahmenfestlegung + | |-- [Event: 40] Sofortige Sperrung --> [Task: 9100] Gesperrt + | + |- [Task: 3600] Maßnahmenfestlegung + | |-- [Event: 10] Update --> [Task: 3600] Maßnahmenfestlegung + | |-- [Event: 20] Maßnahmen akzeptiert --> [Task: 2100] Bedingt freigegeben + | |-- [Event: 30] Zusammenarbeit beenden --> [Task: 9100] Gesperrt + | + END + | + |- [Task: 9000] Abgelehnt + | |-- [Event: 10] Update --> [Task: 9000] Abgelehnt + | |-- [Event: 20] Reaktivieren --> [Task: 1000] Lieferant erfasst + | + |- [Task: 9100] Gesperrt + | |-- [Event: 10] Update --> [Task: 9100] Gesperrt + | |-- [Event: 20] Sperrung aufheben --> [Task: 1200] Sanktionsprüfung + | |-- [Event: 30] Endgültig sperren --> [Task: 9900] Blacklist + | + |- [Task: 9200] Inaktiv + | |-- [Event: 10] Update --> [Task: 9200] Inaktiv + | |-- [Event: 20] Reaktivieren --> [Task: 3000] Re-Validierung + | |-- [Event: 30] Archivieren --> [Task: 9990] Archiviert + | + |- [Task: 9900] Blacklist + | + |- [Task: 9990] Archiviert + | + +================================================================================ +LEGENDE +================================================================================ +[Task: XXXX] = Prozessschritt / Zustand mit eindeutiger ID +[Event: XX] = Aktion / Übergang mit eindeutiger ID innerhalb des Tasks +--> = Ziel-Task nach Ausführung des Events +(API ...) = Automatisierter Event (Systemintegration) +[CSV Import] = Massenimport-Event +[Wiedervorlage] = Zeitgesteuertes Erinnerungs-Event + +================================================================================ +TASK-ÜBERSICHT +================================================================================ +1000-1099 Erfassung & Vorprüfung +1100-1199 Vorprüfung +1200-1299 Sanktionsprüfung +1300-1399 Export-Kontrollprüfung +1400-1499 Dokumentenprüfung +1500-1599 Qualitätsprüfung +1600-1699 Freigabeentscheidung +2000-2999 Aktive Lieferanten +3000-3999 Re-Validierung & Vorfallmanagement +9000-9999 Endstatus (Abgelehnt, Gesperrt, Archiviert) + +================================================================================ \ No newline at end of file diff --git a/doc/PROMTS/result-gemini.txt b/doc/PROMTS/result-gemini.txt new file mode 100644 index 0000000..d76ffac --- /dev/null +++ b/doc/PROMTS/result-gemini.txt @@ -0,0 +1,71 @@ +# Business Process: Supplier Compliance Prüfung + +## Pool: Supplier Compliance Prüfung (Workflow-Name) + +### Task: 50 | Prüfung beauftragt (Initialer Zustand) +* **Beschreibung:** Der Prozess ist gestartet und die Compliance-Prüfung wurde initialisiert. +* **Events (Aktionen des Users/Systems):** + * [Event: 10] Aktualisieren --> [Task: 50] Prüfung beauftragt + * [Event: 20] Zuordnung Compliance Manager --> [Task: 100] Compliance Prüfung in Bearbeitung + * [Event: 90] Prozess abbrechen --> [Task: 990] Abgeschlossen - Abgebrochen + +--- + +### Task: 100 | Compliance Prüfung in Bearbeitung (Hauptbearbeitung) +* **Beschreibung:** Der zugewiesene Compliance Manager arbeitet aktiv an der Prüfung, sammelt und bewertet Unterlagen. +* **Events (Aktionen des Users/Systems):** + * [Event: 10] Aktualisieren --> [Task: 100] Compliance Prüfung in Bearbeitung + * [Event: 20] Unterlagen fehlen - Nachforderung --> [Task: 200] Warten auf Unterlagen Lieferant + * [Event: 30] Compliance positiv - Freigeben --> [Task: 500] Compliance Positiv + * [Event: 40] Compliance negativ - Sperren --> [Task: 550] Compliance Negativ - Gesperrt + * [Event: 50] (RAG) Prüfung zur Freigabe --> [Task: 300] Prüfung zur Freigabe Compliance Management + +--- + +### Task: 200 | Warten auf Unterlagen Lieferant (Blockierender Zustand) +* **Beschreibung:** Der Prozess ist blockiert und wartet auf die vom Lieferanten nachzufordernden Dokumente. +* **Events (Aktionen des Users/Systems):** + * [Event: 10] Aktualisieren --> [Task: 200] Warten auf Unterlagen Lieferant + * [Event: 20] Unterlagen erhalten - Fortsetzen --> [Task: 100] Compliance Prüfung in Bearbeitung + * [Event: 30] Eskalation (Fristüberschreitung) --> [Task: 250] Eskalation (Fristüberschreitung) + * [Event: 40] Lieferant nicht kooperativ - Sperren --> [Task: 550] Compliance Negativ - Gesperrt + +--- + +### Task: 250 | Eskalation (Fristüberschreitung) (Entscheidungsbedarf) +* **Beschreibung:** Eine Frist wurde überschritten; eine Führungskraft oder der Einkauf muss eine Entscheidung über das weitere Vorgehen treffen. +* **Events (Aktionen des Users/Systems):** + * [Event: 10] Aktualisieren --> [Task: 250] Eskalation (Fristüberschreitung) + * [Event: 20] Prüfprozess fortsetzen --> [Task: 100] Compliance Prüfung in Bearbeitung + * [Event: 30] Lieferant sofort sperren --> [Task: 550] Compliance Negativ - Gesperrt + +--- + +### Task: 300 | Prüfung zur Freigabe Compliance Management (Vier-Augen-Prinzip) +* **Beschreibung:** Die finale Entscheidung zur Freigabe muss von einer übergeordneten Stelle überprüft und genehmigt werden. +* **Events (Aktionen des Users/Systems):** + * [Event: 10] Aktualisieren --> [Task: 300] Prüfung zur Freigabe Compliance Management + * [Event: 20] Freigabe genehmigen --> [Task: 500] Compliance Positiv + * [Event: 30] Prüfung ablehnen - Zurück zur Bearbeitung --> [Task: 100] Compliance Prüfung in Bearbeitung + +--- + +### Task: 500 | Compliance Positiv (Endzustand - Positiv) +* **Beschreibung:** Die Prüfung ist erfolgreich abgeschlossen, der Lieferant ist freigegeben. +* **Events (Aktionen des Users/Systems):** + * [Event: 10] Abschließen (Archivieren) --> [Task: 900] Abgeschlossen - Positiv + * [Event: 20] Sperre initiieren (Bei neuer Info) --> [Task: 550] Compliance Negativ - Gesperrt + +--- + +### Task: 550 | Compliance Negativ - Gesperrt (Endzustand - Negativ) +* **Beschreibung:** Die Prüfung ist abgeschlossen, der Lieferant ist nicht konform und wurde gesperrt. +* **Events (Aktionen des Users/Systems):** + * [Event: 10] Abschließen (Archivieren) --> [Task: 950] Abgeschlossen - Negativ + * [Event: 20] Re-Evaluierung beauftragen --> [Task: 50] Prüfung beauftragt + +--- + +### Task: 900 | Abgeschlossen - Positiv +### Task: 950 | Abgeschlossen - Negativ +### Task: 990 | Abgeschlossen - Abgebrochen \ No newline at end of file diff --git a/dynamixs-ai-app/src/main/java/ai/dynamixs/ChronicleTextBuilder.java b/dynamixs-ai-app/src/main/java/ai/dynamixs/ChronicleTextBuilder.java new file mode 100644 index 0000000..3b56cf5 --- /dev/null +++ b/dynamixs-ai-app/src/main/java/ai/dynamixs/ChronicleTextBuilder.java @@ -0,0 +1,475 @@ +package ai.dynamixs; + +/******************************************************************************* + * Imixs Workflow Technology + * Copyright (C) 2003, 2008 Imixs Software Solutions GmbH, + * http://www.imixs.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You can receive a copy of the GNU General Public + * License at http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Imixs Software Solutions GmbH - initial API and implementation + * Ralph Soika + * + *******************************************************************************/ + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.logging.Logger; + +import org.imixs.workflow.FileData; +import org.imixs.workflow.ItemCollection; +import org.imixs.workflow.WorkflowKernel; +import org.imixs.workflow.engine.DocumentService; +import org.imixs.workflow.engine.plugins.HistoryPlugin; +import org.imixs.workflow.office.forms.WorkitemService; + +import jakarta.inject.Inject; + +/** + * The ChronicleTextBuilder creates a text representation of all chronicle data + * for a given workitem. + * + *
+ * The output format is structured by year and month: + * + *
+ * 2025 + * + * December + * 27. Dec 2025 (14:37) - Ralph Soika + * Offer sent + * Products are out of stock now! + * + * 27. Dec 2025 (14:35) - imixs-workflow-service + * Retrieve Products + * Retrieve Address + *+ * + *
+ * Usage example: + * + *
+ * ChronicleTextBuilder builder = new ChronicleTextBuilder(workitem, locale); + * builder.setDmsController(dmsController); + * builder.setWorkitemLinkController(workitemLinkController); + * builder.setWorkitemService(workitemService); + * builder.setDocumentService(documentService); + * String chronicleText = builder.build(); + *+ * + *
+ * The builder supports filtering by entry type (history, comment, dms,
+ * reference, version, imixs-ai).
+ *
+ * @author rsoika
+ */
+public class ChronicleTextBuilder implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private static Logger logger = Logger.getLogger(ChronicleTextBuilder.class.getName());
+
+ private ItemCollection workitem;
+ private Locale locale;
+ private String filterType;
+
+ @Inject
+ private WorkitemService workitemService;
+
+ @Inject
+ private DocumentService documentService;
+
+ // Internal data structures
+ private List> history = null;
+
+ // Check for deprecated field 'txtworkflowhistory'
+ if (!workitem.hasItem(HistoryPlugin.ITEM_HISTORY_LOG)
+ && workitem.hasItem("txtworkflowhistory")) {
+ history = workitem.getItemValue("txtworkflowhistory");
+ // Sort old history entries chronologically
+ Collections.sort(history, new Comparator
>() {
+ @Override
+ public int compare(List> entry1, List> entry2) {
+ Date date1 = (Date) entry1.get(0);
+ Date date2 = (Date) entry2.get(0);
+ return date1.compareTo(date2);
+ }
+ });
+ } else {
+ history = workitem.getItemValue(HistoryPlugin.ITEM_HISTORY_LOG);
+ }
+
+ // Reverse to get newest first
+ // Collections.reverse(history);
+
+ if (history.size() > 0 && history.get(0) instanceof List) {
+ for (List> entries : history) {
+ Date date = (Date) entries.get(0);
+ String message = (String) entries.get(1);
+ String user = (String) entries.get(2);
+ addEntry(date, user, message, "history");
+ }
+ }
+ }
+
+ /**
+ * Collects comment entries from the workitem.
+ */
+ private void collectCommentEntries() {
+ List