# Sponsoren-Verwaltungssystem

Ein PHP-basiertes Verwaltungssystem für Sponsoren mit JSON-Datenspeicherung. Komplett webbasiert, keine Datenbank erforderlich.

## Features

✅ **Sponsoren-Management**
- Firmen und Kontaktdaten verwalten
- Mehrere Ansprechpartner pro Sponsor (mit Name, Email, Telefon, Position)
- Sponsoring-Kategorien (Hauptsponsor, Gold, Silber, Bronze, Unterstützer)
- Status-Tracking (individuell konfigurierbar)
- Bearbeiter-Zuordnung mit Typeahead-Autocomplete
- Logo-Upload für jeden Sponsor
- Volltextsuche mit Filterung nach Kategorie und Status
- Kommunikations-Protokoll für jeden Sponsor

✅ **Vertrags-Management**
- Mehrjahres-Verträge (dynamische Jahresverwaltung)
- Sponsoring-Beträge und Leistungsbeschreibungen pro Jahr
- Bearbeiter intern/extern mit Autocomplete
- Statusprotokoll mit Chronologie (Datum + Eintrag)
- Finanzielle Übersicht über alle Jahre
- Ablaufdatum-Tracking mit Warnungen

✅ **Leistungs-Tracking**
- Kategorie-spezifische Leistungs-Templates
- Erbrachte Leistungen dokumentieren
- Social-Media-Status (Post, Story, Newsletter)
- Fälligkeitsdatum mit Überfällig-Tracking
- Status: offen, in_bearbeitung, erledigt
- Kanban-Board-Ansicht gruppiert nach Sponsor
- Accordion-Design für übersichtliche Darstellung
- Archivierungs-Funktion für abgeschlossene Leistungen
- Auto-Refresh nach Änderungen

✅ **Dashboard**
- Statistik-Übersicht (Sponsoren-Anzahl, Finanzen)
- Kategorien-Verteilung mit Farb-Badges
- Status-Verteilung
- Offene und überfällige Aufgaben
- Auslaufende Verträge (konfigurierbare Warnfrist)
- Finanzielle Summen pro Jahr

✅ **Benutzerfreundlichkeit**
- Toast-Benachrichtigungen statt störender Alert-Dialoge
- Moderne Confirm-Dialoge als Toast-Komponenten
- Section-Persistenz (bleibt auf aktiver Seite beim Neuladen)
- Responsive Design mit Bootstrap 5
- Mobile-freundliche Navigation

✅ **Admin-Panel**
- Kategorie-Verwaltung mit Farbzuordnung
- Status-Verwaltung (hinzufügen, bearbeiten)
- Bearbeiter-Liste pflegen
- Leistungs-Templates pro Kategorie konfigurieren
- Webhook-Konfiguration für externe Integrationen
- Dashboard-Einstellungen (Warnzeiträume)
- Benutzerverwaltung (Rollen zuweisen, Benutzer aktivieren/deaktivieren)

✅ **Authentifizierung & Mehrbenutzer-Support**
- Microsoft Entra ID Login (SSO)
- Automatische Benutzer-Registrierung (Auto-Provisioning)
- 4 Rollen: Admin, Editor, Viewer, Contributor
- Rollenbasierte Berechtigungen (RBAC)
- Standard-Rolle: Viewer (nur Lesezugriff)
- Admins können Rollen über das Admin-Panel ändern
- Benutzer-Aktivitätstracking
- Letzte-Login-Anzeige im Benutzermenü

✅ **Datenmanagement**
- JSON-Export für Backups
- CSV-Import für Masseneingabe
- Automatische Backups bei Änderungen
- Unverschlüsselte, lesbare JSON-Dateien
- Filterbare und durchsuchbare Listen

## Installation & Setup

### Voraussetzungen
- PHP 7.4+ (mit `json` Extension)
- Webserver (Apache, Nginx, etc.) oder PHP Built-in Server
- Schreibrechte für `/data/` Ordner

### 1. Dateien hochladen
```bash
# Alle Dateien in das Web-Root Verzeichnis kopieren
cp -r * /var/www/html/sponsoren/
```

