# Backend Sync & Transform Commands

Dokumentation für die manuellen Artisan Commands zum Synchronisieren und Transformieren von Backend-Daten.

## Übersicht

Das System verfügt über 3 Haupt-Commands zur Datensynchronisation:

1. **`backend:sync-data-pool`** - Synchronisiert Daten vom Backend-Schema in den Data Pool
2. **`backend:transform-data-pool`** - Transformiert Data Pool in Companies + Transactions
3. **`backend:rebuild`** - Kompletter Rebuild (Sync + Transform in einem Schritt)

---

## 1. Backend Sync Command

Synchronisiert Daten von `backend.transactions` + `backend.transaction_outputs` nach `public.backend_data_pool`.

### Verwendung

#### Incremental Sync (Standard)
Nur neue oder geänderte Datensätze seit dem letzten Sync:

```bash
php artisan backend:sync-data-pool --incremental
```

#### Full Sync
Kompletter Rebuild - löscht alle Daten im Data Pool und baut sie neu auf:

```bash
php artisan backend:sync-data-pool --full
```

#### Statistiken anzeigen
Zeigt nur Statistiken an, ohne Sync durchzuführen:

```bash
php artisan backend:sync-data-pool --stats
```

#### Im Hintergrund über Queue
Führt den Sync asynchron über die Queue aus:

```bash
php artisan backend:sync-data-pool --full --queue
```

#### Batch-Größe anpassen
Definiert, wie viele Records pro Batch verarbeitet werden (Standard: 1000):

```bash
php artisan backend:sync-data-pool --full --batch-size=2000
```

### Optionen

| Option | Beschreibung | Default |
|--------|--------------|---------|
| `--full` | Kompletter Sync (truncate + rebuild) | false |
| `--incremental` | Nur neue/geänderte Records | false |
| `--batch-size` | Records pro Batch | 1000 |
| `--queue` | Im Hintergrund ausführen | false |
| `--stats` | Nur Statistiken anzeigen | false |

### Datenbankverbindungen

- **Source:** `DB::connection('pgsql')` → `backend.transactions`, `backend.transaction_outputs`
- **Target:** `DB::table('backend_data_pool')` → `public.backend_data_pool`

### Was passiert beim Sync?

1. **Full Sync:**
   - Truncate `backend_data_pool`
   - Alle `done` Transactions vom Backend laden
   - Mit `transaction_outputs` joinen
   - In Batches in Data Pool schreiben

2. **Incremental Sync:**
   - Letzten Sync-Zeitstempel ermitteln
   - Nur Records mit `last_modified_at > last_synced_at` laden
   - In Batches in Data Pool schreiben

---

## 2. Transform Command

Transformiert Daten aus `backend_data_pool` in die Production-Tables `companies` und `transactions`.

### Verwendung

#### Standard Transformation

```bash
php artisan backend:transform-data-pool
```

#### Statistiken anzeigen

```bash
php artisan backend:transform-data-pool --stats
```

#### Im Hintergrund über Queue

```bash
php artisan backend:transform-data-pool --queue
```

#### Batch-Größe anpassen

```bash
php artisan backend:transform-data-pool --batch-size=200
```

### Optionen

| Option | Beschreibung | Default |
|--------|--------------|---------|
| `--batch-size` | Records pro Batch | 100 |
| `--queue` | Im Hintergrund ausführen | false |
| `--stats` | Nur Statistiken anzeigen | false |

### Datenbankverbindungen

- **Source:** `DB::table('backend_data_pool')` → `public.backend_data_pool`
- **Target:** Eloquent Models → `public.companies`, `public.transactions`

### Was passiert bei der Transformation?

1. Alle eindeutigen `transaction_id` aus Data Pool laden
2. Für jede Transaction:
   - **Company erstellen/aktualisieren:**
     - Name: `corporate_entity`
     - Country, Sector, HQ, Summary, Legal Name extrahieren
     - KYC Risk Level aus `risk_score` berechnen
   - **Transaction erstellen/aktualisieren:**
     - Reference, Amount, Currency, Counterparty
     - Risk Score & Level mapping
     - Status basierend auf Risk Level
     - Alle `output_keys` als JSON-Felder speichern

### Risk Score Mapping

Backend verwendet eine Skala von **-100 bis 100**:

| Backend Score | Risk Level | Transaction Status |
|---------------|------------|-------------------|
| -100 bis 20 | `critical` | True Positive |
| 20 bis 80 | `high` | False Positive |
| 80 bis 100 | `low` | Cleared |

Für das Frontend wird der Score auf **0-255** normalisiert:
```
normalized = ((score + 100) / 200) * 255
```

---

## 3. Complete Rebuild Command

Führt Full Sync + Transformation in einem Schritt aus.

### Verwendung

#### Standard Rebuild

```bash
php artisan backend:rebuild
```

#### Mit angepassten Batch-Größen

```bash
php artisan backend:rebuild --batch-size=2000 --transform-batch-size=150
```

#### Im Hintergrund über Queue

```bash
php artisan backend:rebuild --queue
```

**Hinweis:** Bei `--queue` wird nur der Sync-Job in die Queue geschickt. Die Transformation muss manuell gestartet werden, nachdem der Sync abgeschlossen ist.

### Optionen

| Option | Beschreibung | Default |
|--------|--------------|---------|
| `--batch-size` | Records pro Batch (Sync) | 1000 |
| `--transform-batch-size` | Records pro Batch (Transform) | 100 |
| `--queue` | Im Hintergrund ausführen | false |

### Ablauf

1. **Step 1/2:** Full Sync from Backend
   - Truncate `backend_data_pool`
   - Sync alle `done` Transactions
