# Changelog StrategieSchmiedeVerein

## v7.0.0 – „Vereinsverwaltung komplett" (September 2026)

Hauptversion: vier neue Zusatzmodule, die Buchhaltungslogik aus dem Hauptprogramm in testbare
Module ausgelagert, alle Punkte des Audits 09/2026 umgesetzt. EULA 4.0 – Anwender müssen den
Rechtstexten beim ersten Start neu zustimmen. Datenbank-Schema 6 (Migration läuft automatisch;
vorher wird eine Sicherung `…_vor_migration` angelegt). Bestehende v6.x-Daten werden übernommen.

### 🚨 Kritische Fehler behoben

- **Zwei gleichzeitig laufende Programme zerstörten die Datenbank**: Beide teilten sich die
  entschlüsselte Arbeitskopie; beendete man das erste, verschlüsselte und löschte es sie – das
  zweite schrieb danach eine leere Datenbank über die echte. Jetzt Einzelinstanz-Sperre
  (`ssv.lock` im Datenordner, `acquire_instance_lock`), Meldung „läuft bereits“; zusätzlich
  prüft `crypto` vor dem Verschlüsseln, dass die Arbeitskopie ein plausibler Nachfolger des
  letzten Stands ist (leere/fremde Datei überschreibt die `.db.enc` nicht mehr).
- **Master-Passwort setzen/ändern machte ältere Backups unlesbar**: Schlüssel-Umhüllung
  (Key-Wrapping). Datenbank und alle Backups sind mit einem gleichbleibenden Datenschlüssel
  verschlüsselt; DPAPI bzw. Master-Passwort schützen nur diesen. Bestehende Installationen
  werden übernommen (der bisherige Schlüssel wird zum Datenschlüssel).
- **Fehlender Schlüssel führte zu Absturz oder – schlimmer – zu einem neuen Schlüssel**: Liegt
  eine verschlüsselte Datenbank vor, wird nie ein neuer Schlüssel erzeugt (`KeyMissingError`).
  Stattdessen erscheint vor dem Hauptfenster ein Startdialog (Datenordner kopiert, anderes
  Windows-Konto, Master-Passwort vergessen) mit der Möglichkeit, eine portable Sicherung
  einzuspielen; die unlesbaren Dateien werden in `unlesbar_…` aufbewahrt.
- **Geldbestand**: Kassa-/Bankstand wurden an mehreren Stellen unterschiedlich berechnet; im
  E/A-PDF wurde der Eröffnungssaldo abgezogen statt addiert, und sobald ein Geldkonto in einer
  Umbuchung vorkam, fiel der gesamte E/A-Geldbestand aus der Vermögensübersicht (Aktiva 0,00).
  Jetzt eine zentrale Funktion `db.geld_saldo()` (Eröffnungssaldo, E/A-Buchungen, Umbuchungen),
  die Dashboard, Kassa-/Bankbuch, E/A-Rechnung, Vermögensübersicht und Prüfbericht verwenden.
  Passivkonten bei Umbuchungen mit richtigem Vorzeichen (Darlehen aufnehmen/tilgen, Rücklagen).
- **PRAE**: Empfänger und Auszahlungen ließen sich in migrierten Datenbanken nicht anlegen
  (`NOT NULL constraint failed`, Schema von Migration 1 passte nicht zum Modul) → Migration 5
  baut die Tabellen um, Bestandsdaten bleiben. ZVR/UID des Vereins erschienen nie auf der
  PRAE-Aufstellung (falsche Konfigurationsschlüssel).
- **Vollexport (CSV/JSON)** brach ab; jetzt alle Tabellen aus `sqlite_master`, UTF-8-BOM,
  Semikolon, Dezimalkomma (`csv_zahl`), Beleg-Anhänge enthalten.
- **Update**: Die Datenbank wurde geschlossen, bevor der Austausch der EXE überhaupt begonnen
  hatte (scheiterte der Austausch, lief das Programm ohne Datenbank weiter). Austausch-Skript
  ohne Umlaute/Pfade (Codepage), Warten auf Prozessende; Neustart mit bereinigter Umgebung
  (`_PYI_*`, `_MEIPASS2`, `PYINSTALLER_RESET_ENVIRONMENT` – sonst nutzte die neue EXE den
  gleich darauf gelöschten Entpackordner der alten: „Failed to load Python DLL“); Bereinigung
  löscht nur eigene `.old`-Dateien.
- **Startpasswort `Admin2026!` konnte beim erzwungenen Wechsel wiederverwendet werden** und ist
  jetzt gesperrt (`BLOCKED_PASSWORDS`).
- **Eröffnungssaldo**: Neuerfassung storniert die alten Eröffnungsbuchungen in derselben
  Transaktion; negative Anfangsbestände werden abgelehnt (Bankschulden sind Verbindlichkeiten).
- **Rechnungsnummern** kamen aus `MAX(rechnungsnr)+1` – nach einem Storno/Export konnte eine
  Nummer doppelt vergeben werden. Jetzt dauerhafter Zähler je Jahr (`config
  rechnungsnr_zaehler_<Jahr>`), Rechnungsnummer per Trigger unveränderlich, Rechnungen nicht
  löschbar.
- Spendenbestätigung: Einzel- und Sammelbestätigung widersprachen einander (Übermittlung,
  Sachspenden); einheitliche Texte in `strategieschmiede_pdf.py`.

### 🧩 Neue Module

Zusatzmodule hängen sich über `pages/plugins.py` ein (Menüpunkt, Rollen, Tabellen); sie sind
in der Standardauslieferung enthalten, brauchen aber keine Änderung am Hauptprogramm.