### 2. Verzeichnis-Berechtigungen setzen
```bash
# Dateirechte für Datenordner
chmod 700 data/
chmod 600 data/*.json

# Optional: Benutzer-Zuordnung (z.B. für Apache)
chown -R www-data:www-data data/
```

### 3. Lokales Testing mit PHP Built-in Server
```bash
cd /path/to/sponsoren
php -S localhost:8000 -t public
```

Dann öffnen Sie: `http://localhost:8000`

### 4. Mit Apache/Nginx
Stellen Sie sicher, dass:
- `public/` is die DocumentRoot
- `.htaccess` ist aktiviert (Apache)
- `mod_rewrite` ist aktiviert (Apache)

## Authentifizierung & Zugangskontrolle

Das System unterstützt **zwei Authentifizierungsmethoden**:

### 1. Microsoft Entra ID (direkt)

Der Login erfolgt direkt gegen Microsoft Entra ID. Das Frontend holt ein ID-Token und sendet es an das Backend, welches das Token validiert und eine Session anlegt.

**Konfiguration:**
1. Kopiere `config.example.php` nach `config.php`
2. Öffne das Admin-Panel und hinterlege unter Microsoft Entra die App-Daten:
  - `auth.entra.tenant_id`
  - `auth.entra.client_id`
  - `auth.entra.redirect_uri`
  - `auth.entra.enabled = true`
3. (Optional) Lege erlaubte Domains fest in `data/einstellungen.json`:
  - `auth.entra.allowed_domains`

**Claims-Mapping (Standard):**
- `email` oder `preferred_username` wird als E-Mail verwendet
- `preferred_username` als Benutzername (Fallback: E-Mail)
- `name` als Anzeigename (Fallback: E-Mail)

### 2. Passwort-basierte Admin-Authentifizierung

Zusätzlich zur Entra-Authentifizierung können Sie sich **direkt mit einem Admin-Passwort** anmelden:

1. Navigieren Sie zu `login.html`
2. Geben Sie das Admin-Passwort ein (Standard: `admin123`)
3. Sie werden als Administrator angemeldet
4. Das dezente Benutzermenü in der Sidebar zeigt Ihren Namen und Ihre Rolle

**Benutzeroberfläche:**
- Kompakte Benutzeranzeige oben in der Sidebar
- Dezentes Icon und graue Farben für unauffällige Integration
- Rolle wird als kleiner Badge angezeigt
- Logout-Button als Icon rechts im Benutzerbereich
- Admin-Benutzer sehen zusätzlich den Link "Verwaltung" im Tools-Bereich

#### Passwort ändern:
```json
// In data/einstellungen.json
{
  "auth": {
    "admin_password": "IhrSicheresPasswort",
    "enable_password_login": true
  }
}
```

**Wichtig:** Das Passwort wird im Klartext gespeichert. Für Produktionsumgebungen sollten Sie:
- Ein starkes Passwort verwenden
- Die Datei `einstellungen.json` mit `chmod 600` schützen
- Idealerweise nur Entra-Authentifizierung nutzen

### Rollen & Berechtigungen

| Rolle | Sponsoren | Verträge | Leistungen | Einstellungen | Benutzer-Admin |
|-------|-----------|----------|------------|---------------|----------------|
| **Admin** | Alle Rechte | Alle Rechte | Alle Rechte | ✅ Bearbeiten | ✅ Verwalten |
| **Editor** | ✅ Erstellen, Bearbeiten | ✅ Erstellen, Bearbeiten | ✅ Erstellen, Bearbeiten | 👁️ Nur Ansicht | ❌ |
| **Viewer** | 👁️ Nur Ansicht | 👁️ Nur Ansicht | 👁️ Nur Ansicht | 👁️ Nur Ansicht | ❌ |
| **Contributor** | 👁️ Nur Ansicht | 👁️ Nur Ansicht | ✅ Erstellen, Bearbeiten | 👁️ Nur Ansicht | ❌ |

### Rollen-Verwaltung
1. Alle neuen Benutzer bekommen automatisch die Rolle **Viewer**
2. Admins können über das **Admin-Panel** → Tab **Benutzer** Rollen ändern
3. Admins können Benutzer aktivieren/deaktivieren

