# 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.