## Programmbeschreibung

mod_pseudo ist ein Werkzeug zur Anonymisierung, Pseudonymisierung und strukturierten Verarbeitung von Datenbeständen aus CSV-, TXT- und Excel-Dateien. Die Anwendung unterstützt Anwender dabei, sensible personenbezogene oder unternehmensbezogene Informationen so zu verändern, dass sie für Tests, Analysen, Supportfälle oder Entwicklungsumgebungen genutzt werden können, ohne auf reale Daten zurückgreifen zu müssen.

Das Programm arbeitet feldbasiert: Für jede Spalte können gezielt Aktionen definiert werden, beispielsweise Löschen, Konvertieren oder Pseudonymisieren von Inhalten. Abhängig vom Einsatzzweck kann entweder eine echte Anonymisierung erfolgen – etwa durch vollständiges Entfernen von Feldinhalten – oder eine reversibel nachvollziehbare Pseudonymisierung, bei der der ursprüngliche Wert durch einen stabilen Ersatzwert ersetzt wird.

Der Prozess der Pseudonymisierung erfolgt deterministisch auf Basis eines HMAC-Schlüssels. Dadurch erhalten identische Eingabewerte immer denselben Ergebniswert, auch über mehrere Dateien hinweg. Der Schlüssel wird nicht im Programm gespeichert, sondern verbleibt vollständig unter der Kontrolle des Anwenders. Dadurch bleiben sowohl Datenschutz- als auch Compliance-Anforderungen gewahrt. Optional kann eine Zuordnungsdatei generiert werden, die die Beziehung zwischen Original- und Ersatzwerten dokumentiert, sofern dies für Test- oder Migrationsszenarien erforderlich ist.

Für häufige Feldtypen stehen spezialisierte Aktionen zur Verfügung, u. a. für Namen, Firmendaten, Adressen, Telefon- und Steuernummern, Datums- und Zeitangaben, Beträge, PLZ/Ort-Kombinationen, IP- und Mail-Adressen, UUIDs oder numerische Werte. Für Felder wie IBAN, USt-ID, BIC oder IP-Adressen können, sofern gewünscht, syntaktisch gültige, aber nicht existierende Werte erzeugt werden. Ebenso können numerische oder Datumswerte skaliert oder verschoben werden, sodass realistische, aber datenschutzkonforme Daten entstehen.

mod_pseudo ermöglicht zudem die direkte Bearbeitung von Text- und Excel-Dateien, ohne dass externe Programme wie Excel oder LibreOffice erforderlich sind. Inhalte können geändert, konvertiert, formatiert oder um neue Spalten ergänzt werden. Damit eignet sich das Werkzeug nicht nur zur Anonymisierung, sondern auch zur Datenbereinigung, Strukturumwandlung oder zur Erstellung standardisierter Testdatensätze.

Für erweiterte Automations- und Integrationsanforderungen steht eine JavaScript-Schnittstelle zur Verfügung. Über diese lassen sich Datensätze programmgesteuert analysieren, verändern, exportieren oder in Abläufe integrieren.

mod_pseudo wurde insbesondere für den Einsatz in Softwaretests, Supportprozessen, Produktdokumentation, Datenmigrationen, Qualitätssicherung und Entwicklungsumgebungen entwickelt, in denen reale Daten aus Datenschutz-, Sicherheits- oder Verfügbarkeitsgründen nicht eingesetzt werden dürfen. Der Schwerpunkt liegt dabei auf Datenschutz, Reproduzierbarkeit, einfacher Bedienbarkeit und konsistenten Ergebnissen bei kleinen wie großen Datenmengen.

### Einstellungen

Eingabedatei: In das Eingabefeld kann entweder ein Dateipfad eingegeben oder aus der Zwischenablage eingefügt werden. Mit dem Schalter Ändern erscheint ein Dateiauswahldialog.

Aktualisieren: Setzt manuelle Änderungen (Bearbeitbar) zurück und lädt die Daten erneut so, wie sie beim ersten Import eingelesen wurden. Hinweis: Externe Änderungen an der Datei werden derzeit nicht berücksichtigt.

Laden: Lädt eine Konfiguration, die zuvor mit Speichern gesichert wurde.