### Konfiguration (data/einstellungen.json)
```json
{
  "auth": {
    "default_rolle": "viewer",
    "session_timeout": 3600,
    "auto_provision": true,
    "admin_password": "admin123",
    "enable_password_login": true,
    "entra": {
      "allowed_domains": []
    }
  }
}
```

## Dateistruktur

```
sponsorenprogramm/
├── KONZEPT.md                    # Projektkonzept und Architektur
├── README.md                     # Diese Datei
├── .htaccess                     # Apache Sicherheitsregeln
├── config.example.php            # Konfigurationsbeispiel
│
├── src/                          # PHP-Backend-Logik
│   ├── Database.php              # JSON-Datei-Manager
│   ├── SponsorManager.php        # Sponsoren CRUD
│   ├── VertragManager.php        # Vertrags CRUD
│   ├── LeistungManager.php       # Leistungs CRUD
│   ├── KommunikationManager.php  # Kommunikations-Protokoll
│   ├── FieldManager.php          # Dynamische Feldverwaltung
│   ├── AuthManager.php           # Session-Authentifizierung
│   ├── EntraAuthManager.php      # Entra Token-Validierung
│   ├── UserManager.php           # Benutzerverwaltung
│   └── PermissionManager.php     # Berechtigungsprüfung
│
├── public/                       # Web-Dokumentroot
│   ├── index.html                # Hauptanwendung
│   ├── admin.html                # Admin-Panel
│   ├── app.js                    # Frontend JavaScript
│   ├── api.php                   # API Handler
│   ├── bootstrap.min.css         # Bootstrap 5 Styles
│   ├── bootstrap.bundle.min.js   # Bootstrap 5 + Popper.js
│   ├── bootstrap-icons.css       # Bootstrap Icons
│   └── fonts/                    # Icon-Fonts
│
└── data/                         # JSON-Datenspeicherung
    ├── sponsoren.json            # Alle Sponsoren
    ├── vertraege.json            # Verträge & Finanzen
    ├── leistungen.json           # Erbrachte Leistungen
    ├── kommunikation.json        # Kommunikations-Protokoll
    ├── einstellungen.json        # System-Konfiguration
    ├── benutzer.json             # Benutzerdaten & Rollen
    ├── aktivitaeten.json         # Benutzer-Aktivitätslog
    └── backups/                  # Automatische Backups
```

## JSON-Format

### Sponsoren (data/sponsoren.json)
```json
{
  "sponsoren": [
    {
      "id": 1,
      "firmenname": "Beispiel GmbH",
      "ansprechpartner": "Max Mustermann",
      "ansprechpartner_liste": [
        {
          "name": "Max Mustermann",
          "email": "max@example.de",
          "telefon": "+49 123 456789",
          "position": "Geschäftsführer"
        }
      ],
      "email": "max@example.de",
      "telefon": "+49 123 456789",
      "berufsbezeichnung": "Geschäftsführer",
      "status": "aktiv",
      "kategorie": "Silber",
      "bearbeiter_intern": "Martin",
      "logo": "data:image/png;base64,...",
      "erstellt": "2026-01-01",
      "aktualisiert": "2026-02-20",
      "notizen": "Zusätzliche Informationen..."
    }
  ]
}
```

### Verträge (data/vertraege.json)
```json
{
  "vertraege": [
    {
      "id": 1,
      "sponsor_id": 1,
      "jahre": {
        "2025": {
          "betrag": 2000,
          "leistungen": "Logo auf Website, 2 Social Media Posts"
        },
        "2026": {
          "betrag": 2500,
          "leistungen": "Logo auf Website, 3 Social Media Posts"
        }
      },
      "bearbeiter_intern": "Martin",
      "bearbeiter_extern": "Lukas",
      "laeuft_aus_am": "2026-12-31",
      "statusprotokoll": [
        {
          "datum": "2026-02-16",
          "eintrag": "Email versendet"
        }
      ],
      "allgemeine_bemerkungen": "Verlängerung geplant",
      "erstellt": "2026-01-01",
      "aktualisiert": "2026-02-20"
    }
  ]
}
```

