# Backend Data Pool Sync - Migration & Testing Instructions ## Übersicht Dieser Guide führt dich durch das Testen und Ausführen der Backend Data Pool Migration. ## Schritt 1: Migration ausführen ```bash php artisan migrate ``` **Expected Output:** ``` Migrating: 2025_11_16_150000_create_backend_data_pool_table Migrated: 2025_11_16_150000_create_backend_data_pool_table ``` ### Bei Problemen: Wenn die Migration fehlschlägt, prüfe: ```bash # Datenbankverbindung testen php artisan db:show # Oder spezifisch für pgsql php artisan db:show --database=pgsql ``` ## Schritt 2: Struktur der Tabelle prüfen ```sql -- In psql oder einem DB-Tool \d public.backend_data_pool -- Oder mit artisan tinker php artisan tinker >>> DB::select("SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'backend_data_pool' ORDER BY ordinal_position"); ``` ## Schritt 3: Statistiken vor dem Sync prüfen ```bash php artisan backend:sync-data-pool --stats ``` **Expected Output:** ``` ┌─────────────────────────────────┬────────┐ │ Metric │ Value │ ├─────────────────────────────────┼────────┤ │ Backend Transactions (done) │ XXX │ │ Backend Transaction Outputs │ XXX │ │ Data Pool Records │ 0 │ │ Last Synced At │ Never │ └─────────────────────────────────┴────────┘ ``` ## Schritt 4: Ersten Full Sync durchführen ```bash php artisan backend:sync-data-pool --full ``` **Expected Output:** ``` Preparing for FULL SYNC ⚠ This will truncate and rebuild the entire backend_data_pool table. ┌ Do you want to continue? ─────────────────────────────┐ │ Yes / No │ └───────────────────────────────────────────────────────┘ Stats BEFORE sync: ┌─────────────────────────────────┬────────┐ │ Metric │ Value │ ├─────────────────────────────────┼────────┤ │ Backend Transactions (done) │ XXX │ │ Data Pool Records │ 0 │ │ Last Synced At │ Never │ └─────────────────────────────────┴────────┘ ⠙ Syncing data... ✔ Sync completed successfully! Stats AFTER sync: ┌─────────────────────────────────┬────────┐ │ Metric │ Value │ ├─────────────────────────────────┼────────┤ │ Backend Transactions (done) │ XXX │ │ Data Pool Records │ XXX │ │ Last Synced At │ 2025-11-16 15:30:45 │ └─────────────────────────────────┴────────┘ ``` ## Schritt 5: Daten verifizieren ### SQL Query zum Vergleichen: ```sql -- Anzahl Datensätze in backend.transactions mit status='done' SELECT COUNT(*) FROM backend.transactions WHERE status = 'done'; -- Anzahl Datensätze in backend.transaction_outputs (für done transactions) SELECT COUNT(*) FROM backend.transaction_outputs tout JOIN backend.transactions t ON t.id = tout.transaction_id WHERE t.status = 'done'; -- Anzahl Datensätze in public.backend_data_pool SELECT COUNT(*) FROM public.backend_data_pool; -- Die zweite und dritte Zahl sollten gleich sein! ``` ### Beispiel-Datensätze prüfen: ```sql -- Ersten 5 Datensätze anzeigen SELECT transaction_id, corporate_entity, tx_amount, output_key, LEFT(content, 50) as content_preview, synced_at FROM public.backend_data_pool ORDER BY transaction_id, prompt_id LIMIT 5; ``` ### Prüfe ob alle output_keys vorhanden sind: ```sql -- Welche output_keys sind im Data Pool? SELECT output_key, COUNT(*) as count FROM public.backend_data_pool GROUP BY output_key ORDER BY count DESC; ``` ## Schritt 6: Tests ausführen ```bash php artisan test --filter=SyncBackendDataPool ``` **Expected Output:** ``` PASS Tests\Feature\Jobs\SyncBackendDataPoolTest ✓ full sync truncates and rebuilds backend_data_pool ✓ incremental sync only adds new records ✓ sync correctly maps backend.transactions and backend.transaction_outputs ✓ sync only includes transactions with status done ✓ sync processes records in batches ✓ getStats returns correct statistics ✓ sync handles empty backend gracefully ✓ sync orders records by transaction_id and prompt_id Tests: 8 passed (X assertions) Duration: XXs ``` ## Schritt 7: Incremental Sync testen ```bash # Warte kurz oder füge neue Daten im backend hinzu # Dann führe incremental sync aus: php artisan backend:sync-data-pool --incremental ``` ## Troubleshooting ### Problem: "SQLSTATE[42P01]: Undefined table" **Lösung:** Migration wurde nicht ausgeführt oder fehlgeschlagen. ```bash php artisan migrate:status php artisan migrate --force ``` ### Problem: "Connection refused" oder Connection Error **Lösung:** Prüfe .env Datei: ```bash DB_CONNECTION2=pgsql DB_HOST2=127.0.0.1 DB_PORT2=5433 DB_DATABASE2=risk_ingest_db DB_USERNAME2=risk_ingest_user DB_PASSWORD2=S0prast3r1a ``` Teste Verbindung: ```bash psql -h 127.0.0.1 -p 5433 -U risk_ingest_user -d risk_ingest_db ``` ### Problem: "schema backend does not exist" **Lösung:** Backend Schema fehlt. Erstelle es: ```sql CREATE SCHEMA IF NOT EXISTS backend; ``` ### Problem: Job läuft sehr lange **Lösung:** Nutze kleinere Batch Size oder Queue: ```bash # Kleinere Batches php artisan backend:sync-data-pool --full --batch-size=100 # Oder mit Queue (asynchron) php artisan backend:sync-data-pool --full --queue ``` ## Performance Optimization ### Für große Datenmengen: 1. **Nutze Queue:** ```bash php artisan backend:sync-data-pool --full --queue php artisan queue:work ``` 2. **Optimiere Batch Size:** ```bash # Für viele Datensätze php artisan backend:sync-data-pool --full --batch-size=5000 # Für wenig RAM php artisan backend:sync-data-pool --full --batch-size=100 ``` 3. **Schedule für regelmäßige Syncs:** Füge in `routes/console.php` hinzu: ```php use App\Jobs\SyncBackendDataPool; use Illuminate\Support\Facades\Schedule; // Täglich um 2 Uhr incremental Schedule::job(new SyncBackendDataPool(fullSync: false)) ->dailyAt('02:00'); // Sonntags um 3 Uhr full sync Schedule::job(new SyncBackendDataPool(fullSync: true)) ->weeklyOn(0, '03:00'); ``` Dann starte den Scheduler: ```bash php artisan schedule:work ``` ## Monitoring ### Logs prüfen: ```bash tail -f storage/logs/laravel.log ``` ### SQL Queries für Monitoring: ```sql -- Letzte Sync Zeit SELECT MAX(synced_at) FROM public.backend_data_pool; -- Anzahl Datensätze pro Status SELECT status, COUNT(*) FROM public.backend_data_pool GROUP BY status; -- Anzahl Datensätze pro corporate_entity (Top 10) SELECT corporate_entity, COUNT(*) as transaction_count FROM public.backend_data_pool GROUP BY corporate_entity ORDER BY transaction_count DESC LIMIT 10; -- Durchschnittlicher Transaktionsbetrag SELECT AVG(tx_amount) as avg_amount FROM public.backend_data_pool; ``` ## Nächste Schritte Nach erfolgreichem Sync kannst du mit **Stufe 2** weitermachen: - Transformation der Daten in `public.companies` und `public.transactions` - Mit KYC Risk Level Berechnung - Automatisches Enrichment der Companies --- **Bei Fragen oder Problemen, prüfe die Logs in `storage/logs/laravel.log`**