- **💳 Beiträge & SEPA** (`strategieschmiede_beitraege.py`, Rollen Admin/Kassier): Beitrags-
  kategorien (Standard: Ordentlich 60 €, Jugend 30 €, Familie 90 €, Fördernd 50 €, Ehrenmitglied
  0 €), Zuordnung je Mitglied mit Ermäßigung, Vorschreibungen je Periode (jährlich bis
  monatlich), Zahlungserfassung mit E/A-Buchung, Erlass/Storno, SEPA-Lastschriftmandate
  (IBAN-Prüfziffer, Gläubiger-ID, Mandatsreferenz, Verfall nach 36 Monaten ohne Einzug),
  SEPA-Lastschriftdatei **pain.008.001.08** mit Prüfung, Vorankündigung als PDF, Rücklastschrift
  mit Gebühr, dreistufiges Mahnwesen (Zahlungserinnerung, 1./2. Mahnung, Mahngebühr,
  Serien-PDF), Offene-Posten-Liste (PDF/CSV).
- **🏦 Bankimport** (`strategieschmiede_bankimport.py`, Admin/Kassier): Kontoauszüge als
  CAMT.053/052, MT940 oder CSV (Profile: Erste/Sparkasse George, Raiffeisen ELBA, BAWAG/
  easybank, Bank Austria, Volksbank, bank99, generisch mit Spaltenerkennung; eigene Profile
  speicherbar). Dublettenprüfung per Fingerabdruck, Buchungsvorschläge (Regeln, Mitglied über
  IBAN/Name, offene Rechnungen `RE-JJJJ-NNNN`, offene Vorschreibungen, SEPA-Sammler,
  Bankspesen, Zinsen/KESt, Umbuchung Kassa↔Bank), Aufteilung (Split), Ignorieren mit Grund,
  Rückgängig (Storno), Saldoabgleich gegen den Auszug. Buchungen entstehen ausschließlich per
  INSERT (unveränderlich).
- **🏛️ Vereinsorganisation** (`strategieschmiede_organisation.py`, Admin/Kassier/Obmann):
  Funktionäre/Organe mit Funktionsperiode (Warnung vor Ablauf; Funktionsperiode laut Statuten,
  § 3 Abs 2 Z 7 VerG; § 14 VerG Meldung binnen 4 Wochen, mindestens 2 Rechnungsprüfer), Sitzungen mit Einladung,
  Anwesenheit, Beschlüssen und Protokoll-PDF, GV-Status (§ 5 Abs 2 VerG), Veranstaltungen mit
  Checkliste (Veranstaltungsgesetz, AKM, Registrierkasse, Jugendschutz …), Helfern, Projekt-
  auswertung und Stundenzähler für das „kleine Vereinsfest“ (72 h/Jahr), Inventar mit
  Inventarnummer, Ausleihe und Listen (PDF/CSV).
- **✉️ Kommunikation** (`strategieschmiede_kommunikation.py`, Admin/Kassier/Obmann):
  Empfängerauswahl mit Filtern und gespeicherten Verteilern, Serienbrief-PDF mit Platzhaltern
  und Vorlagen (Sie/Du), Etiketten (Avery/Zweckform 3475, 3474, 3652, 3422, L7163, eigenes
  Format, Namensschilder), E-Mail-Verteiler (Zwischenablage, CSV/TXT, mailto-Blöcke – kein
  Versand aus dem Programm), Geburtstags-/Jubiläums-/Mitglieder-/Telefon-/Anwesenheitslisten,
  Statistik, Mitglieder-Import aus CSV (Encoding-/Trennererkennung, Spaltenzuordnung,
  Dubletten, Importvorlage), DSGVO-Karte (Informationspflicht Art. 13 als PDF-Muster).
- **Fachlogik ohne Oberfläche** (direkt testbar): `strategieschmiede_fakturierung.py`
  (Rechnung, Zahlungseingang, Storno, Eröffnungssaldo), `strategieschmiede_verwaltung.py`
  (Benutzer, Projekte, Stichprobe), `strategieschmiede_berichte.py` (Vermögensübersicht,
  Datumsprüfung, Spendensuche, Textlayout).
- `tools/keygen.py` ersetzt `strategieschmiede_keygen.py` (gleiche Schlüsseldatei wie
  `tools/sign_release.py`, Optionen `--generate-keys`, `--customer`, `--months`/`--expires`,
  `--verein`, `--type`, `--verify`).

### 💶 Buchhaltung und Fakturierung

- Rollenmodell durchgesetzt: `PAGE_ROLES` ist die einzige Quelle für Navigation, Tastenkürzel,
  Dashboard-Kacheln und `_show_page()`; Schreibrechte (`SCHREIB_ROLLEN` Admin/Kassier/Obmann)
  werden in jedem Dialog geprüft, Rechnungsprüfer sehen Berichte und Protokoll nur lesend.
- Zahlungseingang zu einer Rechnung über eigenen Dialog (Datum, Zahlungsart, Einnahmenkonto),
  Buchung nach der Bruttomethode mit Belegnummer des Buchungsjahres; Mitgliedsrechnungen
  schreiben `beitrag_bezahlt_bis` fort.
- Stornorechnungen: Rechnungsstorno erzeugt eine Stornorechnung mit eigener Nummer und
  negativen Beträgen, storniert die Zahlungsbuchung mit; Buchungsstorno setzt die Rechnung auf
  „offen“.
- Kleinunternehmer: als Kleinunternehmer eingestellte Vereine können keine USt ausweisen;
  USt-Ausweis verlangt die UID des Vereins; Rechnungen ohne USt tragen den Befreiungsgrund
  (Kleinunternehmer, echter Mitgliedsbeitrag, § 6 Abs 1 Z 14 UStG, Liebhaberei, Freitext).
- Kaufmännische Rundung der Rechnungssummen, Zahlungsziel 0–365 Tage, Rückfrage bei
  Rückdatierung vor die letzte Rechnung oder mehr als 30 Tage in der Zukunft.
- Buchungsdatum: Jahr < 2000 wird abgelehnt, Zukunft und Daten außerhalb des laufenden/vorigen
  Wirtschaftsjahres nur nach Rückfrage.
- Kontenrahmen österreichisch (Migration 6, nur unveränderte Standardbezeichnungen):
  „Zweckbetrieb“ → Unentbehrlicher Hilfsbetrieb, „Wirtschaftl. Betrieb“ →
  Begünstigungsschädlicher Betrieb, „Veranstaltungen“ → Entbehrlicher Hilfsbetrieb,
  „GEMA / AKM“ → AKM / austro mechana, Steuern und Abgaben, AfA, Rücklagen.