### Leistungen (data/leistungen.json)
```json
{
  "leistungen": [
    {
      "id": 1,
      "sponsor_id": 1,
      "vertrag_id": 1,
      "kategorie": "Silber",
      "erhaltene_leistung": "Finanzielle Unterstützung 2025",
      "verwendetes_bild": "logo_sponsor.jpg",
      "social_media": {
        "post": true,
        "story": true,
        "newsletter": false
      },
      "fehlende_leistung": "",
      "bearbeiter": "Alyssa",
      "zu_erledigen_bis": "2026-03-31",
      "status": "in_bearbeitung",
      "sonstiges": "Abstimmung mit Marketing läuft",
      "erstellt": "2026-02-01",
      "aktualisiert": "2026-02-20",
      "archiviert": false
    }
  ]
}
```

### Benutzer (data/benutzer.json)
```json
{
  "benutzer": [
    {
      "id": 1,
      "benutzername": "max.mustermann",
      "email": "max@example.com",
      "vollstaendiger_name": "Max Mustermann",
      "rolle": "admin",
      "aktiv": true,
      "erstellt": "2026-01-15T10:00:00Z",
      "letzter_login": "2026-02-20T14:30:00Z"
    },
    {
      "id": 2,
      "benutzername": "erika.muster",
      "email": "erika@example.com",
      "vollstaendiger_name": "Erika Muster",
      "rolle": "viewer",
      "aktiv": true,
      "erstellt": "2026-02-18T09:15:00Z",
      "letzter_login": "2026-02-20T11:00:00Z"
    }
  ]
}
```

### Einstellungen (data/einstellungen.json)
```json
{
  "kategorien": {
    "Hauptsponsor": "#dc3545",
    "Gold": "#ffd700",
    "Silber": "#c0c0c0",
    "Bronze": "#cd7f32",
    "Unterstützer": "#6c757d"
  },
  "status": {
    "offen": "#6c757d",
    "angefragt": "#ffc107",
    "verhandlung": "#0dcaf0",
    "aktiv": "#198754"
  },
  "leistungs_templates": {
    "Hauptsponsor": [
      "Logo auf Hauptbühne",
      "5 Social-Media-Posts",
      "Newsletter-Erwähnung"
    ],
    "Gold": [
      "Logo auf Website",
      "3 Social-Media-Posts"
    ]
  },
  "bearbeiter_liste": ["Martin", "Lukas", "Alyssa"],
  "jahre": ["2025", "2026"],
  "dashboard_einstellungen": {
    "vertrag_warnzeitraum_tage": 30,
    "vertrag_standard_laeuft_aus_am": "2026-12-31"
  },
  "webhook": {
    "aktiv": false,
    "url": "",
    "method": "POST",
    "secret": "",
    "felder": []
  }
}
```

### Kommunikation (data/kommunikation.json)
```json
{
  "eintraege": [
    {
      "id": 1,
      "sponsor_id": 1,
      "datum": "2026-02-20",
      "art": "Email",
      "inhalt": "Terminvereinbarung für nächste Woche",
      "bearbeiter": "Martin"
    }
  ]
}
```

## API-Endpoints

### Sponsoren
```
GET    /api/sponsoren              # Alle Sponsoren
GET    /api/sponsoren/{id}         # Einzelnen Sponsor abrufen
POST   /api/sponsoren              # Neuen Sponsor erstellen
PUT    /api/sponsoren/{id}         # Sponsor aktualisieren
DELETE /api/sponsoren/{id}         # Sponsor + Verträge löschen
```

### Verträge
```
GET    /api/vertraege              # Alle Verträge (gruppiert nach Sponsor)
GET    /api/vertraege/{sponsor_id} # Vertrag für Sponsor
POST   /api/vertraege              # Neuen Vertrag erstellen
PUT    /api/vertraege/{id}         # Vertrag aktualisieren
DELETE /api/vertraege/{id}         # Vertrag löschen
POST   /api/vertraege/{id}/status  # Statuseintrag hinzufügen
DELETE /api/vertraege/{id}/jahr    # Jahr aus Vertrag entfernen
```

### Leistungen
```
GET    /api/leistungen/{vertrag_id}       # Alle Leistungen für Vertrag
GET    /api/leistungen                    # Alle Leistungen
POST   /api/leistungen                    # Neue Leistung erfassen
PUT    /api/leistungen/{id}               # Leistung aktualisieren
DELETE /api/leistungen/{id}               # Leistung löschen
PUT    /api/leistungen/{id}/archiv        # Leistung archivieren
PUT    /api/leistungen/{id}/restore       # Leistung wiederherstellen
```