Ab Zeile: Hier wird die Zeilennummer angegeben, ab der die Feldtitel beginnen. Existieren keine Feldtitel (Titel deaktiviert), muss hier die Zeilennummer eingetragen werden, an der die eigentlichen Daten beginnen.

Wenn Feldtitel vorhanden sind, wird aktuell angenommen, dass die Datenzeile direkt darunter beginnt. Fehlen Feldtitel, erzeugt das Programm automatische Titel:

- Bei Textdateien: Ganzzahlen (`1, 2, 3 ...`)

- Bei Excel-Dateien: Excel-Spaltennamen (`A, B, C ...`)

Hinweis: Bei DATEV-CSV-Dateien muss Titel aktiviert und bei Ab Zeile der Wert `2` eingetragen werden.

Relaxed: Sollte immer aktiviert sein.

Titel: Die Daten enthalten eine Kopfzeile mit Feldtiteln.

Bearbeitbar: Daten können in der Listenansicht Eingabe: per Mausklick direkt bearbeitet werden.

#### Einstellungen für Textdateien

Zuerst sollte der passende Datenfeld-Separator festgelegt werden.

Optional kann der Text-Separator für Zeichenketten definiert werden.

Beispiele (Separator = Semikolon):

Variante | Beispiel
--- | ---
Doppelt | `"Version ""XT""";1200€`
Einfach | `'Version ''XT''';1200€`
Beide | `'Version ''XT''';"1200€"`

Escape-Sequenzen:

- TwoQuote (Standard) Anführungszeichen in Texten bleiben erhalten. Beispiel: `"Ausgabe-""Test""";1200€` → `Ausgabe-"Test";1200€`

- Backslash Entfernt Backslashes.

Kodierung: Bei Textdateien häufig: `UTF-8`, `ISO-8859-1` oder `UTF-32`. Falls Umlaute falsch dargestellt werden, muss die Kodierung angepasst werden. In Notepad++ wird die erkannte Kodierung im Menü Codierung angezeigt.

### Feldaktionen

Feldinhalte löschen (Anonymisieren): Durch Aktivieren des entsprechenden Datenfeldes werden alle Werte dieses Feldes in der Ausgabe gelöscht. Mehrfachauswahl ist möglich.

Feldinhalte ändern (Pseudonymisieren oder Konvertieren): Im linken Auswahlfeld wird das Datenfeld ausgewählt, im rechten die gewünschte Aktion. Aktionen, die mit `*` enden, konvertieren nur, pseudonymisieren aber nicht.

Mit dem Schalter Zuweisen wird die Aktion dem Datenfeld zugeordnet. Um eine Zuordnung zu entfernen, wird die leere Auswahl im Aktionsfeld ausgewählt und zugewiesen.

Mit dem Schalter Konfigurieren können zusätzliche Optionen zur Verarbeitung bestimmter Datenfelder eingestellt werden. Diese erweiterten Einstellungen werden weiter unten beschrieben.

### Dateien

Ausgabedatei: In das Eingabefeld kann entweder ein Dateipfad eingegeben oder aus der Zwischenablage eingefügt werden. Mit dem Schalter Ändern erscheint ein Dateiauswahldialog.

Formatvorgaben:

- Textdateien: `.csv`

- Excel/OpenOffice: `.xlsx`

Zuordnungsdatei: Erzeugt im Ausgabeordner eine Datei wie: `mod_pseudo_map_yyyyMMdd_HHmmss.csv` Diese enthält eine Gegenüberstellung der ursprünglichen und der geänderten Werte. Es werden nur Werte aufgelistet, die über Feldinhalte ändern verändert wurden.

Scriptdatei: Aktiviert die Verwendung einer zusätzlichen JavaScript-Datei. In das Eingabefeld kann entweder ein Dateipfad eingegeben oder aus der Zwischenablage eingefügt werden. Mit dem Schalter Ändern erscheint ein Dateiauswahldialog.

Die zusätzliche API wird weiter unten beschrieben.

### Verarbeitung

Testen und Erstellen: Erzeugt die Ausgabedatei und ggf. die Zuordnungsdatei. Eine Vorschau der Ergebnisdaten erscheint in der Listenansicht Ausgabe:.

Speichern: Speichert die aktuelle Konfiguration, sodass sie später über Laden wiederhergestellt werden kann.

