# BUSINESS_FORCE_EXECUTE - Test-Server Konfiguration

## Übersicht

Die ENV-Variable `BUSINESS_FORCE_EXECUTE` erlaubt es, die Business-Commands auch an Tagen auszuführen, die nicht dem konfigurierten Ausführungstag entsprechen.

**⚠️ WICHTIG:** Diese Variable sollte **NUR auf Test-Servern** verwendet werden!

---

## Verwendung

### Auf Test-Server aktivieren

**1. .env Datei bearbeiten:**

```bash
# In .env Datei hinzufügen:
BUSINESS_FORCE_EXECUTE=true
```

**2. Commands testen:**

```bash
# Command kann jetzt an jedem Tag ausgeführt werden
php artisan business:store-optimized 0 0

# Erwartete Ausgabe:
# ⚠️  BUSINESS_FORCE_EXECUTE ist aktiv - Command wird trotz falschem Tag ausgeführt!
# ⚠️  Dies sollte NUR auf Test-Servern verwendet werden!
# ✅ Command wird ausgeführt...
```

### Auf Live-Server DEAKTIVIEREN

**In .env Datei auf Live-Server:**

```bash
# NICHT setzen oder explizit auf false:
# BUSINESS_FORCE_EXECUTE=false

# Oder ganz weglassen (Standard ist false)
```

---

## Vorteile der neuen Lösung

### ✅ Vor dem Fix (mit auskommentiertem return)

**Problem:**

```php
if ($executeDay !== $presentDay) {
    $this->info('NOT RUN ...');
    //  return 0;  // ← Auskommentiert während Entwicklung
}
// ❌ Command läuft weiter, auch wenn er nicht sollte!
```

**Nachteile:**

- Entwickler vergisst Kommentar zu entfernen
- Command läuft versehentlich auf Live-Server
- Git-Commit enthält auskommentiertes return
- Schwer zu debuggen

### ✅ Nach dem Fix (mit ENV-Variable)

**Lösung:**

```php
private function shouldExecuteToday(): bool
{
    $executeDay = (int) Setting::getContentBySlug('day-exectute-business-structur');
    $presentDay = (int) date('d');

    if ($executeDay !== $presentDay) {
        // Überschreibung NUR mit ENV-Variable möglich
        if (env('BUSINESS_FORCE_EXECUTE', false) === true) {
            $this->warn("⚠️  BUSINESS_FORCE_EXECUTE ist aktiv!");
            return true;
        }

        return false;  // ← IMMER hier, kann nicht auskommentiert werden
    }

    return true;
}
```

**Vorteile:**

- ✅ Kein Code muss auskommentiert werden
- ✅ Funktioniert sofort auf Test-Server (mit ENV)
- ✅ Sicher auf Live-Server (ohne ENV)
- ✅ Klare Warnungen wenn Force aktiv ist
- ✅ Besseres Logging
- ✅ Fallback wenn Setting leer ist

---

## Zusätzliche Features

### 1. Automatischer Fallback

Wenn das Setting `day-exectute-business-structur` leer ist:

```php
if ($executeDay === 0) {
    $executeDay = 1;  // Standard: Tag 1
    $this->warn('Setting ist leer - verwende Standard: Tag 1');
}
```

**Vorteil:** Command funktioniert auch wenn Setting vergessen wurde zu setzen.

### 2. Besseres Logging

```
[2026-01-28 03:00:02] BusinessStoreOptimized: Configured Day: 1, Present Day: 28
[2026-01-28 03:00:02] BusinessStoreOptimized: NOT EXECUTED - wrong day (expected: 1, today: 28)
```

**Vorteil:** Klar erkennbar warum Command nicht läuft.

### 3. Visuelle Warnungen

Wenn `BUSINESS_FORCE_EXECUTE=true`:

```
⚠️  BUSINESS_FORCE_EXECUTE ist aktiv - Command wird trotz falschem Tag ausgeführt!
⚠️  Dies sollte NUR auf Test-Servern verwendet werden!
```

**Vorteil:** Entwickler sieht sofort, dass Force-Mode aktiv ist.

---

## Test-Szenarien

### Szenario 1: Test-Server - Entwicklung

```bash
# .env
BUSINESS_FORCE_EXECUTE=true

# Command kann jederzeit ausgeführt werden
php artisan business:store-optimized 12 2025
php artisan business:store-optimized 0 0

# ✅ Läuft ohne Probleme
```

### Szenario 2: Live-Server - Normalbetrieb

```bash
# .env
# BUSINESS_FORCE_EXECUTE nicht gesetzt (oder =false)

# Scheduler ruft täglich auf:
# php artisan business:store-optimized 0 0

# Nur am Tag 1 wird tatsächlich ausgeführt:
# 01.02.2026 03:00 → ✅ EXECUTED
# 02.02.2026 03:00 → ❌ NOT EXECUTED
# 03.02.2026 03:00 → ❌ NOT EXECUTED
# ...
# 01.03.2026 03:00 → ✅ EXECUTED
```

### Szenario 3: Live-Server - Manuelle Ausführung

