# Dauerhafte Kurse: Automatischer Feiertags-Ausschluss

## 🎯 Feature

Für **dauerhafte Kurse** (`recurring_course`) gibt es jetzt eine Option, um **automatisch alle Feiertage auszuschließen**.

---

## 🎨 Frontend

### UI-Element
**Checkbox mit Hinweis-Card** (nur bei dauerhaften Kursen sichtbar):

```html
<div class="card border-warning bg-warning bg-opacity-10">
    <div class="card-body p-3">
        <div class="form-check form-switch">
            <input class="form-check-input" type="checkbox" id="excludeHolidays">
            <label>
                <i class="fas fa-umbrella-beach me-2 text-warning"></i>
                Feiertage automatisch ausschließen
            </label>
        </div>
        <div class="form-text small mt-2">
            Wenn aktiviert, werden alle deutschen Feiertage (NRW) automatisch 
            von diesem Kurs ausgeschlossen. Dies betrifft z.B. Weihnachten, 
            Ostern, Pfingsten, etc.
        </div>
    </div>
</div>
```

### Anzeige-Logik
**Datei:** `templates/admin/courses/index.html.twig` (Zeile 2661)

```javascript
case 'recurring_course':
    if (excludeHolidaysOption) excludeHolidaysOption.style.display = 'block';
    break;
case 'limited_course':
case 'holiday_course':
case 'event':
    if (excludeHolidaysOption) excludeHolidaysOption.style.display = 'none';
    break;
```

---

## 🔧 Backend-Logik

### Controller-Erweiterung
**Datei:** `src/Controller/AppointmentController.php` (Zeile 917-971)

#### Schritt 1: Feiertage sammeln
```php
if ($data['type'] === 'recurring_course' && $excludeHolidays) {
    $currentYear = (int)date('Y');
    $holidayService = $this->container->get(\App\Service\HolidayService::class);
    
    // Hole alle Feiertage für die nächsten 2 Jahre
    $allHolidays = [];
    for ($year = $currentYear; $year <= $currentYear + 1; $year++) {
        $yearHolidays = $holidayService->getAllHolidays($year);
        $allHolidays = array_merge($allHolidays, array_keys($yearHolidays));
    }
    
    // Merge mit manuell ausgeschlossenen Terminen
    $excludedDates = array_unique(array_merge($excludedDates, $allHolidays));
    $availability->setExcludedDates($excludedDates);
}
```

#### Schritt 2: Wochentage analysieren
```php
if ($data['type'] === 'recurring_course' && $excludeHolidays) {
    // Für dauerhafte Kurse: Analysiere die nächsten 2 Jahre
    $startDate = isset($data['startDate']) && $data['startDate'] 
        ? new \DateTime($data['startDate']) 
        : new \DateTime('today');
    $endDate = (clone $startDate)->modify('+2 years');
    
    $actualDates = [];
    $current = clone $startDate;
    
    while ($current <= $endDate) {
        $dayOfWeek = (int)$current->format('N');
        if (in_array($dayOfWeek, $data['daysOfWeek'])) {
            $dateString = $current->format('Y-m-d');
            if (!in_array($dateString, $excludedDates)) {
                $actualDates[$dayOfWeek] = true;
            }
        }
        $current->modify('+1 day');
    }
    
    // Nur die Wochentage speichern, die tatsächlich vorkommen
    $availableDaysOfWeek = array_keys($actualDates);
}
```

---

## 📊 Beispiel

### Eingabe:
- **Kurstyp:** Dauerhafter Kurs (`recurring_course`)
- **Startdatum:** 01.01.2025
- **Wochentage:** Mo, Di, Mi, Do, Fr, Sa, So
- **Feiertage ausschließen:** ✅ Aktiviert

### Backend-Verarbeitung:

