# M1 Rekonstruierter Golden Master

Stand: 2026-07-12

Da kein alter MS-SQL-Datenbankstand verfügbar ist, wird M1 als rekonstruierter
Golden Master aufgebaut. Die Referenz entsteht aus Legacy-Code, Screenshots und
kontrollierten Testdaten in der MySQL-Dev-Datenbank.

## Ziel

Die wichtigsten fachlichen Regeln werden mit kleinen, nachvollziehbaren
Testfällen festgeschrieben. Diese Tests dienen später als Sicherheitsnetz für
die SaaS-Umstrukturierung.

## Testdaten-Gruppen

### Teilnehmer

- Aktives normales Mitglied.
- Aktiver Admin.
- Inaktives Mitglied.
- Mitglied mit PayPal-Namen.
- Mitglied ohne Buchungen.

### Buchungen

- Einzahlung mit positivem Betrag.
- Mehrere Einzahlungen an unterschiedlichen Tagen.
- Strichbuchung mit einem Strich.
- Strichbuchung mit zwei Strichen.
- Sammelerfassung für mehrere Teilnehmer.
- Web-Strich-Eintrag mit `Eintragsart = 2`.

### Salden

- Positiver Kontostand.
- Negativer Kontostand.
- Nullsaldo.
- Jahreswerte für aktuelles Jahr.
- Altdaten aus Vorjahr, die nicht in Jahreswerte fallen.

### CSV-Import

- Treffer über Name.
- Treffer über `paypalname`.
- Dublette gleicher Teilnehmer, Betrag und Datum.
- Unbekannter Name.
- Negativer oder leerer Betrag.

### Hinweise

- Aktiver Hinweis.
- Abgelaufener Hinweis.
- Neuer Hinweis über Admin-Formular.

## Erwartete Referenzwerte

Für jeden Testfall sollen erwartete Werte dokumentiert werden:

- Summe Einzahlungen.
- Summe Kosten.
- Summe Striche.
- Aktueller Stand.
- Jahresstriche.
- Jahreseinzahlungen.
- Jahresausgaben.
- Sichtbarkeit in Listen und Filtern.

## Umsetzungsvorschlag

1. `database/mysql-dev-schema.sql` um stabile Seed-Daten erweitern oder separates
   Seed-Skript anlegen. Erledigt mit `scripts/seed-golden-master.php`.
2. `scripts/init-mysql-dev.php` so erweitern, dass es die Testdaten idempotent
   anlegt. Entschieden: Golden-Master-Daten bleiben in einem separaten Skript,
   damit normale Dev-Daten nicht zwangsweise überschrieben werden.
3. Ein erstes Vergleichsskript `scripts/check-golden-master.php` erstellen.
   Erledigt.
4. Die wichtigsten Seiten per HTTP abrufen und auf erwartete Texte/Werte
   prüfen. Erledigt mit `scripts/http-smoke.php`.
5. Danach M2 starten: technisches Fundament für SaaS-Struktur. M1 ist als
   Sicherheitsnetz nutzbar; offene Dependency-Themen sind unten dokumentiert.

## Skripte

- `scripts/dev-db.php`: gemeinsame DB-Verbindung für Dev-Skripte.
- `scripts/golden-master-data.php`: definierte Testdaten und erwartete Werte.
- `scripts/seed-golden-master.php`: legt Golden-Master-Testdaten idempotent an.
- `scripts/check-golden-master.php`: prüft Salden, Jahreswerte, Rollen,
  Listenfilter, CSV-Lookup und Hinweise.
- `scripts/http-smoke.php`: ruft sichere GET-Seiten per HTTP ab und prüft auf
  HTTP 200, erwartete Texte und PHP-Fehlermarker.

## Ausführung

Mit normal installierter PHP-CLI:

```bash
php scripts/seed-golden-master.php
php scripts/check-golden-master.php
php scripts/http-smoke.php
```

In der aktuellen lokalen Umgebung mit entpacktem PHP:

```bash
LD_LIBRARY_PATH="$PWD/.local/php/usr/lib/x86_64-linux-gnu" \
  "$PWD/.local/php/usr/bin/php8.3" \
  -c "$PWD/.local/php-dev.ini" \
  scripts/seed-golden-master.php

LD_LIBRARY_PATH="$PWD/.local/php/usr/lib/x86_64-linux-gnu" \
  "$PWD/.local/php/usr/bin/php8.3" \
  -c "$PWD/.local/php-dev.ini" \
  scripts/check-golden-master.php

LD_LIBRARY_PATH="$PWD/.local/php/usr/lib/x86_64-linux-gnu" \
  "$PWD/.local/php/usr/bin/php8.3" \
  -c "$PWD/.local/php-dev.ini" \
  scripts/http-smoke.php
```

Die Skripte erwarten die bekannten Dev-Umgebungsvariablen `DB_HOST`, `DB_NAME`,
`DB_USER` und `DB_PASS`.