- Sphären im Kontenrahmen (ideell, unentbehrlicher/entbehrlicher Hilfsbetrieb,
  begünstigungsschädlich, Vermögensverwaltung) je Erfolgskonto, Vorschlag aus der Kategorie.
- Steuer-Übersicht: KöSt-Schätzung je Sphäre (Freibetrag 10.000 € § 23 KStG, Satz 23 %),
  Warnung bei Überschreiten der § 45a BAO-Grenze (100.000 € Umsatz begünstigungsschädlicher
  Betriebe), Kleinunternehmergrenze 55.000 € brutto mit 10 %-Toleranz (bis 2024: 35.000 €
  netto, 15 %), Hinweise zu Liebhaberei und Vorsteuer.
- PRAE: Einsatzmonat je Auszahlung (720-€-Grenze gilt je Kalendermonat der Tätigkeit),
  Personenkreis (nur Sportler, Schiedsrichter, Sportbetreuer – keine Funktionäre), Meldung
  L 19 über ELDA bis Ende Februar, monatsweiser Ausschluss zur Freiwilligenpauschale seit 2026.
- Spendenbestätigung: Meldung an FinanzOnline erfolgt durch den Verein; Sachspenden von
  Privatpersonen sind nicht absetzbar; neutrale Zuwendungsbestätigung ohne SO-Nummer.
- Eindeutige Belegnummern per Index (nur nicht stornierte Buchungen); Buchungstext,
  Zahlungsart, Erfasser und Erfassungszeit sind unveränderlich (Korrektur nur über Storno).
- Beispieldaten nur noch auf ausdrücklichen Wunsch im Einrichtungsassistenten (Standard aus);
  sie tragen eine Kennzeichnung, da Buchungen nicht löschbar sind.
- Vereinswissen und Vereinspflichten auf Rechtsstand 09/2026 (Freiwilligenpauschale 30/1.000 €
  und 50/3.000 €, KU-Grenze 55.000 €, Registrierkasse 15.000/7.500 €, Spendenmeldung,
  L 19, Insichgeschäfte § 6 Abs 4 VerG).

### 🔒 Sicherheit und Datensicherung

- Einzelinstanz-Sperre (siehe oben); `diagnose.py` läuft gefahrlos neben dem Programm
  (`SSV_DIAGNOSE=1`, nimmt die Sperre nicht und öffnet die Datenbank nicht).
- Backup-Aufbewahrung nach Regel (`backups_zum_loeschen`): automatische Sicherungen – vom
  laufenden Tag die letzten 6, je Tag die letzte für 30 Tage, je Monat die letzte für
  12 Monate, die allerletzte immer; manuelle und anlassbezogene Sicherungen (`manuell`,
  `vor_restore`, `vor_schluesselwechsel`, `vor_migration`) getrennt, die letzten 20 je Art.
  Automatische Sicherung nur, wenn sich seit der letzten etwas geändert hat.
- Portable Sicherung (`.ssvbackup`, Format 2) nimmt den Ordner `belege` mit (bis 300 MB) und
  sagt, ob er enthalten war; Wiederherstellung entpackt nie außerhalb des Beleg-Ordners.
- Lizenz: abgelaufener Schlüssel bleibt gespeichert (`expired_license`), Nur-Lese-Modus statt
  Aussperren; Testzeitraum wird zusätzlich außerhalb der Datenbank vermerkt (Löschen der
  Datenbank startet ihn nicht neu); zurückgestellte Systemuhr wird erkannt, gerechnet wird mit
  dem zuletzt gesehenen Datum. Produkt ist Teil der Signatur; Leerzeichen im Schlüssel egal.
- Prüfkette: `INSERT OR REPLACE` kann die Sperren nicht mehr umgehen (eigene Trigger,
  `recursive_triggers`); Protokolleinträge nur über `audit_log()` (Hash-Pflicht-Trigger);
  Kettenkopf (`audit_chain_head`) wird im Prüfbericht abgedruckt und kann später mit
  `verify_audit_anchor` verglichen werden.
- CSV-Injection-Schutz (`csv_safe`) in allen CSV-Exporten (Vollexport, Beiträge, Kommunikation,
  Organisation); Dezimalkomma in CSV.
- Passwortregeln überall gleich (`validate_password`: mindestens 8 Zeichen, Groß- und
  Kleinbuchstaben, Ziffer, Sperrliste); Passwort-Reset durch Admin hebt die Login-Sperre auf;
  der letzte aktive Admin kann nicht deaktiviert werden.
- Fehlerberichte und Protokoll ohne Windows-Kontonamen (`shorten_user_path`); rotierende
  Logdatei (5 × 1 MB) statt Monatsdateien; Tk-Callback-Fehler landen im Crash-Handler.
- Update: Self-Update weiterhin nur mit Ed25519-Signatur von der Hersteller-Domain;
  Versionsdatei `https://www.strategieschmiede.at/version/strategieschmiedeverein.json`.

### ⚖️ Rechtstexte (EULA 4.0 – Anwender müssen neu zustimmen)

- B2C-Haftung nach österreichischem Recht formuliert: bei leichter Fahrlässigkeit Haftung für
  Sach- und Vermögensschäden ausgeschlossen, außer bei Verletzung einer wesentlichen
  Vertragspflicht (Speicherung, Verschlüsselung, Wiederherstellbarkeit der Vereinsdaten – dann
  Haftung auf den vorhersehbaren Schaden begrenzt); Personenschäden sowie Vorsatz/grobe
  Fahrlässigkeit unbeschränkt (§ 6 Abs 1 Z 9 KSchG, OGH 1 Ob 243/16s).