1. **Feiertage sammeln** (2025-2026):
   - 01.01.2025 (Neujahr)
   - 18.04.2025 (Karfreitag)
   - 21.04.2025 (Ostermontag)
   - 01.05.2025 (Tag der Arbeit)
   - 29.05.2025 (Christi Himmelfahrt)
   - 09.06.2025 (Pfingstmontag)
   - 19.06.2025 (Fronleichnam)
   - 03.10.2025 (Tag der Deutschen Einheit)
   - 01.11.2025 (Allerheiligen)
   - 25.12.2025 (1. Weihnachtstag)
   - 26.12.2025 (2. Weihnachtstag)
   - ... (alle Feiertage 2026)

2. **Analyse über 2 Jahre** (01.01.2025 - 01.01.2027):
   - Prüfe jeden Tag im Zeitraum
   - Filtere Feiertage heraus
   - Sammle verbleibende Wochentage

3. **Ergebnis:** Alle 7 Wochentage bleiben in `availability_day`, **ABER**:
   - `excluded_dates` enthält alle Feiertage
   - Bei Buchungen werden diese Termine automatisch übersprungen

---

## 🔄 Unterschied zu zeitlich begrenzten Kursen

| Feature | Dauerhafter Kurs | Zeitlich begrenzter Kurs |
|---------|------------------|--------------------------|
| **Feiertags-Option** | ✅ Checkbox verfügbar | ❌ Manuelle Auswahl in Vorschau |
| **Zeitraum** | Nächste 2 Jahre | Definiertes Start-/Enddatum |
| **Wochentags-Filterung** | Ja, wenn Feiertag ALLE Vorkommen betrifft | Ja, basierend auf tatsächlichem Zeitraum |
| **excludedDates** | Automatisch alle Feiertage 2 Jahre | Nur manuell ausgewählte Termine |

---

## ✅ Vorteile

1. **Einfache Bedienung:** Ein Klick statt manuellem Ausschluss
2. **Vollständig:** Alle deutschen Feiertage (NRW) werden erfasst
3. **Zukunftssicher:** 2 Jahre im Voraus
4. **Konsistent:** Keine vergessenen Feiertage

---

## 🔧 Aktualisierung für zukünftige Jahre

**Problem:** Nach 2 Jahren sind keine neuen Feiertage mehr gespeichert.

**Lösung 1 - Cronjob (empfohlen):**
```php
// src/Command/UpdateHolidaysCommand.php
public function execute()
{
    $availabilities = $this->entityManager
        ->getRepository(Availability::class)
        ->findBy(['type' => 'recurring_course']);
    
    foreach ($availabilities as $availability) {
        if ($availability->getExcludedDates()) {
            // Aktualisiere Feiertage für +2 Jahre
            $this->updateHolidaysForAvailability($availability);
        }
    }
}
```

**Lösung 2 - Beim Bearbeiten:**
- Wenn Kurs bearbeitet wird, werden Feiertage automatisch aktualisiert

---

## 🧪 Test-Checkliste

- [ ] Dauerhafter Kurs erstellen → Checkbox ist sichtbar
- [ ] Checkbox aktivieren → Feiertage werden ausgeschlossen
- [ ] Checkbox nicht aktivieren → Keine Feiertags-Ausschlüsse
- [ ] Zeitlich begrenzter Kurs → Checkbox ist NICHT sichtbar
- [ ] Ferienkurs → Checkbox ist NICHT sichtbar
- [ ] Event → Checkbox ist NICHT sichtbar
- [ ] Prüfen: `excluded_dates` enthält alle Feiertage?
- [ ] Prüfen: Wochentage in `availability_day` korrekt?
- [ ] Buchung an Feiertag → Sollte fehlschlagen

---

## 📝 Zusammenfassung

**Neues Feld:**
- `excludeHolidays` (Boolean, nur Frontend → Backend)

**Geänderte Dateien:**
- ✅ `templates/admin/courses/index.html.twig` - UI + JS
- ✅ `src/Controller/AppointmentController.php` - Backend-Logik

**Feature aktivieren:**
1. Dauerhaften Kurs erstellen
2. Checkbox "Feiertage automatisch ausschließen" aktivieren
3. Speichern
4. ✅ Alle Feiertage der nächsten 2 Jahre sind ausgeschlossen!