```bash
# Admin muss manuell für alten Monat ausführen
php artisan business:store-optimized 11 2025 --clear

# Funktioniert jederzeit, da spezifische Parameter
# (nicht 0 0, daher kein Vormonat-Check)
```

---

## Migration Guide

### Schritt 1: Test-Server

```bash
# 1. Code aktualisieren (Git pull)
git pull origin main

# 2. ENV-Variable setzen
echo "BUSINESS_FORCE_EXECUTE=true" >> .env

# 3. Testen
php artisan business:store-optimized 0 0

# Erwartete Ausgabe:
# ⚠️  BUSINESS_FORCE_EXECUTE ist aktiv...
# ✅ Command wird ausgeführt
```

### Schritt 2: Live-Server

```bash
# 1. Backup erstellen
php artisan backup:run

# 2. Code aktualisieren
cd /home/ploi/mivita.care
git pull origin main

# 3. ENV prüfen (NICHT setzen!)
grep BUSINESS_FORCE_EXECUTE .env
# Sollte NICHTS finden oder =false

# 4. Cache leeren
php8.4 artisan config:clear
php8.4 artisan cache:clear

# 5. Testen (falscher Tag)
php8.4 artisan business:store-optimized 0 0

# Erwartete Ausgabe:
# ❌ Command wird NICHT ausgeführt - falscher Tag
```

---

## Troubleshooting

### Problem: Command läuft auf Live nicht mehr

**Symptom:**

```
❌ Command wird NICHT ausgeführt - falscher Tag (erwartet: 1, heute: 28)
```

**Lösung:**

- Das ist **korrekt**! Command sollte nur am Tag 1 laufen
- Warte bis zum 1. des nächsten Monats
- Oder führe manuell aus: `php artisan business:store-optimized 12 2025`

### Problem: Setting ist leer

**Symptom:**

```
Setting "day-exectute-business-structur" ist leer oder 0. Verwende Standard: Tag 1
```

**Lösung:**

```bash
php artisan tinker --execute="
\$setting = \App\Models\Setting::where('slug', 'day-exectute-business-structur')->first();
if (!\$setting) {
    \$setting = new \App\Models\Setting();
    \$setting->slug = 'day-exectute-business-structur';
}
\$setting->content = '1';
\$setting->save();
echo 'Setting updated to: 1\n';
"
```

### Problem: FORCE_EXECUTE auf Live aktiv

**Symptom:**

```
⚠️  BUSINESS_FORCE_EXECUTE ist aktiv - Command wird trotz falschem Tag ausgeführt!
```

**Lösung:**

```bash
# .env Datei bearbeiten
nano .env

# Zeile entfernen oder auf false setzen:
BUSINESS_FORCE_EXECUTE=false

# Cache leeren
php artisan config:clear
```

---

## Best Practices

### ✅ DO

- ENV-Variable NUR auf Test-Servern setzen
- Klare Dokumentation in .env.example
- Logs regelmäßig prüfen
- Cache nach ENV-Änderungen leeren

### ❌ DON'T

- NIEMALS auf Live-Server `BUSINESS_FORCE_EXECUTE=true` setzen
- Kein Code-Auskommentieren mehr für Tests
- Keine manuellen Scheduler-Anpassungen für Tests
- Nicht vergessen Setting zu setzen (day-exectute-business-structur)

---

## Zusammenfassung

| Aspekt          | Alt (mit Kommentar)  | Neu (mit ENV)             |
| --------------- | -------------------- | ------------------------- |
| **Test-Server** | Code auskommentieren | ENV-Variable setzen       |
| **Live-Server** | Kommentar vergessen  | ENV nicht setzen (sicher) |
| **Sicherheit**  | ❌ Fehleranfällig    | ✅ Sicher                 |
| **Wartbarkeit** | ❌ Schwierig         | ✅ Einfach                |
| **Logging**     | ⚠️ Basic             | ✅ Ausführlich            |
| **Fallback**    | ❌ Kein              | ✅ Automatisch            |

---

## Weitere Verbesserungen (optional)

### Idee 1: Command mit --force Flag

```php
protected $signature = 'business:store-optimized {month} {year} {--clear} {--force}';

if ($this->option('force')) {
    $this->warn('--force Flag aktiv - Tag-Check wird übersprungen');
    return true;
}
```

### Idee 2: Notification bei Force-Ausführung

```php
if (env('BUSINESS_FORCE_EXECUTE', false) === true) {
    \Mail::to('admin@mivita.care')->send(
        new \App\Mail\BusinessForcedExecutionMail()
    );
}
```

### Idee 3: Test-Modus in UI anzeigen

```php
// In Layout-Header
@if(env('BUSINESS_FORCE_EXECUTE', false))
    <div class="alert alert-warning">
        ⚠️ TEST-MODUS: Business-Commands laufen mit FORCE_EXECUTE
    </div>
@endif
```

---

## Support

Bei Fragen oder Problemen:

1. Logs prüfen: `storage/logs/laravel.log`
2. ENV-Variable prüfen: `php artisan config:show`
3. Setting prüfen: `php artisan tinker` → `Setting::where('slug', 'day-exectute-business-structur')->first()`
4. Dokumentation: `/dev/28-01-2026/business-store-timing-fix.md`