- Nur noch **Jahreslizenz**: 12 Monate ab Aktivierung des Lizenzschlüssels in der Software,
  keine automatische Verlängerung. Die in früheren Fassungen beschriebene „Einmallizenz“ wurde
  nie angeboten und ist aus EULA und AGB gestrichen. Lizenzschlüssel tragen jetzt die Laufzeit
  in Monaten; das Ablaufdatum entsteht bei der Aktivierung (wer spät aktiviert, verliert keine
  Laufzeit). Bereits ausgestellte Schlüssel mit festem Ablaufdatum bleiben gültig.
- AGB: Telefonnummer des Anbieters (§ 4 Abs 1 Z 2 FAGG), Vertragsschluss mit der
  Bestellbestätigung, Wortlaut der Erklärungen zum Widerrufsrecht (Ausführung =
  Übermittlung des Lizenzschlüssels), neuer Punkt 3 d) Systemvoraussetzungen und Funktionsweise
  (§ 4 Abs 1 Z 17 und 18 FAGG: Kopierschutz, Nur-Lese-Modus, kein macOS/Linux), Wegfall der
  Kleinunternehmerregelung ohne Preiserhöhung während der Laufzeit, Verzugszinsen
  „9,2 Prozentpunkte“ (§ 456 UGB).
- EULA: Bestandteil des Bestellvertrags (keine „Installations“-Zustimmung), keine Registrierkasse
  iSd § 131b BAO/RKSV, Kündigung nur nach Abmahnung mit Regelung der Restlaufzeit, Änderungen der
  EULA gelten für laufende Lizenzen nur mit Zustimmung (alte Fassung gilt bis Lizenzende, Nur-Lese-
  Zugriff bleibt immer), Vermutung des § 11 VGG, Information über Aktualisierungen auch per E-Mail,
  Rechtswahl mit Hinweis auf zwingendes Verbraucherrecht des Aufenthaltsstaats (Rom I-VO).
- Datenschutzhinweis: Inhalt des Fehlerberichts vollständig beschrieben (Stack-Trace,
  Paketversionen, letzte 50 Protokollzeilen – können Benutzernamen enthalten), Speicherdauer der
  Server-Protokolle, Hosting-Anbieter, Widerspruch (Update-Suche abschalten) und Beschwerderecht.
- Hinweis in Haftungsausschluss, EULA und AGB: Vereine ohne Unternehmen (§ 1 Abs 2 KSchG) sind
  Verbraucher – Widerrufsrecht, VGG (24 Monate, Aktualisierungspflicht) und B2C-Haftung gelten.
- EULA nennt die Zusatzmodule, den Nur-Lese-Modus (auch nach Ablauf der Testversion; neuer
  Schlüssel hebt ihn sofort auf) und die Aktualisierungspflicht nach § 7 VGG samt Folgen einer
  unterlassenen Installation; Versionsbeispiele 7.x/8.x.
- Datenschutzhinweis: neue Verarbeitungen (SEPA-Mandate mit IBAN/BIC lokal verschlüsselt,
  Kontoauszugsdaten aus dem Bankimport, Verteiler/Serienbriefe/CSV-Import, Organisation),
  Speicherorte inkl. `.keys` (`keymeta`, `ssv_state.json`), `ssv.lock`, Backup-Aufbewahrung,
  Key-Wrapping (ältere Backups bleiben lesbar), erzeugte Dateien sind unverschlüsselt, kein
  E-Mail-Versand aus der Software.
- Widerrufsbelehrung: Online-Widerrufsfunktion (§ 13a FAGG) gilt für Verträge ab 01.10.2026,
  ohne Anmeldung erreichbar, Bestätigung per Schaltfläche, Eingangsbestätigung mit Datum/Uhrzeit
  – stimmig mit `website/widerrufsfunktion.html`.
- Widerrufsbelehrung: Telefonnummer, Ausführungsbeginn = Übermittlung des Lizenzschlüssels,
  Support/Updates als Nebenleistung; der Hinweis zur Testversion steht jetzt außerhalb der
  Belehrung (Musterschutz § 4 Abs 3 FAGG).
- Impressum: Gewerbewortlaut lt. GISA und Telefonnummer (§ 4 Abs 1 Z 2 FAGG); § 14 UGB entfällt
  (gilt nur für Firmenbuch-Unternehmer), Geschäftsbezeichnung ergänzt;
  `website/impressum_offenlegung.html` mit Offenlegung nach § 25 MedienG für die Website.
- Website: `website/agb.html`, `eula.html`, `widerrufsbelehrung.html` werden mit
  `tools/export_legal_html.py` aus den Programmtexten erzeugt (Test prüft Gleichheit);
  Bestellflow mit Pflichtangaben vor dem Button „Zahlungspflichtig bestellen“ (§ 8 FAGG);
  Online-Widerrufsfunktion mit Footer-Link, Bestätigungsseite und Server-Hinweisen.
- Neuer Ordner `vertrieb/` (Herstellerunterlagen, nicht im Kundenpaket): Vorlagen für
  Bestellbestätigung (§ 7 Abs 3 FAGG), Rechnung (§ 11 UStG), Eingangsbestätigung Widerruf
  (§ 13a FAGG), Hinweis nach § 19 Abs 2 AStG, Datenschutzerklärung der Website, AVV-Muster für
  Support-Fälle (Art 28 DSGVO) und Muster-Eintrag Verarbeitungsverzeichnis für Vereine.
- `THIRD_PARTY_LICENSES.txt` neu erzeugt: `tools/collect_licenses.py` liefert jetzt auch
  Volltexte für Pakete ohne Lizenzdatei (Apache-2.0, MIT, BSD, PSF, Tcl/Tk, OpenSSL in den
  cryptography-Binärdateien, PyInstaller-Ausnahme).