2. **Step 2/2:** Transform Data Pool
   - Companies erstellen/aktualisieren
   - Transactions erstellen/aktualisieren

---

## Automatisierung mit Laravel Scheduler

Die Commands sind bereits im Laravel Scheduler konfiguriert ([routes/console.php](routes/console.php)):

### Aktuelle Schedule

```php
// Incremental Sync: Alle 6 Stunden (0:00, 6:00, 12:00, 18:00)
Schedule::job(new SyncBackendDataPool(fullSync: false, batchSize: 1000))
    ->everySixHours()
    ->name('sync-backend-data-pool-incremental')
    ->withoutOverlapping(1800);

// Full Sync: Jeden Sonntag um 3:00 Uhr
Schedule::job(new SyncBackendDataPool(fullSync: true, batchSize: 1000))
    ->weeklyOn(0, '03:00')
    ->name('sync-backend-data-pool-full')
    ->withoutOverlapping(3600);

// Transformation: 30 Minuten nach jedem Sync (0:30, 6:30, 12:30, 18:30)
Schedule::job(new TransformDataPoolToProduction(batchSize: 100))
    ->cron('30 */6 * * *')
    ->name('transform-data-pool-to-production')
    ->withoutOverlapping(1800);
```

### Scheduler aktivieren

#### Für lokale Entwicklung

```bash
php artisan schedule:work
```

#### Für Produktion (Crontab)

```bash
crontab -e
```

Folgende Zeile hinzufügen:
```
* * * * * cd /Users/sebastianfrohlich/Herd/frontend && php artisan schedule:run >> /dev/null 2>&1
```

### Scheduled Tasks anzeigen

```bash
php artisan schedule:list
```

### Scheduled Task testen

```bash
php artisan schedule:test sync-backend-data-pool-incremental
php artisan schedule:test sync-backend-data-pool-full
php artisan schedule:test transform-data-pool-to-production
```

---

## Features

### Alle Commands bieten

✅ **Interaktive Bestätigung** - Sicherheitsfrage vor kritischen Operationen
✅ **Statistiken vorher/nachher** - Direkter Vergleich der Datenänderungen
✅ **Batch-Processing** - Performante Verarbeitung großer Datenmengen
✅ **Queue-Support** - Ausführung im Hintergrund möglich
✅ **Laravel Prompts** - Moderne, benutzerfreundliche CLI-Oberfläche
✅ **Error Handling** - Robuste Fehlerbehandlung mit Logging
✅ **Timeout Protection** - 1 Stunde Timeout pro Job
✅ **Retry Logic** - 3 Versuche bei Fehlern
✅ **Overlap Prevention** - Verhindert gleichzeitige Ausführung

---

## Datenfluss

```
┌──────────────────────┐
│  backend.transactions │
│  backend.transaction_│
│       outputs        │
└──────────┬───────────┘
           │
           │ SyncBackendDataPool
           │ (backend:sync-data-pool)
           ▼
┌──────────────────────┐
│ public.backend_data_ │
│        pool          │
└──────────┬───────────┘
           │
           │ TransformDataPoolToProduction
           │ (backend:transform-data-pool)
           ▼
┌──────────────────────┐
│  public.companies    │
│  public.transactions │
└──────────────────────┘
```

---

## Troubleshooting

### Command funktioniert nicht

```bash
# Commands neu registrieren
php artisan optimize:clear

# Artisan Cache leeren
php artisan cache:clear
```

### Queue-Jobs laufen nicht

```bash
# Queue Worker starten
php artisan queue:work

# Queue Status prüfen
php artisan queue:monitor
```

### Logs prüfen

```bash
# Application Logs
tail -f storage/logs/laravel.log

# Nur Sync-Logs
tail -f storage/logs/laravel.log | grep SyncBackendDataPool

# Nur Transform-Logs
tail -f storage/logs/laravel.log | grep TransformDataPoolToProduction
```

---

## Beispiele

### Kompletter Rebuild mit Custom Settings

```bash
php artisan backend:rebuild \
  --batch-size=5000 \
  --transform-batch-size=250
```

### Nur neuen Daten synchronisieren und transformieren

```bash
php artisan backend:sync-data-pool --incremental
php artisan backend:transform-data-pool
```

### Statistiken aller Systeme anzeigen

```bash
php artisan backend:sync-data-pool --stats
php artisan backend:transform-data-pool --stats
```

---

## Performance-Tipps

1. **Batch-Größe anpassen:**
   - Kleine Batches (100-500): Weniger RAM, langsamer
   - Große Batches (2000-5000): Mehr RAM, schneller

2. **Queue nutzen für lange Jobs:**
   ```bash
   php artisan backend:sync-data-pool --full --queue
   ```

3. **Incremental Sync bevorzugen:**
   - Full Sync nur wenn wirklich nötig
   - Incremental ist viel schneller

4. **Off-Peak Zeiten nutzen:**
   - Full Sync: Sonntag 3:00 Uhr (bereits konfiguriert)
   - Incremental: Alle 6 Stunden (bereits konfiguriert)

---

## Weiterführende Links

- [routes/console.php](routes/console.php) - Scheduler Configuration
- [app/Jobs/SyncBackendDataPool.php](app/Jobs/SyncBackendDataPool.php) - Sync Job
- [app/Jobs/TransformDataPoolToProduction.php](app/Jobs/TransformDataPoolToProduction.php) - Transform Job
- [app/Console/Commands/SyncBackendDataPoolCommand.php](app/Console/Commands/SyncBackendDataPoolCommand.php)
- [app/Console/Commands/TransformDataPoolCommand.php](app/Console/Commands/TransformDataPoolCommand.php)
- [app/Console/Commands/RebuildFromDataPoolCommand.php](app/Console/Commands/RebuildFromDataPoolCommand.php)