### Zusätzliche Optionen für Feldaktionen — Zusammenfassung

Die erweiterten Einstellungen wirken nur bei Datenfeldern, für die zuvor eine Aktion ausgewählt und zugewiesen wurde. Sie bestimmen, wie Werte erzeugt, verändert oder simuliert werden.

#### Metadaten entfernen

Entfernt alle Zeilen vor dem Tabellenkopf bzw. der ersten Datenzeile (falls keine Titel vorhanden) aus der Zieldatei. Die eigentlichen Spaltenüberschriften (Titelzeile der Tabelle) und die Daten bleiben erhalten. Hinweis: Bei DATEV-CSV-Dateien oder anderen Formaten, die einen Metadatenblock am Anfang zwingend benötigen, darf diese Einstellung nicht aktiviert werden.

#### Echtwerte simulieren

Erzeugt realistisch wirkende pseudonymisierte Werte für strukturierte Datenfelder wie:

- PLZ

- Straße / Hausnummer

- Telefonnummer

- Steuernummer

- USt-ID

- IP-Adresse

Die erzeugten Werte orientieren sich am üblichen Format, sind jedoch nicht rückrechenbar und nicht real. Sie dienen ausschließlich dazu, Testdaten plausibel erscheinen zu lassen.

Datenfeld | Ergebnis | Validität
--- | --- | ---
PLZ, Straße, Telefonnummer | strukturell plausibel | nicht garantiert gültig
Steuernummer, USt-ID | formatähnlich | nicht prüfbar gültig
IP-Adresse | formal gültig (IPv4/IPv6) | technisch gültig, aber nicht echt

#### Gleitkomma immer als Text

Speichert Dezimalwerte unabhängig vom System- oder Excel-Format als Text, um Lokalisierungs- oder Rundungsfehler zu vermeiden oder wenn eine Software ein spezielles Eingabeformat benötigt. Textwerte lassen sich in Excel oder LibreOffice nicht direkt für Berechnungen verwenden.

#### Datumsverschiebung

Verschiebt Datumswerte zufällig innerhalb eines definierten Bereichs. Optional kann eine einheitliche Verschiebung für alle Datumswerte verwendet werden, um zeitliche Beziehungen (z. B. Buchungs- und Leistungsdatum) beizubehalten. Hinweis: Der Minimalwert beträgt 30 Tage. Eine größere Verschiebung führt zu einer stärkeren Pseudonymisierung und erschwert Rückschlüsse auf den ursprünglichen Wert.

#### Formatierung für Datum und Datum-Zeit

Definiert Ein- und Ausgabeformatregeln (z. B. `dd.MM.yyyy`, `yyyy-MM-dd`, ISO-8601). Diese Formate steuern, wie Text als Datum erkannt und wie der Ausgabewert dargestellt wird.

### Aktionen