- Rechtsprüfung Runde 4 (09/2026):
  - Alle Herstellerdaten (Telefon, Gewerbewortlaut, GISA-Zahl, Hoster, E-Mail-Anbieter,
    Speicherdauer der Server-Protokolle) stehen an EINER Stelle
    (`strategieschmiede_config.ANBIETER`); Impressum, EULA, AGB, Widerrufsbelehrung,
    DSGVO-Hinweis, Website-Seiten und die Vertriebsvorlagen (`.template` → erzeugte Datei) werden
    daraus befüllt. Der Release-Build prüft auch `website/*.html` und `vertrieb/*` auf offene
    Platzhalter.
  - Bestellflow: Der Widerrufsverzicht (Checkbox 1 und 2) ist freiwillig; ohne ihn wird der
    Lizenzschlüssel nach Zahlungseingang, frühestens nach Ablauf der 14-tägigen Widerrufsfrist
    übermittelt (AGB 2b, 5b; Bestätigungsmail in zwei Varianten).
  - Lizenz: Der Schlüssel ist innerhalb von 3 Monaten nach Übermittlung zu aktivieren, die
    Lizenz endet spätestens 15 Monate nach Übermittlung (EULA 4a, AGB 6; `keygen.py` setzt die
    Obergrenze automatisch). Die Software weist ab 30 Tagen vor Lizenzende beim Start auf das
    Ablaufdatum hin (EULA 4b) – statt einer technisch nicht leistbaren E-Mail-Erinnerung
    „rechtzeitig vor Ablauf“.
  - Anonymisierung (Art. 17 DSGVO): Klarnamen in Buchungstexten werden – wie auf Rechnungen –
    erst nach Ablauf der Aufbewahrungsfrist (§ 131, § 132 BAO) ersetzt; die Rückmeldung nennt
    Anzahl und frühestes Freigabedatum. Betrag, Datum, Konto bleiben immer unverändert. Der
    Vorgang ist auch im Nur-Lese-Modus möglich (Betroffenenrechte).
  - Werbeabgabe: Freigrenze nach § 4 Abs 4 WerbeAbgG 2000 – Warnung, sobald 10.000 € erreicht
    sind; Bemessungsgrundlage Nettoentgelt (Orientierungswert aus Bruttobuchungen); RIS-Link
    korrigiert.
  - Freiwilligenpauschale: Meldung mit Formular E 29 (BMF) bis Ende Februar des Folgejahres.
  - Spendenmeldung: Spalten Referenznummer (`SP-<Spender-ID>-<Jahr>`) und Übermittlungsart
    (Erstmeldung/Änderung/Storno) sowie Hinweis auf das BMF-Uploadformat.
  - Kommunikation → DSGVO: Muster-Verarbeitungsverzeichnis (Art. 30 DSGVO) als PDF, mit den
    Vereinsdaten befüllt.
  - Werbebestätigung Sportverein 0 %: Rechtsgrundlage § 6 Abs 1 Z 14 UStG bzw.
    Liebhabereivermutung (LVO § 2 Abs 5 Z 2, VereinsR Rz 463 ff).

### 📝 Fach- und Rechtsprüfung 10/2026 (Textkorrekturen, keine neue EULA-Fassung)

- Kleinunternehmer-Toleranz in Vereinswissen und Pflichten-Seite nach § 6 Abs 1 Z 27 UStG idF
  AbgÄG 2024: Überschreitung um höchstens 10 % im Kalenderjahr → Befreiung bis Jahresende, ab dem
  Folgejahr steuerpflichtig; mehr als 10 % → Steuerpflicht ab dem überschreitenden Umsatz
  (statt „einmaliges Überschreiten“).
- FAQ Freiwilligenpauschale: PRAE darf weiterhin ausbezahlt werden; für Monate mit PRAE derselben
  Organisation ist das Pauschale nicht steuerfrei und die Jahresgrenze wird um 1/12 je Monat
  gekürzt (§ 3 Abs 1 Z 42 EStG idF AbgÄG 2025).
- Navigationspfade berichtigt (Einstellungen → Programm → Rechtliches → DSGVO, → Programm →
  Online-Update, → Buchhaltung, → Sicherheit & Daten → …; Mitglieder → „DSGVO-Auskunft (Art 15)
  exportieren“) in Pflichten-Seite, DSGVO-Hinweis, Verarbeitungsverzeichnis-Muster, Handbuch,
  Installationsanleitung.
- Lizenz-Seite: „Anwendungsberatung zur Software € 70,–/Std. (keine Steuer- oder Rechtsberatung)“.
- Systemvoraussetzungen (AGB 3d, Installationsanleitung, Schnellstart, Bestellblock,
  Bestellbestätigung): Hinweis, dass Windows 10 seit 14.10.2025 keine Sicherheitsupdates mehr
  erhält – empfohlen Windows 11.
- Bestellblock: Aktivierungsfrist 3 Monate / Lizenzende spätestens 15 Monate nach Zusendung jetzt
  in der Zeile „Laufzeit“ (§ 8 FAGG). Bestellung per E-Mail: ohne Erklärungen in Textform immer
  Variante B (Bestellbestätigungs-Vorlage, Release-Checkliste).
- AGB 7 und Widerrufsbelehrung: Online-Widerrufsfunktion nur „sofern der Vertrag über die
  Online-Bestellfunktion geschlossen wurde“ (§ 13a FAGG) – die Info-Website darf ohne
  Bestell-Backend vorab online gehen (Release-Checkliste, Abschnitt „Website-Go-live“).
- Vereinswissen: Link „Vereinswesen (BMI)“ (statt „Vereinsrichtlinien“), Findok-Startseite statt
  Session-URL. Konto 4700: „nicht steuerbare Vermögensverwaltung (KESt von der Bank einbehalten)“.
  Gläubiger-ID: vergibt die OeNB, Antrag über die Hausbank.
- Website-Dateien ohne interne Kommentare: `bestellflow_widerrufsverzicht.html` und
  `widerrufsfunktion.html` werden jetzt wie die übrigen Seiten aus `.template`-Quellen erzeugt;
  `tools/export_legal_html.py` entfernt Kommentarblöcke `<!-- HERSTELLER: … -->`. Die Hinweise
  stehen gesammelt in `website/LIESMICH_HERSTELLER.md`; neu `HERSTELLERDATEN_EINTRAGEN.md`.

### 🧹 Sonstiges

