|
|
|
@@ -0,0 +1,401 @@
|
|
|
|
|
# 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)
|