## Abgedeckte Testfälle

| Testfall | Fixture |
| --- | --- |
| Admin mit Buchung | `gm-admin@test.local` |
| Positiver Saldo mit Vorjahresdaten | `gm-positive@test.local` |
| Negativer Saldo | `gm-negative@test.local` |
| Nullsaldo | `gm-zero@test.local` |
| Inaktives Mitglied | `gm-inactive@test.local` |
| PayPal-Name für CSV-Lookup | `gm-paypal@test.local` |
| Mitglied ohne Buchungen | `gm-empty@test.local` |
| Vieltrinker für Vorderseite | `gm-heavy@test.local` |
| Aktiver Hinweis | `[GM] Aktiver Hinweis für Golden-Master-Test` |
| Abgelaufener Hinweis | `[GM] Abgelaufener Hinweis für Golden-Master-Test` |

## HTTP-Smoke-Abdeckung

Der HTTP-Smoke-Test prüft nur GET-Seiten ohne bekannte Schreib- oder
Versand-Nebenwirkungen.

| Seite | Erwartung |
| --- | --- |
| `index.php` | Dashboard lädt für `Test Admin` |
| `stricheintragen.php` | Stricherfassung lädt |
| `einzahlung.php` | Einzahlungserfassung lädt |
| `kaffeeliste.php` | Gesamtübersicht lädt |
| `mitarbeiterverwalten.php` | Mitgliederverwaltung inkl. `PayPal-Name` lädt |
| `letzteneintraege.php` | letzte Einzahlungen und Striche laden |
| `csvupload.php` | CSV-Upload-Formular lädt |
| `hinweise.php` | Hinweisverwaltung lädt |
| `faq.php` | FAQ lädt |
| `namenanpassen.php` | Namensanpassung lädt |
| `teilnehmerauswertung.php?user_id=1` | Teilnehmerauswertung für Dev-Admin lädt |
| `mailausgebe.php` | Mailadress-Ausgabe lädt |
| `umfrage.php` | geschlossene Umfrage lädt |
| `umfrageergebnisse.php` | Umfrageauswertung lädt |

## Akzeptanzkriterien

- Testdaten sind reproduzierbar.
- Tests können mehrfach laufen, ohne Duplikate zu erzeugen.
- Salden und Jahreswerte sind automatisch prüfbar.
- CSV-Importfälle sind fachlich abgedeckt.
- Die wichtigsten UI-Seiten liefern HTTP 200 ohne PHP-Warnings.
- Seiten mit Schreib- oder Versand-Nebenwirkungen werden nicht automatisch per
  GET ausgeführt, sondern als Risiko dokumentiert.

## Gefundene Fehler und Bewertung

Im M1-Abschlusslauf wurden folgende Punkte geprüft:

- `number_format(null)` in `kaffeeliste.php`: behoben; leere Summen werden als
  `0` behandelt.
- `paypalname` in der Mitgliederverwaltung: eingepflegt und im Golden Master
  abgedeckt.
- `umfrage.php`: `mb_strtolower()` ist in der lokalen PHP-Umgebung nicht
  verfügbar; Fallback auf `strtolower()` ergänzt.
- `exportKaffeeliste.php`: Pfad auf `TCPDF/tcpdf.php` korrigiert. Der Export
  bleibt trotzdem als bekannter Dependency-Fehler offen, weil die TCPDF-Kopie im
  Repo unvollständig ist und `TCPDF/include/tcpdf_font_data.php` fehlt.
- `mailversenden.php`: nicht automatisch per HTTP ausgeführt, weil ein GET bei
  vollständiger PHPMailer-Installation E-Mails versenden kann. Zusätzlich ist
  die PHPMailer-Kopie im Repo unvollständig.
- `jahresauswertung.php`: nicht automatisch per HTTP ausgeführt, weil ein GET
  Jahresbuchungen schreiben und E-Mails versenden kann. Zusätzlich ist die
  PHPMailer-Kopie im Repo unvollständig.

## Aktueller Prüfstatus

Stand 2026-07-12:

- `scripts/seed-golden-master.php` erfolgreich gegen die MySQL-Dev-Datenbank
  ausgeführt.
- `scripts/check-golden-master.php` erfolgreich ausgeführt.
- Zweiter Seed+Check-Lauf erfolgreich, Idempotenz bestätigt.
- Ergebnis: 104 Assertions bestanden.
- `scripts/http-smoke.php` erfolgreich gegen `http://127.0.0.1:8080`
  ausgeführt.
- Ergebnis: 14 sichere Seiten bestanden ohne `Deprecated`, `Warning`,
  `Fatal error`, `Parse error`, `Notice` oder `Uncaught Error`.
- Bekannter offener Punkt: PDF-Export wegen unvollständiger TCPDF-Abhängigkeit.
- Bewusst nicht automatisch ausgeführt: `mailversenden.php` und
  `jahresauswertung.php`, da GET dort Nebenwirkungen haben kann.