Aktion | Ausgabe | Bemerkung
--- | --- | ---
BIC | z.B. `BCAADEA0001` | SWIFT/BIC-Werte werden syntaktisch korrekt erzeugt, entsprechen jedoch keiner realen Bank. Das bedeutet: Der Code ist formal gültig, kann aber nicht über externe Bankverzeichnisse zugeordnet werden.
Betrag (Komma) Betrag (Punkt) Beispieleingabe: `600,00` | Einstellungen: Faktor für Gleitkommazahlen: `1,5`. Gleitkomma immer als Text `aktiv`. `900.00 (Punkt) 900,00 (Komma)` Gleitkomma immer als Text `inaktiv`. `900.00 intern`, die Anzeigeformatierung ist vom Anzeigeformat, das meist lokale-abhängig ist, abhängig. | Kann mit Faktor für Gleitkommazahlen `1,0` z.B. zum Konvertieren in einen Text verwendet werden. Sofern außer den reinen Zahlenwerten zusätzliche Texte wie z.B. `CHF, EUR`, etc. enthalten sind, wird die Ausgabe im Textformat gespeichert.
Datum | Zufällig verschobener Datumswert innerhalb des eingestellten Bereichs. | Einstellung für die Verschiebung in Tagen: Maximale Verschiebung für Datumswerte in Tagen Sofern der Eingabewert bei xlsx im Textformat vorliegt, (in Libreoffice `STRG+F8` drücken um berechenbare Felder anzuzeigen) oder bei Textdateien, muss unter Text zu Datum: Formatierung die korrekte Formatierung des Datums eingegeben werden, ansonsten wird ein Leerfeld erzeugt. Falls die Einstellung Datum immer als Text aktiv ist, die Einstellung Datum zu Text: Formatierung beachten.
Datum zu Text * | Der ursprüngliche Datumswert in benutzerdefiniertem Datumsformat als Text. Keine Pseudonymisierung. | Sofern der Eingabewert bereits als Text vorliegt: Die Einstellung Text zu Datum: Formatierung beachten. Für die Ausgabe die Einstellung Datum zu Text: Formatierung beachten.
Datum-Zeit | Ein bzgl. des Eingabewerts um Tage und Sekunden verschobener Datumswert. | Einstellung für die Verschiebung in Tagen: Maximale Verschiebung für Datumswerte in Tagen. Der Verschiebungsbereich für Sekunden beträgt `86400 sec (24h)`. Sofern der Eingabewert bereits als Text vorliegt: Die Einstellung Text zu Datum-Zeit: Formatierung beachten. Falls die Einstellung Datum-Zeit immer als Text aktiv ist, die Einstellung Datum-Zeit zu Text: Formatierung beachten.
Datum-Zeit zu Text * | Der ursprüngliche Datumswert in benutzerdefiniertem Datumsformat als Text. Keine Pseudonymisierung. | Sofern der Eingabewert bereits als Text vorliegt: Die Einstellung Text zu Datum-Zeit: Formatierung beachten. Für die Ausgabe die Einstellung Datum-Zeit zu Text: Formatierung beachten.
Domain | z.B. `xvddpatdirqt.invalid` |
Email | z.b. `byakorgaoeldvdls@example.invalid` |
Firma | z.B. `compmexgdsijvbunsu` |
Fortlaufende Zahl | Fortlaufende Zahl von 1 beginnend. |
Ganzzahl Beispieleingabe: `600` | Einstellungen: Faktor für Ganzzahlen: `1,5`. Resultat: `900` |
IBAN | z.B. `DE95000000000006545177` | IBAN-Werte werden syntaktisch korrekt erzeugt, entsprechen jedoch keiner realen Bank. Das bedeutet: Der Code ist formal gültig, kann aber nicht über externe Bankverzeichnisse zugeordnet werden. Die ersten zwei Buchstaben müssen einem gültigen EU-Land entsprechen, ansonsten Ausgabe: `Unsupported`.
IP | Einstellung Echtwerte simulieren: z.B. `2001:db8:dd1c:6035:79a2:18ac:d6d6:f11b` ansonsten z.B. `ippllfrrvvowelkbqd` | Ohne Echtwertsimulation Vorsilbe `ip`.
Name | z.B. `nameudojgoljwtejxy` | Vorsilbe `name`.
Ort | z.B. `placegdvbyjkkeius` | Vorsilbe `place`.
PLZ | Einstellung Echtwerte simulieren: z.B. `51128` ansonsten z.B. `24339152` |
Steuernummer | Einstellung Echtwerte simulieren: z.B. `2967510019` ansonsten z.B. `stno71566000418276` | Ohne Echtwertsimulation Vorsilbe `stno`.
Strasse | z.B. `strtefbvhvmkfse` | Vorsilbe `str`.
Strasse Nr | Eingabewert z.B. `Weg 123`. Einstellung Echtwerte simulieren: z.B. `sjxuywwp 123` ansonsten z.B. `strsjxuywwpygxo 123` | Ohne Echtwertsimulation Vorsilbe `str`.
Telefon | Eingabewert z.B. `030 000000`. Einstellung Echtwerte simulieren: z.B. `922116720` ansonsten z.B. `tel46645331375772` | Ohne Echtwertsimulation Vorsilbe `tel`.
Text | z.B. `txtzlhhmgcysorfyt` | Vorsilbe `txt`.
USt-ID | Einstellung Echtwerte simulieren: z.B. `DE3856574700` ansonsten z.B. `vatldshaoxfphfkacfo` | Ohne Echtwertsimulation Vorsilbe `vat`.
Uuid | z.B. `dce92d582e7143c993bac685465cc4ae` | Globale eindeutige ID.