- Dokumentation neu: `HANDBUCH.md` (Anwenderhandbuch), `CHANGELOG.md`,
  `INSTALLATIONSANLEITUNG.txt` (Umzug nur über portable Sicherung – Ordner kopieren
  funktioniert wegen DPAPI nicht), `SCHNELLSTART.txt`, `BUILD_ANLEITUNG.txt`,
  `README_ENTWICKLER.txt`, `tests/README.md`, `pages/REFACTORING_GUIDE.md`;
  `requirements-dev.txt` (pytest, PyInstaller, pyflakes). `INTEGRATION_v55.txt` entfernt
  (beschrieb die längst erledigte Integration der v5.5-Module).
- Build: alle neuen Module in `build_exe.py` (`MODULES`, `pages/plugins.py`), Hersteller-
  Werkzeuge (`tools/`) werden aus der EXE ausgeschlossen und im Paket gesucht;
  `THIRD_PARTY_LICENSES.txt`, `INSTALLATIONSANLEITUNG.txt`, `SCHNELLSTART.txt`, `HANDBUCH.md`
  und `CHANGELOG.md` liegen jedem Paket bei (`build_exe.CUSTOMER_DOCS`,
  `create_release.CUSTOMER_FILES`); `pages.plugins` als Hidden-Import; Probebuild unter
  Linux möglich (Icon wird dort übersprungen); `create_release.py --nur-beilagen` packt die
  Beilagen ohne EXE. Neu: `RELEASE_CHECKLISTE.md` (Hersteller-Ablauf Schlüssel → Build →
  Signatur → Update-Datei → Lizenz).
- Datenordner-Migration von `%LOCALAPPDATA%\StrategieSchmiedeVerein` (bis v5.4) nach
  `%APPDATA%\StrategieSchmiede\StrategieSchmiedeVerein` kopiert nur (nichts wird gelöscht)
  und nur, wenn am neuen Ort noch keine Datenbank liegt.
- Tests: 556 Tests in 30 Dateien (`tests/`), darunter GUI-Tests gegen das echte Hauptfenster
  (`xvfb-run -a python -m pytest tests -q`).

## v6.4.0 – „Datensicherheit und Rechtsstand 09/2026" (September 2026)

### 🚨 Kritische Fehler behoben

- **Datenverlust nach Absturz**: Beim Start wurde die verschlüsselte Datei immer über die
  Arbeitskopie entpackt – nach Absturz/Stromausfall waren die Buchungen der letzten Sitzung weg.
  Jetzt wird eine vorhandene, unbeschädigte Arbeitskopie übernommen (Hinweis beim Start),
  eine beschädigte aufbewahrt und der letzte Stand geladen. Zusätzlich verschlüsselte
  Zwischensicherung alle 5 Minuten; der Klartext wird beim Beenden erst nach geprüfter
  Verschlüsselung gelöscht.
- **Backups lagen im Klartext**: `create_backup` rief eine nicht mehr existierende
  Crypto-Funktion auf. Backups werden wieder verschlüsselt (konsistent über die SQLite-
  Backup-API). „Wiederherstellen" prüft die Datei, entschlüsselt `.db.enc`, sichert vorher
  den aktuellen Stand und funktioniert auch über den Neustart hinweg.
- **Steuer-Übersicht stürzte immer ab** (falsche Spaltennamen, fehlender Farbschlüssel);
  abweichendes Wirtschaftsjahr endet jetzt am richtigen Monatsletzten.
- **Betragseingabe**: „1.500" wurde als 1,50 € gebucht, „1.234,56" abgelehnt. Neuer Parser
  `parse_betrag` an allen Eingabestellen (Buchung, Rechnung, PRAE, Serienrechnung, Budget …).

### 🔒 Sicherheit und Nachvollziehbarkeit

- **Lizenzablauf sperrt nicht mehr aus**: Nur-Lese-Modus (Ansehen, Drucken, PDF-/CSV-Export)
  statt Programmende – der Verein kommt immer an seine aufbewahrungspflichtigen Daten.
- **Self-Update nur mit Hersteller-Signatur** (Ed25519 über Version + SHA-256) und nur von
  der Hersteller-Domain per HTTPS. Release signieren: `tools/sign_release.py`.
  Update-Suche ist abschaltbar (Einstellungen → Online-Update).
- **Änderungsprotokoll mit Prüfkette** (SHA-256-Verkettung) und Datenbank-Sperren:
  Protokoll nicht änder-/löschbar; Buchungen nicht löschbar, Kernfelder unveränderlich,
  Storno nicht rücknehmbar. Status der Prüfkette auf der Protokoll-Seite.
- **Master-Passwort** jetzt wirklich nutzbar: Abfrage beim Start, Setzen/Ändern in den
  Einstellungen; offene Schlüsseldatei wird beim Umstieg gelöscht.
- Altes HMAC-Lizenzverfahren samt eingebettetem Geheimnis entfernt.

### ⚖️ Rechtstexte (EULA v3.2 – Anwender müssen neu zustimmen)

- „Vollständig offline" → ehrliche Beschreibung der Update-Suche (IP-Adresse, Version).
- Verweis auf die eingestellte EU-OS-Plattform entfernt; § 19 AStG bleibt.
- Widerrufsbelehrung: Online-Widerrufsfunktion (§ 13a FAGG, ab 01.10.2026) und dritte
  Voraussetzung für das Erlöschen (Bestätigung auf dauerhaftem Datenträger);
  neue Vorlage `website/widerrufsfunktion.html`.
- „inkl. MwSt." entfernt (Kleinunternehmer). Gerichtsstand: sachlich zuständiges Gericht.
- EULA: kein „widerrufliches" Nutzungsrecht; Nur-Lese-Modus; Aktualisierungspflicht (VGG);
  Datenverlust-Klausel an die B2C-Haftung angepasst.
- Formulare K2/U1/U30 richtig benannt, KZ 016 für Kleinunternehmer, Freibetrag § 23 KStG,
  Registrierkassen-Grenzen (15.000/7.500, 72 Stunden, Kantine 52 Tage/45.000).
