# AI Overview ## Ziel Digitaler Mitgliedsantrag für Feuerwehrverein mit Flatfile-Speicherung und Admin-Backend. ## General Principles - Mobile first und responsive über alle Frontend-Seiten. - Upload UX mit zwei Pfaden: Datei auswählen oder Foto aufnehmen. - Startfluss beginnt mit einer Disclaimer-Seite (Text aus Konfiguration). ## Architekturkarte - Frontend Wizard: `index.php` + `assets/js/form.js` - API: - `api/load-draft.php` - `api/save-draft.php` - `api/submit.php` - `api/reset.php` - `api/upload-preview.php` - `api/delete-upload.php` - Admin: - `admin/login.php` - `admin/auth.php` - `admin/index.php` - `admin/application.php` - `admin/download.php` - `admin/download-zip.php` - `admin/export-pdf.php` - `admin/delete.php` - `admin/test-mail.php` - `admin/cleanup.php` - Kernlogik (`src/`-Ordner strukturiert nach Domains): - `src/autoload.php` (Basis Autoloader) - `src/app/bootstrap.php` (App-Initialisierung und Konfiguration) - `src/storage/jsonstore.php` - `src/storage/fileuploadstore.php` - `src/storage/filesystem.php` - `src/form/validator.php` - `src/security/csrf.php` - `src/security/ratelimiter.php` - `src/mail/mailer.php` (HTML-Mails + PDF-Anhänge) - `src/mail/mimemailbuilder.php` (MIME-Mails via nativer mail()-Funktion) - `src/mail/pdfgenerator.php` (FPDF, Antrags- und Anlagen-PDFs) - `src/mail/submissionformatter.php` (Formulardaten für Mail/PDF aufbereiten) - Bibliotheken: - `lib/fpdf/` — FPDF 1.86, einzelne Klasse + Schrift-Metriken ## Datenfluss 1. Nutzer gibt E-Mail ein. 2. `load-draft` prüft zuerst Submission (Unique-Constraint), dann Draft. 3. Wizard speichert regelmäßig per `save-draft`; Uploads werden zusätzlich sofort nach Dateiauswahl hochgeladen. 4. Uploads werden in `storage/uploads/{application_key}/{field}/{rand8}/{original_filename}` geschrieben. 5. `submit` führt atomaren Lock + Validierung + Submission + Mailversand aus. 6. Admin liest Submission-JSONs und bietet Downloads. ## Apache-Hinweis - Deploy auf Apache mit `mod_rewrite`. - `AllowOverride All` muss aktiv sein, damit die Root-`.htaccess` greift. - Sensitive Ordner werden via `.htaccess` blockiert. ## Änderungs-Guide - Neue Formularfelder: `config/form_schema.php` - Pflichtregeln ändern: `config/form_schema.php` (`required` / `required_if`) - Upload-Typen/Limits: `config/app.local.php` + optional pro Feld im Schema - Admin-Session/Login: `config/app.local.php` + `admin/auth.php` - Mailtexte/Empfänger: `config/mail.local.php` + `src/mail/mailer.php` - Retention-Tage: `config/app.local.php` + Cron `admin/cleanup.php` - Rate-Limit-Parameter: `config/app.local.php -> rate_limit` (Details: `docs/rate_limiting.md`) - Disclaimer-Startseite: `config/app.local.php -> disclaimer` + `index.php` - Versionskontrollierte Config-Vorlagen: `config/app.sample.php`, `config/mail.sample.php` - Lokale Runtime-Configs (nicht versioniert): `config/app.local.php`, `config/mail.local.php` ## Harte Regeln - Ein Antrag pro E-Mail (Submission blockiert weitere Anträge). - Drafts: 14 Tage, Submissions: 90 Tage. - Keine DB-Pflicht, Flatfile-only. - Keine Paketmanager (kein Composer). Bibliotheken liegen direkt in `lib/`.