### DataSheetObject – JavaScript-API

`DataSheetObject` stellt einen Zeilenbereich eines `QAbstractItemModel` für JavaScript zur Verfügung. Zeilen werden mit View-Index (`viewRow`) angesprochen, Spalten entweder über Index oder Feldnamen.

### Hinweise zu Zeilen- und Spaltenindizes

- `viewRow` ist 0-basiert innerhalb des Bereichs: `0 <= viewRow < numRows()`.

#### Hinweise zum Zugriff auf einen Spaltenindex per Feldnamen

Die internen Feldnamen sind:

- Bei Textdateien: Ganzzahlen (`1, 2, 3 ...`)

- Bei Excel-Dateien: Excel-Spaltennamen (`A, B, C ...`)

Sofern keine Titelzeile existiert, ist der Anzeigefeldname identisch mit dem internen Feldnamen. Existiert eine Titelzeile, ist der Anzeigefeldname der Spaltenname, der in der Feldnamenliste in eckigen Klammern steht.

### Basis-Informationen zum Datenbereich

#### Zeilenbereich

- `int numRows() const` Anzahl der Zeilen im Bereich. Ist `endRow < startRow`, ergibt sich `0`.

- `bool isEmpty() const` `true`, wenn `numRows() == 0`.

#### Spalteninformationen

- `int numCols() const` Anzahl der Spalten.

- `QString colName(int i, bool display = true) const` Gibt den Spaltennamen zu Index `i` zurück.

  - `display = true` → Anzeigename (sichtbarer Feldtitel)

  - `display = false` → interner Name (z. B. `A`, `B`, `1`, `2`)

- `int colNo(const QString &name, bool display = true) const` Liefert den Spaltenindex zu einem Feldnamen.

  - `display = true` → `name` ist Anzeigename

  - `display = false` → `name` ist interner Name Rückgabe `-1`, wenn der Name nicht gefunden wird.

### Textzugriff (String-basiert)

#### Lesen

- `QString getText(int viewRow, int col) const` Liefert den Text der Zelle (`Qt.DisplayRole`). Ungültiger Index → leerer String.

- `QString getText(int viewRow, const QString &name, bool internal = false) const` Wie oben, Spalte per Feldnamen.

  - `internal = false` → Anzeigename

  - `internal = true` → interner Name

#### Schreiben

- `bool setText(int viewRow, int col, const QString &s) const` Setzt den Text der Zelle (`Qt.EditRole`). Rückgabe: `true` bei Erfolg, sonst `false`.

- `bool setText(int viewRow, const QString &name, const QString &s, bool internal = false) const` Wie oben, Spalte per Feldnamen.

### Generischer Zugriff mit QVariant

#### Lesen

- `QVariant getValue(int viewRow, int col, int role = Qt.DisplayRole) const` Liefert den Zellenwert als `QVariant` für eine bestimmte Rolle (z. B. `Qt.DisplayRole`, `Qt.EditRole`).

- `QVariant getValue(int viewRow, const QString &name, bool internal = false, int role = Qt.DisplayRole) const` Wie oben, mit Spaltennamen.

#### Schreiben

- `bool setValue(int viewRow, int col, const QVariant &v, int role = Qt.EditRole) const` Setzt den Wert mit der angegebenen Rolle (Standard: `EditRole`).

- `bool setValue(int viewRow, const QString &name, const QVariant &v, bool internal = false, int role = Qt.EditRole) const` Wie oben, mit Spaltennamen.

### Typisierte Setter (Int, Int64, Double, Bool, String, Date, DateTime)

Alle diese Funktionen rufen intern `setValue()` mit einem passenden `QVariant` auf.

- `bool setInt(int viewRow, int col, int v) const`

- `bool setInt(int viewRow, const QString &name, int v, bool internal = false) const`

- `bool setInt64(int viewRow, int col, qint64 v, int role = Qt.EditRole) const`

- `bool setInt64(int viewRow, const QString &name, qint64 v, bool internal = false, int role = Qt.EditRole) const`

- `bool setDouble(int viewRow, int col, double v) const`

- `bool setDouble(int viewRow, const QString &name, double v, bool internal = false) const`

- `bool setBool(int viewRow, int col, bool v) const`