### Kommunikation
```
GET    /api/kommunikation/{sponsor_id}    # Protokoll für Sponsor
POST   /api/kommunikation                 # Eintrag hinzufügen
PUT    /api/kommunikation/{id}            # Eintrag bearbeiten
DELETE /api/kommunikation/{id}            # Eintrag löschen
```

### Benutzer & Authentifizierung
```
GET    /api/auth/current                  # Aktuellen Benutzer abrufen
POST   /api/auth/login                    # Login mit Passwort
POST   /api/auth/logout                   # Logout (Session beenden)
GET    /api/auth/check                    # Prüfe ob authentifiziert
GET    /api/benutzer                      # Alle Benutzer (Admin only)
PUT    /api/benutzer/{id}/role            # Rolle ändern (Admin only)
PUT    /api/benutzer/{id}/toggle-active   # Aktivieren/Deaktivieren (Admin only)
```

### Einstellungen
```
GET    /api/einstellungen                 # Alle Einstellungen
PUT    /api/einstellungen/dashboard       # Dashboard-Einstellungen
PUT    /api/einstellungen/status          # Status-Optionen
PUT    /api/einstellungen/bearbeiter      # Bearbeiter-Liste
PUT    /api/einstellungen/jahre           # Jahre-Liste
GET    /api/einstellungen/webhook-config  # Webhook-Konfiguration
POST   /api/einstellungen/webhook-config  # Webhook speichern
POST   /api/einstellungen/webhook-test    # Webhook testen
```

### Statistiken
```
GET    /api/statistiken                   # Dashboard-Übersicht
```

## Verwendungsbeispiele

### Sponsor mit cURL erstellen
```bash
curl -X POST http://localhost:8000/api/sponsoren \
  -H "Content-Type: application/json" \
  -d '{
    "firmenname": "Neue Firma GmbH",
    "email": "info@firma.de",
    "telefon": "+49 123 456789",
    "kategorie": "Bronze",
    "status": "angefragt",
    "ansprechpartner_liste": [
      {
        "name": "Max Mustermann",
        "email": "max@firma.de",
        "telefon": "+49 123 456789",
        "position": "Geschäftsführer"
      }
    ]
  }'
```

### Vertrag mit mehreren Jahren erstellen
```bash
curl -X POST http://localhost:8000/api/vertraege \
  -H "Content-Type: application/json" \
  -d '{
    "sponsor_id": 1,
    "jahre": {
      "2025": {
        "betrag": 2000,
        "leistungen": "Logo auf Website"
      },
      "2026": {
        "betrag": 2500,
        "leistungen": "Logo auf Website + Social Media"
      }
    },
    "bearbeiter_intern": "Martin",
    "laeuft_aus_am": "2026-12-31"
  }'
```

### Leistung archivieren
```bash
curl -X PUT http://localhost:8000/api/leistungen/1/archiv \
  -H "Content-Type: application/json"
```

### Statusprotokoll hinzufügen
```bash
curl -X POST http://localhost:8000/api/vertraege/1/status \
  -H "Content-Type: application/json" \
  -d '{
    "eintrag": "Email versendet und Termin vereinbart"
  }'
```

## CSV-Import

### Formatanforderung
Die CSV-Datei sollte folgende Spalten haben (getrennt durch `;`):

```csv
Firmenname;Ansprechpartner;E-Mail;Telefon;Berufsbezeichnung;Status;Kategorie
Example AG;Max Mustermann;max@example.de;+49 123 456789;Manager;angefragt;Silber
```

Unterstützte Feldnamen (automatisch erkannt):
- Firmenname / firmenname
- Ansprechpartner / ansprechpartner
- E-Mail / email / Email
- Telefon / telefon
- Status / status
- Kategorie / kategorie

## UI-Features im Detail

### Toast-Benachrichtigungen
Alle Systemmeldungen werden als moderne Toast-Benachrichtigungen angezeigt:
- **Erfolg** (grün): Erfolgreiche Operationen
- **Fehler** (rot): Fehlermeldungen
- **Warnung** (gelb): Warnhinweise
- **Info** (blau): Informationsmeldungen
- **Bestätigung** (grau): Confirm-Dialoge mit Aktionsbuttons