- Spendenbestätigung: Meldung erfolgt durch den Verein, nicht durch die Software.
- Drittanbieter-Lizenzen vollständig: `THIRD_PARTY_LICENSES.txt` (wird beim Build erzeugt).

### 🧹 Sonstiges

- Versionsnummer nur noch an einer Stelle (`strategieschmiede_config.py`).
- Build: fehlende Hidden-Imports ergänzt (`pages.*`, `PIL._tkinter_finder`, `tkinter.simpledialog`).
- Bericht brach bei leerer Kontokategorie ab; unlesbare Reiter in der Steuer-Übersicht.
- 30 neue Regressionstests (`tests/test_v64_korrekturen.py`).

**Bewusst nicht geändert:** Beträge werden weiterhin als Kommazahl (REAL) gespeichert; die
Eingabe wird aber centgenau gerundet. Eine Umstellung auf ganze Cent wäre ein eigener Umbau.

## v6.3.0 – „Rechtssicherheit und Architektur" (April 2026)

Dieses Update vollendet die rechtliche Compliance für den kommerziellen
Vertrieb und legt die Grundlage für eine wartbare Architektur.

### 🔐 Datenbank-Verschlüsselung gehärtet

**Geändertes Modul:** `strategieschmiede_crypto.py`

Der Fernet-Schlüssel wird nicht mehr unverschlüsselt auf der Festplatte
abgelegt. Zwei echte Schutzmodi stehen zur Verfügung:

- **DPAPI** (Windows-Standard): Der Schlüssel wird mit der Windows Data
  Protection API ans Windows-Benutzerkonto gebunden. Nur der gleiche User
  auf dem gleichen Rechner kann ihn entpacken.
- **Master-Passwort**: PBKDF2-HMAC-SHA256 mit 600.000 Iterationen. Der
  Schlüssel existiert nie dauerhaft auf der Festplatte.

Die Legacy-v1-Schlüssel werden beim ersten Start automatisch auf DPAPI
migriert. Eine Password-Change-Funktion ist eingebaut.

**Neue öffentliche API:**
- `get_encryption_mode()` – aktueller Schutzmodus
- `change_to_password_mode(new_password)` – DPAPI → Password wechseln
- `change_password(old, new)` – Master-Passwort ändern

### 📜 DSGVO-Hinweis ehrlich formuliert

Der Datenschutzhinweis (`strategieschmiede_legal.py`) erklärt jetzt
präzise, was die Verschlüsselung schützt (Laptop-Diebstahl, anderer
Windows-User) und was nicht (Memory-Dump der laufenden Instanz, Beleg-
Anhänge, Screenshots). Dies verhindert irreführende Werbeaussagen.

### ⚖️ Vollständiges Impressum nach § 5 ECG und § 14 UGB

In `strategieschmiede_config.py`:

- Kleinunternehmer-Klausel nach § 6 Abs. 1 Z 27 UStG explizit ausgewiesen
- Gewerbebehörde: Bezirkshauptmannschaft Neunkirchen mit Kontaktdaten
- Wirtschaftskammer Niederösterreich + Fachverband UBIT mit Web-Links
- Online-Streitbeilegungs-Link nach Art. 14 ODR-VO
- Verbraucherschlichtungs-Klausel nach § 19 AStG
- RIS-Link zur Gewerbeordnung
- Urheberrechts-Hinweis

### 📝 AGB für Kleinunternehmer umgestellt

`strategieschmiede_legal.py` § 4 der AGB:

- Alte 20%-USt-Klausel entfernt (als Kleinunternehmer rechtlich unzulässig)
- Kleinunternehmer-Klausel mit Hinweis auf fehlenden Vorsteuerabzug
- Status-Änderungsklausel für den Fall, dass die KU-Grenze überschritten wird
- B2B- und B2C-Verzugszinsen getrennt (9,2 % UGB vs. 4 % ABGB)
- Anbieter-Adressblock im AGB-Header

### 🛡️ Haftungsausschluss zweistufig (B2B/B2C)

Der pauschale Ausschluss war bei Verbrauchern angreifbar. Neu:

- **B2B**: Haftungskappe 3× Jahreslizenzpreis, mindestens 500 €
- **B2C**: Personenschäden unbeschränkt, Kardinalpflichten-Regelung,
  PHG bleibt unberührt
- Haftungsausschluss für fehlerhafte Eingaben des Anwenders bleibt

### 🛒 FAGG-konformer Bestellflow-Snippet

`website/bestellflow_widerrufsverzicht.html` – HTML+CSS+JS-Snippet für
die Checkout-Seite mit drei getrennten Pflicht-Checkboxen:
1. Ausdrückliche Zustimmung zur sofortigen Ausführung
2. Kenntnisnahme des dadurch erlöschenden Widerrufsrechts
3. Akzeptanz von AGB/EULA/Datenschutzhinweis

Backend-Pflichten (Protokollierung mit Zeitstempel, IP, Dokumentversionen,
E-Mail-Bestätigung) sind als ausführbarer Kommentar dokumentiert.

### 📋 AVV-Muster nach Art. 28 DSGVO

Für Support-Fälle mit Einblick in Vereinsdaten (Fernwartung, Übermittlung einer
Datenbank- oder Protokolldatei, Screenshots mit Mitgliederdaten) stellen wir auf
Anfrage ein Muster eines Auftragsverarbeitungsvertrags samt technischen und
organisatorischen Maßnahmen zur Verfügung (seit v7.0.0: `vertrieb/avv_muster_support.md`
beim Hersteller; Anfrage an office@strategieschmiede.at).
### 🏗️ Monolith-Splitting begonnen (Mixin-Pattern)

Die Hauptdatei `strategieschmiedeverein.py` wird schrittweise modularisiert.
Neues `pages/`-Package mit Mixin-basierten Page-Klassen:

- `pages/audit.py` → `AuditPageMixin` (Änderungsprotokoll)
- `pages/delegations.py` → `DelegationPagesMixin` (PRAE, Steuer)
- `pages/REFACTORING_GUIDE.md` – Schritt-für-Schritt-Anleitung für
  weitere Extraktionen