- `bool setBool(int viewRow, const QString &name, bool v, bool internal = false) const`

- `bool setString(int viewRow, int col, const QString &v) const`

- `bool setString(int viewRow, const QString &name, const QString &v, bool internal = false) const`

- `bool setDate(int viewRow, int col, const QDate &v) const`

- `bool setDate(int viewRow, const QString &name, const QDate &v, bool internal = false) const`

- `bool setDateTime(int viewRow, int col, const QDateTime &v) const`

- `bool setDateTime(int viewRow, const QString &name, const QDateTime &v, bool internal = false) const`

### Typisierte Getter (Int, Int64, Double, Bool, String, Date, DateTime)

Hier steckt zusätzliche Logik, z. B. Parsing von Währungsstrings.

#### Integer

- `int getInt(int viewRow, int col) const`

  - Wenn Zelle `QString` ist → Parsing über `parseCurrencyString(...)`.

  - Sonst → `v.toInt()`.

- `int getInt(int viewRow, const QString &name, bool internal = false) const`

#### 64-Bit Integer

- `qint64 getInt64(int viewRow, int col) const` Falls String → Parsing wie oben, sonst `toLongLong()`.

- `qint64 getInt64(int viewRow, const QString &name, bool internal = false) const`

#### Double

- `double getDouble(int viewRow, int col) const` String → `parseCurrencyString(...)`, sonst `toDouble()`.

- `double getDouble(int viewRow, const QString &name, bool internal = false) const`

#### Bool

- `bool getBool(int viewRow, int col) const`

  - `QVariant::Bool` → direkt.

  - String wird als `true` gewertet bei: `"true"`, `"1"`, `"yes"`, `"ja"`, `"wahr"` und als `false` bei: `"false"`, `"0"`, `"no"`, `"nein"`, `"falsch"`

  - Sonst Fallback → `v.toBool()`.

- `bool getBool(int viewRow, const QString &name, bool internal = false) const`

#### String

- `QString getString(int viewRow, int col) const` Liefert den Wert (EditRole) als String.

- `QString getString(int viewRow, const QString &name, bool internal = false) const`

#### Date

- `QDate getDate(int viewRow, int col) const`

  - `QDate` → direkt

  - `QDateTime` → Datumsteil

  - `QString` → Parsing über `dlg->readDateTime(...)` (inkl. Excel/1900/1904-Unterstützung) Ungültig → leeres `QDate`.

- `QDate getDate(int viewRow, const QString &name, bool internal = false) const`

#### DateTime

- `QDateTime getDateTime(int viewRow, int col) const`

  - `QDateTime` → direkt

  - `QDate` → Zeit = 00:00:00

  - `QString` → `dlg->readDateTime(...)` Ungültig → leeres `QDateTime`.

- `QDateTime getDateTime(int viewRow, const QString &name, bool internal = false) const`

### Spalten hinzufügen

- `int insertColumn(QString dispName)` Fügt am Ende des Datenblatts eine neue Spalte ein.

  Verhalten:

  - Bei CSV:

    - interner Name: laufende Nummer als Zeichenkette `"1"`, `"2"`, …

  - Bei XLSX:

    - interner Name: Excel-Spaltenname (`"A"`, `"B"`, …)

  - Wenn `hasHeader == true`:

    - in der Kopfzeile wird `dispName` eingetragen

  - Wenn `hasHeader == false`:

    - `dispName` wird auf den internen Namen gesetzt

  Rückgabewert:

  - `>= 0` → Index der neuen Spalte

  - `-1` → Einfügen fehlgeschlagen (z. B. Name doppelt oder Modell unterstützt die Operation nicht)

### Numerische Strings skalieren

- `QString scaleNumericString(const QString &s, double factor, int sep) const` Skaliert einen numerischen Wert, der in einem String steht (z. B. Betrag).

  Parameter:

  - `s` → Eingabestring (z. B. `"600,00"` oder `"600.00 EUR"`)

  - `factor` → Faktor (z. B. `1.5`)

  - `sep`:

    - `0` → Dezimaltrennzeichen Komma

    - `1` → Dezimaltrennzeichen Punkt

  Bei Erfolg → skalierter String, sonst wird `s` unverändert zurückgegeben. Mit `factor = 1.0` kann man z. B. auch nur das Format normalisieren.