### Leistungen-Übersicht (Accordion + Kanban)
- Sponsoren als Accordion-Items
- Jeder Sponsor zeigt Leistungen in 3 Spalten (Kanban):
  - **Offen**: Noch nicht begonnene Leistungen
  - **In Bearbeitung**: Laufende Arbeiten
  - **Erledigt**: Abgeschlossene Leistungen
- Farbcodierung nach Kategorie
- Auto-Refresh nach Änderungen
- Filter nach Kategorie, Status und Textsuche

### Typeahead-Autocomplete
Bearbeiter-Felder in Sponsor- und Vertrag-Modals unterstützen Autocomplete:
- Dropdown erscheint beim Tippen
- Auswahl aus konfigurierten Bearbeitern
- Freie Texteingabe möglich
- Keyboard-Navigation (Pfeil hoch/runter, Enter)

### Sponsoren-Filter
In der Sponsoren-Liste können Sie filtern nach:
- **Textsuche**: Firmenname, Email, Ansprechpartner
- **Kategorie**: Dropdown mit allen verfügbaren Kategorien
- **Status**: Dropdown mit allen konfigurierten Status

### Section-Persistenz
Die aktive Seite (Dashboard, Sponsoren, Verträge, Leistungen, Einstellungen) wird automatisch gespeichert und beim Neuladen wiederhergestellt.

## Sicherheit

⚠️ **WICHTIG: Dieses System speichert Daten UNVERSCHLÜSSELT als JSON!**

### Sicherheitsmaßnahmen:
✅ `.htaccess` blockiert direkten Webzugriff auf `/data/`
✅ PHP-Backend validiert alle Eingaben
✅ JSON-Dateien auf Festplatte (600 Berechtigungen)
✅ Keine Authentifizierung (für LAN/Intranet gedacht)

### Für Produktivbetrieb empfohlen:
- Dateien auf HTTPS-Server hosten
- Authentifizierung hinzufügen (Basic Auth, Session-Login)
- Regelmäßige Backups der `/data/` Ordner
- CORS-Header wenn von anderen Domains zugegriffen wird
- Rate-Limiting für API-Endpoints
- Input-Validierung auf Server-Seite (bereits implementiert)

## Best Practices

### Workflow-Empfehlungen
1. **Sponsor anlegen** → Basisdaten und Ansprechpartner erfassen
2. **Vertrag erstellen** → Jahresbeträge und Laufzeit definieren
3. **Leistungen planen** → Template-basiert Leistungen hinzufügen
4. **Kommunikation dokumentieren** → Alle Kontakte im Protokoll festhalten
5. **Status aktualisieren** → Leistungen von "offen" über "in_bearbeitung" zu "erledigt"
6. **Archivieren** → Abgeschlossene Leistungen für bessere Übersicht archivieren

### Daten-Hygiene
- Regelmäßig abgelaufene Verträge prüfen
- Bearbeiter-Liste aktuell halten
- Archivierte Leistungen periodisch aufräumen
- Logo-Uploads komprimieren (max. 500KB empfohlen)
- Statusprotokoll nutzen für Nachvollziehbarkeit

### Performance-Tipps
- Bei vielen Sponsoren: Filter aktiv nutzen
- Logos in vernünftiger Größe hochladen (max. 200x200px)
- Archivierte Leistungen ausblenden
- Regelmäßig JSON-Export als Backup

## Häufig gestellte Fragen

**F: Kann ich mehrere User haben?**  
A: Derzeit nicht. Dies ist für ein Team/Intranet gedacht. Bearbeiter werden über die Bearbeiter-Liste verwaltet, aber es gibt keine Benutzer-Authentifizierung.

**F: Kann ich die Daten backup/export?**  
A: Ja! Über die Einstellungen können alle Daten als JSON exportiert werden. Für komplettes Backup einfach den `/data/` Ordner kopieren.

**F: Funktioniert es ohne Internet?**  
A: Ja, komplett offline fähig. Nur PHP und ein Webserver erforderlich. Bootstrap und Icons werden lokal bereitgestellt.

