# Automatische Archivierung von Wartelisten-Einträgen

## 📋 Übersicht

Das System archiviert automatisch Wartelisten-Einträge für Kurse, die bereits vorbei sind. Dies hält die aktive Warteliste sauber und übersichtlich.

## 🎯 Was wird archiviert?

Ein Wartelisten-Eintrag wird archiviert, wenn:

1. **Einmaliger Kurs**: Das `specificDate` des Kurses in der Vergangenheit liegt
2. **Kursreihe**: Das `endDate` des Kurses in der Vergangenheit liegt

## 📝 Was passiert beim Archivieren?

1. Die Kurs-Zuordnung (`availability`) wird auf `null` gesetzt
2. Eine Auto-Archivierungs-Notiz wird hinzugefügt:
   ```
   [AUTO-ARCHIVIERT: Kurs "Schwimmkurs Anfänger" (beendet am 15.10.2025) 
    wurde automatisch archiviert am 22.10.2025 10:30]
   ```
3. Der Eintrag bleibt in der Datenbank für spätere Referenz erhalten
4. Im Admin-Panel erscheint er unter "Archiviert"

## 🚀 Verwendung

### Manuell ausführen:

```bash
# Führt die Archivierung einmalig aus
php bin/console app:archive-expired-waiting-list
```

**Output-Beispiel:**
```
Archiviere abgelaufene Wartelisten-Einträge
============================================

✓ Archiviert: Max Mustermann - Kurs: Schwimmkurs Anfänger
✓ Archiviert: Anna Schmidt - Kurs: Aqua-Fitness

[OK] 2 Wartelisten-Einträge wurden archiviert. 5 übersprungen.
```

### Automatisch via Cronjob (empfohlen):

#### Linux/Mac:

Öffnen Sie die Crontab:
```bash
crontab -e
```

Fügen Sie hinzu (läuft täglich um 3:00 Uhr):
```cron
0 3 * * * cd /pfad/zu/test_projekt && php bin/console app:archive-expired-waiting-list >> /var/log/waiting-list-archive.log 2>&1
```

#### Windows (Task Scheduler):

1. Öffnen Sie **Aufgabenplanung** (Task Scheduler)
2. Erstellen Sie eine neue Aufgabe:
   - **Name**: "Warteliste Auto-Archivierung"
   - **Trigger**: Täglich um 3:00 Uhr
   - **Aktion**: Programm starten
     - **Programm**: `C:\xampp\php\php.exe`
     - **Argumente**: `bin/console app:archive-expired-waiting-list`
     - **Starten in**: `C:\dev\test_projekt`

### Programmatisch im Code:

```php
use App\Service\WaitingListAutoArchiveService;

class SomeController extends AbstractController
{
    public function someAction(WaitingListAutoArchiveService $archiveService)
    {
        $result = $archiveService->archiveExpiredEntries();
        
        // $result = ['archived' => 2, 'skipped' => 5]
        $this->addFlash('success', sprintf(
            '%d Einträge archiviert',
            $result['archived']
        ));
    }
}
```

## 📊 Monitoring

### Logs prüfen:

```bash
# Alle Archivierungs-Events anzeigen
tail -f var/log/dev.log | grep "Wartelisten-Eintrag automatisch archiviert"
```

### Archivierte Einträge anzeigen:

Im Admin-Panel unter:
- **Warteliste → Archiviert** Tab
- URL: `/appointments/admin/waiting-list` (dann "Archiviert" auswählen)

## 🔧 Konfiguration

### Archivierungs-Regeln anpassen:

Bearbeiten Sie `src/Service/WaitingListAutoArchiveService.php`:

```php
private function isExpired($availability, \DateTime $today): bool
{
    // Beispiel: 7 Tage Kulanzzeit nach Kursende
    $gracePeriod = (clone $today)->modify('-7 days');
    
    if ($availability->getSpecificDate()) {
        return $availability->getSpecificDate() < $gracePeriod;
    }
    
    if ($availability->getEndDate()) {
        return $availability->getEndDate() < $gracePeriod;
    }
    
    return false;
}
```

### Notiz-Format anpassen:

In der Methode `archiveEntry()` können Sie das Format der Archivierungs-Notiz ändern.

## 📈 Statistiken

Nach der Archivierung können Sie Statistiken abrufen:

```bash
# Anzahl archivierter Einträge
php bin/console dbal:run-sql "SELECT COUNT(*) FROM waiting_list WHERE availability_id IS NULL"

# Archivierte Einträge mit Notizen
php bin/console dbal:run-sql "SELECT * FROM waiting_list WHERE availability_id IS NULL AND notes LIKE '%AUTO-ARCHIVIERT%'"
```

## ⚠️ Wichtige Hinweise

1. **Keine Löschung**: Einträge werden **nicht gelöscht**, nur archiviert
2. **Daten bleiben erhalten**: Alle Kundendaten bleiben für spätere Referenz
3. **Rückgängig machen**: Archivierte Einträge können manuell wiederhergestellt werden
4. **Performance**: Bei großen Datenmengen läuft der Prozess im Hintergrund

## 🛠️ Fehlerbehebung

### "Keine Einträge gefunden"

Mögliche Ursachen:
1. Alle Kurse haben noch kein Enddatum erreicht
2. Warteliste ist leer
3. Alle Einträge sind bereits archiviert

### "Fehler beim Archivieren"

Prüfen Sie die Logs:
```bash
tail -f var/log/dev.log | grep "ERROR"
```

Häufige Probleme:
- Datenbank-Verbindungsfehler
- Fehlende Berechtigungen
- Inkonsistente Daten

## 🔄 Integration mit Messenger (Optional)

Für asynchrone Verarbeitung:

```php
// src/Message/ArchiveWaitingListMessage.php
class ArchiveWaitingListMessage
{
    // Message für Queue
}

// src/MessageHandler/ArchiveWaitingListMessageHandler.php
#[AsMessageHandler]
class ArchiveWaitingListMessageHandler
{
    public function __invoke(ArchiveWaitingListMessage $message)
    {
        $this->archiveService->archiveExpiredEntries();
    }
}
```

Dann via Cronjob nur Message dispatchen:
```bash
0 3 * * * cd /pfad/zu/projekt && php bin/console messenger:dispatch "App\Message\ArchiveWaitingListMessage"
```

## 📞 Support

Bei Fragen oder Problemen:
1. Prüfen Sie die Logs
2. Testen Sie manuell: `php bin/console app:archive-expired-waiting-list -v`
3. Prüfen Sie die Datenbank-Konsistenz