### UI-Hilfsfunktionen

- `void messageBox(const QString &title, const QString &s) const` Zeigt eine einfache Info-MessageBox.

- `void toClipBoard(const QString &s) const` Kopiert den Text in die Systemzwischenablage.

### Dateien schreiben

- `bool writeUtf8TextFile(const QString &filePath, const QString &text, bool withBom) const` Schreibt eine UTF-8-Textdatei atomar auf die Platte.

  - `withBom = true` → mit UTF-8-BOM

  - `withBom = false` → ohne BOM Rückgabe: `true`, wenn kein Fehler aufgetreten ist.

- `QString writeUtf8TextFileEx(const QString &filePath, const QString &text, bool withBom) const` Erweiterte Variante mit Fehlertext:

  - Erfolg → leerer String

  - Fehler → Fehlermeldung als Text (für eigene Fehlerbehandlung im Script)

### Beispiel-Script

    // Spalte "Betrag" mit Faktor 1.5 multiplizierenconst col = DataSheetObject.colNo("Betrag");if (col >= 0) {    for (let r = 0; r < DataSheetObject.numRows(); r++) {        const oldValue = DataSheetObject.getDouble(r, col);        DataSheetObject.setDouble(r, col, oldValue * 1.5);    }    DataSheetObject.messageBox("Fertig", "Alle Beträge wurden skaliert.");} else {    DataSheetObject.messageBox("Fehler", "Spalte 'Betrag' nicht gefunden.");}

## DSGVO-Hinweis und empfohlene organisatorische Maßnahmen

Die Nutzung von mod_pseudo kann dazu beitragen, personenbezogene Daten gemäß Art. 5, 25 und 32 DSGVO datenschutzgerecht für Entwicklungs-, Test-, Schulungs- oder Supportzwecke aufzubereiten. Bei Verwendung der Funktion Feldinhalte löschen (Anonymisieren) werden die entsprechenden Daten irreversibel entfernt und gelten damit als anonymisiert. Bei der Pseudonymisierung werden Daten deterministisch ersetzt, sodass weiterhin eine technische Zuordnung möglich sein kann, sofern der HMAC-Schlüssel erhalten bleibt. Der Schlüssel wird nicht im Programm abgelegt und verbleibt vollständig in der Verantwortung des Anwenders.

Für einen DSGVO-konformen Einsatz werden folgende organisatorischen Maßnahmen empfohlen:

- Trennung von Produktiv- und Testsystemen: Pseudonymisierte oder anonymisierte Daten sollten ausschließlich in Test- oder Entwicklungsumgebungen genutzt werden.

- Sichere Schlüsselverwaltung: Der verwendete HMAC-Schlüssel sollte geschützt, dokumentiert und gemäß Sicherheitsrichtlinien verwahrt oder nach Bedarf gelöscht werden.

- Protokollierung und Dokumentation: Verarbeitungsschritte sollten nachvollziehbar dokumentiert werden, insbesondere wenn Zuordnungsdateien erzeugt und aufbewahrt werden.

- Minimierungsprinzip beachten: Es sollten nur diejenigen Felder pseudonymisiert oder anonymisiert werden, die für den vorgesehenen Zweck erforderlich sind.

- Zugriffsbeschränkungen: Pseudonymisierte Daten sollten nur Berechtigten zugänglich gemacht werden.

Diese Hinweise ersetzen keine rechtliche Beratung, unterstützen jedoch bei der sicheren und verantwortungsvollen Nutzung von mod_pseudo in datenschutzrelevanten Kontexten.

Haftungsausschluss: Diese Software wird „wie geliefert“ bereitgestellt. Es wird keine Garantie für Vollständigkeit, Richtigkeit, Eignung für einen bestimmten Zweck oder Fehlerfreiheit übernommen. Jegliche Verantwortung für die Interpretation der Ergebnisse, die Weiterverarbeitung der erzeugten Daten oder die Einhaltung rechtlicher oder regulatorischer Anforderungen liegt beim Anwender. Der Hersteller übernimmt keine Haftung für direkte oder indirekte Schäden, Datenverlust oder wirtschaftliche Folgeschäden, die durch den Einsatz dieser Software entstehen können.

© 2025 psynetic Software. Alle Rechte vorbehalten.