**F: Kann ich die UI anpassen?**  
A: Ja! Bearbeiten Sie `public/index.html` und `public/app.js`. Bootstrap 5 wird verwendet. Farben und Kategorien können über das Admin-Panel angepasst werden.

**F: Wie funktioniert die Logo-Upload-Funktion?**  
A: Logos werden als Base64-kodierte Datenstrings direkt in der `sponsoren.json` gespeichert. Keine separaten Bild-Dateien erforderlich.

**F: Was sind Leistungs-Templates?**  
A: Templates sind vordefinierte Leistungen pro Kategorie (z.B. "3 Social-Media-Posts" für Gold-Sponsoren), die beim Erstellen neuer Leistungen vorgeschlagen werden.

**F: Kann ich archivierte Leistungen wiederherstellen?**  
A: Ja! Archivierte Leistungen können über die Sponsor-Detailansicht wiederhergestellt werden.

**F: Was passiert beim Löschen eines Sponsors?**  
A: Der Sponsor und alle zugehörigen Verträge, Leistungen und Kommunikationseinträge werden gelöscht. Ein Backup wird automatisch erstellt.

**F: Wie funktioniert die Section-Persistenz?**  
A: Die aktive Seite (Dashboard, Sponsoren, etc.) wird im localStorage gespeichert und beim Neuladen der Anwendung wiederhergestellt.

## Erweiterungen & Roadmap

Bereits implementiert:
- ✅ Toast-Benachrichtigungen
- ✅ Mehrere Ansprechpartner pro Sponsor
- ✅ Logo-Upload
- ✅ Leistungs-Templates
- ✅ Archivierung
- ✅ Kommunikations-Protokoll
- ✅ Admin-Panel
- ✅ Webhook-Integration (Basis)
- ✅ Section-Persistenz
- ✅ Filter und Such-Funktionen

Geplante Features:
- [ ] Benutzer-Authentifizierung & Rollen
- [ ] Mehrbenutzer-Unterstützung mit Zugriffsrechten
- [ ] E-Mail-Benachrichtigungen bei Fälligkeiten
- [ ] PDF-Reports (Vertragsdokumente, Statistiken)
- [ ] Datenbank-Migration-Option (MySQL/PostgreSQL)
- [ ] Mobile App (Progressive Web App)
- [ ] Erweitertes Aktivitäts-Log
- [ ] Dateianhänge (Verträge, zusätzliche Dokumente)
- [ ] Kalender-Integration (iCal-Export)
- [ ] Dashboard-Widgets konfigurierbar
- [ ] Bulk-Operationen (mehrere Sponsoren bearbeiten)

## Fehlerbehandlung

### Häufige Fehler:

**"Permission denied" bei Dateioperationen**
```bash
chmod -R 755 /path/to/sponsoren
chmod -R 700 /path/to/sponsoren/data
```

**"Cannot write to data/ directory"**
- Prüfen Sie die Dateiberechtigungen
- Prüfen Sie, dass der Webserver-User Schreibrechte hat
- Prüfen Sie die Festplattenkapazität

**API antwortet nicht**
- Prüfen Sie, dass `api.php` in `public/` liegt
- Prüfen Sie, dass `.htaccess` aktiviert ist
- Testen Sie mit `curl`: `curl http://localhost:8000/api/sponsoren`

## Support & Kontakt

Bei Fragen oder Problemen:
1. Prüfen Sie die Browser-Konsole (F12) auf JavaScript-Fehler
2. Überprüfen Sie die Server-Logs (`error.log`)
3. Validieren Sie die JSON-Dateien mit einem JSON-Validator
4. Stellen Sie sicher, dass alle Dateiberechtigungen korrekt gesetzt sind

### Debug-Modus
Öffnen Sie die Browser-Konsole für detaillierte Logging-Informationen. Das System gibt ausführliche Meldungen über API-Calls, Datenänderungen und Fehler aus.

## Lizenz

Dieses Projekt ist frei verwendbar und erweiterbar.

---

**Version:** 2.0.0  
**Datum:** 2026-02-20  
**Letzte Änderung:** Major Update - Toast-Benachrichtigungen, Leistungs-Übersicht mit Kanban-Design, Admin-Panel, erweiterte Filter, Mehrfach-Ansprechpartner, Logo-Upload, Kommunikations-Protokoll