**Hauptklasse** erbt jetzt von den Mixins:
```python
class VereinsBuchhaltung(AuditPageMixin, DelegationPagesMixin, ctk.CTk):
```

Zero-Behavior-Change-Refactoring: die Logik ist identisch, nur die Struktur
sauberer. Hauptdatei geschrumpft: **5807 → 5703 Zeilen** (−104).

### 🧪 Test-Suite erweitert

Neue Test-Module:
- `tests/test_crypto.py` – 30 Tests (PBKDF2, DPAPI-Pfad, Password-Modus,
  Legacy-Migration, DB-Roundtrip, Password-Change)
- `tests/test_legal_consistency.py` – 29 Tests (Impressum-Pflichtangaben,
  AGB-Konsistenz, Haftungsausschluss-Struktur, Kreuzkonsistenz)
- `tests/test_pages_structure.py` – 10 Tests (Mixin-Package,
  Strukturregression)

**Gesamt-Status: 156 Tests, 151 passed, 5 skipped**
(Skips: 4× customtkinter in headless-CI, 1× DPAPI auf Linux)

### 📦 Zur Migration bestehender Installationen

Alle Änderungen sind **rückwärtskompatibel**:
- Bestehende Legacy-Keys (v1) werden beim ersten Start auf DPAPI migriert
- Neue Felder `leistungsdatum` (Rechnungen) werden durch DB-Migration 004
  automatisch ergänzt
- Die öffentliche Crypto-API (`init_db_encryption()` etc.) ist unverändert

### ⏭️ Für v6.4.0 geplant

- Weitere Page-Extraktionen (siehe `pages/REFACTORING_GUIDE.md`)
- Mahnwesen (1./2./letzte Mahnung, Verzugszinsen)
- SEPA-Lastschrift-Export (pain.008 XML)
- camt.053-Import für Kontoauszüge
- E-Rechnung (ZUGFeRD 2.x / Peppol) für B2B-Kunden
- DASP-XML-Export für FinanzOnline (Spendenbegünstigung)

---

## v6.2.0 – „Verkaufsfähigkeits-Update" (April 2026)

Umfangreiches Update zur Vorbereitung des kommerziellen Vertriebs.

### ✅ § 11 UStG-konforme Rechnungs-PDFs

**Neues Modul:** `strategieschmiede_invoice_pdf.py`

Die erzeugten Rechnungs-PDFs enthalten nun alle Pflichtangaben gemäß § 11 Abs. 1 UStG:

- Name und Anschrift des Ausstellers (inkl. ZVR und UID)
- Name und Anschrift des Leistungsempfängers
- Rechnungsdatum **und** Leistungs-/Lieferdatum (getrennt, wie in UStG gefordert)
- Fortlaufende Rechnungsnummer
- Menge und Bezeichnung der Leistung
- Netto, USt-Satz, USt-Betrag, Brutto (aufgeschlüsselt)
- Kleinunternehmer-Klausel nach aktuellem § 6 Abs. 1 Z 27 UStG (Stand 01.01.2025)

Darüber hinaus:

- Absender-Zeile im Fenster-Couvert-Format (oben klein, unterstrichen)
- Vollständiger Absender-Block rechts oben (Name, Adresse, Kontakt, ZVR, UID)
- Impressum-Footer auf jeder Seite

### 🏦 EPC-QR-Code für Banking-Apps

Jede Rechnung enthält nun einen **EPC-QR-Code nach EPC069-12 (Stuzza-Standard)**.
Der Vereinsmitglied scannt ihn mit seiner Banking-App (Erste, Raiffeisen, BAWAG,
Bank Austria, Sparkasse …) und alle Überweisungsdaten sind automatisch gefüllt.

Implementierung: bevorzugt `segno` (pure Python, ~40 KB), Fallback auf `qrcode`.

### 🗄 Datenbank-Migration 004

`leistungsdatum` (TEXT) wurde zur Tabelle `rechnungen` hinzugefügt. Die Migration
erfolgt automatisch beim ersten Start der neuen Version — bestehende Rechnungen
bleiben unverändert, leere `leistungsdatum`-Felder fallen im PDF auf das
Rechnungsdatum zurück.

### 🧪 Automatisierte Test-Suite

Neues Verzeichnis `tests/` mit pytest-basierter Regressionsprüfung:

- `tests/test_utils.py` – Euro-Formatierung, Datumsparsing, Passwort-Hashing
- `tests/test_business_logic.py` – Belegnummern, Lücken-Erkennung, Storno, Rechnungsrechnung
- `tests/test_invoice_pdf.py` – EPC-QR-Payload, PDF-Generierung, Formatierung

**86 Tests**, alle grün. Aufruf: `pytest` aus dem Projekt-Root.

### 📝 UI-Änderung: Leistungsdatum im Rechnungs-Dialog

Im „Neue Rechnung"-Dialog gibt es jetzt ein optionales Feld „Leistungsdatum"
neben dem Rechnungsdatum. Bleibt das Feld leer, wird das Rechnungsdatum als
Leistungsdatum im PDF verwendet.

### 🔧 Build-Änderungen

- `requirements.txt` erweitert um `segno>=1.5`
- `build_exe.py` MODULES erweitert um `strategieschmiede_invoice_pdf.py`
- `build_exe.py` Hidden-Imports erweitert um `segno`

### ℹ️ Hinweise zur Installation

```bash
# Abhängigkeit installieren
pip install segno

# Oder per requirements.txt
pip install -r requirements.txt

# Tests laufen lassen (empfohlen vor jedem Build)
pip install pytest
pytest

# Build wie gewohnt
python build_exe.py
```

### 🔜 Noch offen (für v6.3.0 und später)

- Mahnwesen (1./2./letzte Mahnung, Verzugszinsen)
- SEPA-Lastschrift-Export (pain.008 XML)
- camt.053-Import für Kontoauszüge
- E-Rechnung (ZUGFeRD 2.x / Peppol) für B2B-Kunden
- DASP-XML-Export für FinanzOnline (Spendenbegünstigung)
