# Detaillierte Beschreibung der Datenbank-Tabellen

## **Backend Schema**

### **1. backend.transactions**

**Zweck**: Rohdaten-Tabelle für eingehende Transaktionen aus verschiedenen Quellen (vermutlich CSV/Excel-Uploads oder API-Imports)

**Struktur**: 14 Spalten

#### Identifikation
- **id** (integer, NOT NULL, AUTO_INCREMENT)
  - Primärschlüssel
  - Sequenz: `backend.transactions_id_seq`

#### Transaktions-Stammdaten
- **corporate_entity** (text, NOT NULL)
  - Name der durchführenden Firma/Entität
  - Kein Foreign Key - als Textfeld gespeichert

- **corporate_counterparty** (text, NOT NULL)
  - Name der Gegenpartei/Empfänger
  - Freitext, keine Normalisierung

- **tx_date** (text, NOT NULL)
  - Transaktionsdatum
  - ⚠️ Als Text gespeichert (nicht als DATE/TIMESTAMP)
  - Wahrscheinlich verschiedene Formate möglich

- **tx_amount** (double precision, NOT NULL)
  - Transaktionsbetrag
  - Fließkommazahl für Währungsbeträge

- **tx_currency** (text, nullable)
  - Währungscode (z.B. EUR, USD)
  - Optional

- **tx_purpose** (text, nullable)
  - Verwendungszweck/Beschreibung der Transaktion
  - Freitextfeld

#### Geografische Informationen
- **tx_country_outgoing** (text, nullable)
  - Herkunftsland der Zahlung

- **tx_country_incoming** (text, nullable)
  - Zielland der Zahlung

#### Metadaten & Verarbeitung
- **source_file** (text, nullable)
  - Name/Pfad der Quelldatei
  - Für Nachverfolgbarkeit der Datenherkunft

- **raw_payload** (text, nullable)
  - Rohdaten im Originalformat
  - Ermöglicht Reprocessing bei Bedarf

- **status** (text, NOT NULL)
  - Verarbeitungsstatus (z.B. "pending", "processed", "error")

- **created_at** (text, NOT NULL)
  - Erstellungszeitpunkt
  - ⚠️ Als Text gespeichert (nicht als TIMESTAMP)

- **last_modified_at** (text, NOT NULL)
  - Letzte Änderung
  - ⚠️ Als Text gespeichert (nicht als TIMESTAMP)

**Charakteristik**: ETL-/Staging-Tabelle mit lockerer Typisierung für maximale Flexibilität beim Import

---

### **2. backend.transaction_outputs**

**Zweck**: Speichert generierte Outputs/Ergebnisse aus Prompt-Verarbeitung für Transaktionen (vermutlich KI/LLM-generierte Analysen)

**Struktur**: 5 Spalten

#### Primärschlüssel (zusammengesetzt)
- **transaction_id** (integer, NOT NULL)
  - Foreign Key zu `backend.transactions.id`
  - Referenziert die analysierte Transaktion

- **prompt_id** (integer, NOT NULL)
  - Foreign Key zu `backend.prompt_templates` (vermutlich)
  - Identifiziert welcher Prompt verwendet wurde

- **output_key** (text, NOT NULL)
  - Schlüssel für den Output-Typ
  - Beispiele: "risk_assessment", "compliance_check", "summary", "recommendations"

#### Output-Daten
- **content** (text, NOT NULL)
  - Der generierte Inhalt/Ergebnis
  - Kann strukturierter Text, JSON oder Markdown sein

#### Verknüpfung
- **run_id** (integer, nullable)
  - Foreign Key zu `backend.prompt_runs` (vermutlich)
  - Gruppiert Outputs aus demselben Batch/Durchlauf
  - Optional für ad-hoc Generierungen

**Charakteristik**: N:M-Mapping zwischen Transaktionen und Prompts mit flexiblen Output-Keys

---

## **Public Schema**

### **3. public.companies**

**Zweck**: Normalisierte Firmenstammdaten für KYC (Know Your Customer) und Compliance

**Struktur**: 11 Spalten

#### Identifikation
- **id** (bigint, NOT NULL, AUTO_INCREMENT)
  - Primärschlüssel
  - Sequenz: `companies_id_seq`

#### Firmenidentifikation
- **name** (varchar, NOT NULL)
  - Primärer Firmenname (Kurzform/Handelsname)

- **legal_name** (varchar, nullable)
  - Offizieller rechtlicher Name
  - Kann vom Handelsnamen abweichen

- **ticker** (varchar, nullable)
  - Börsenticker-Symbol (z.B. "AAPL", "MSFT")
  - Nur für börsennotierte Unternehmen

#### Klassifikation & Lokalisierung
- **sector** (varchar, nullable)
  - Wirtschaftssektor/Branche
  - Z.B. "Technology", "Finance", "Manufacturing"

- **country** (varchar, NOT NULL, default: 'DE')
  - Ländercode (ISO 2-Letter)
  - Standard: Deutschland

- **headquarters** (varchar, nullable)
  - Hauptsitz/Firmenzentrale
  - Stadt oder Stadt + Land

#### Risk & Compliance
- **kyc_risk_level** (varchar, NOT NULL, default: 'medium')
  - KYC-Risikoeinstufung
  - Mögliche Werte: "low", "medium", "high"
  - Default: mittleres Risiko

#### Zusatzinformationen
- **summary** (text, nullable)
  - Firmenbeschreibung/Zusammenfassung
  - Freitextfeld für Kontext

#### Zeitstempel
- **created_at** (timestamp, nullable)
  - Erstellungszeitpunkt

- **updated_at** (timestamp, nullable)
  - Letzte Aktualisierung
  - Laravel-Standard für Timestamps

**Charakteristik**: Saubere, normalisierte Stammdatentabelle mit KYC-Fokus

---

### **4. public.transactions**

**Zweck**: Produktive Transaktionsdaten mit umfassender Anreicherung aus externen Datenquellen und Risikoanalyse

**Struktur**: 54 Spalten (!)

#### Identifikation
- **id** (bigint, NOT NULL, AUTO_INCREMENT) - 9x aufgelistet (⚠️ Schema-Anomalie!)
  - Primärschlüssel
  - Sequenz: `transactions_id_seq`

#### Transaktions-Basis
- **company_id** (bigint, NOT NULL, default: 1)
  - Foreign Key zu `public.companies.id`
  - Zuordnung zur durchführenden Firma

- **reference** (varchar, NOT NULL)
  - Transaktionsreferenz/Buchungsnummer
  - Eindeutiger Identifier

- **amount** (numeric, NOT NULL)
  - Transaktionsbetrag
  - Numeric für präzise Währungsbeträge

- **currency** (varchar, NOT NULL, default: 'EUR')
  - Währungscode
  - Standard: Euro

- **counterparty** (varchar, NOT NULL)
  - Name der Gegenpartei

- **counterparty_country** (varchar, nullable)
  - Land der Gegenpartei

- **channel** (varchar, nullable)
  - Transaktionskanal (z.B. "wire", "sepa", "swift")

- **executed_at** (timestamp, NOT NULL)
  - Ausführungszeitpunkt der Transaktion

#### Risk Management
- **risk_score** (smallint, NOT NULL, default: 0)
  - Risikobewertung (0-100 oder ähnlich)

- **status** (varchar, NOT NULL)
  - Transaktionsstatus (z.B. "pending", "approved", "flagged")

- **requires_review** (boolean, NOT NULL, default: true)
  - Manuelles Review erforderlich?

- **flagged_by** (varchar, nullable)
  - System/User der die Transaktion markiert hat

- **flagged_reason** (text, nullable)
  - Grund für Markierung

- **signals** (json, nullable)
  - Risikosignale/Trigger als JSON
  - Strukturierte Risikoindikatoren

#### Externe Datenquellen (11 Integrationen)

**1. Registry (Handelsregister Basic)**
- **registry_company_number** (text)
- **registry_source** (text) - Quelle (z.B. "Handelsregister")
- **registry_match_score** (double precision) - Matching-Genauigkeit
- **registry_data** (jsonb) - Registrierungsdaten
- **registry_last_refreshed_at** (timestamp)

**2. Genesis (Statistisches Bundesamt)**
- **genesis_context** (jsonb)
- **genesis_last_refreshed_at** (timestamp)

**3. GovData (Offene Verwaltungsdaten)**
- **govdata_data** (jsonb)
- **govdata_last_refreshed_at** (timestamp)

**4. Bundesanzeiger**
- **bundesanzeiger_data** (jsonb)
- **bundesanzeiger_last_refreshed_at** (timestamp)

**5. Insolvency (Insolvenzregister)**
- **insolvency_data** (jsonb)
- **insolvency_last_refreshed_at** (timestamp)

**6. RSS Alerts (News/Medien)**
- **rss_alerts** (jsonb)
- **rss_last_refreshed_at** (timestamp)

**7. Sanctions (Sanktionslisten)**
- **sanctions_data** (jsonb)
- **sanctions_last_refreshed_at** (timestamp)

**8. PEP (Politically Exposed Persons)**
- **pep_data** (jsonb)
- **pep_last_refreshed_at** (timestamp)

**9. GLEIF (Legal Entity Identifier)**
- **gleif_lei** (text) - LEI-Nummer
- **gleif_data** (json)
- **gleif_last_refreshed_at** (timestamp)

**10. EU Sanctions**
- **eu_sanctions_data** (jsonb)
- **eu_sanctions_last_refreshed_at** (timestamp)

**11. Handelsregister (Extended)**
- **handelsregister_data** (jsonb)
- **handelsregister_last_refreshed_at** (timestamp)
- **handelsregister_status** (text)
- **handelsregister_entity_id** (bigint)

#### Zeitstempel
- **created_at** (timestamp, nullable)
- **updated_at** (timestamp, nullable)

**Charakteristik**: Hochgradig angereichertes Data Warehouse für Compliance und Risk Management mit Multi-Source-Integration

---

## Zusammenfassung der Architektur

```
┌─────────────────────────────────────┐
│     Backend Schema (Staging)        │
├─────────────────────────────────────┤
│ • Rohdaten-Import                   │
│ • Lockere Typisierung (text)        │
│ • Source-Tracking                   │
│ • Prompt/AI-Integration             │
└────────────┬────────────────────────┘
             │
             │ ETL/Processing
             ↓
┌─────────────────────────────────────┐
│     Public Schema (Production)      │
├─────────────────────────────────────┤
│ • Normalisierte Daten               │
│ • Strikte Typisierung               │
│ • Multi-Source-Enrichment           │
│ • Risk & Compliance Features        │
└─────────────────────────────────────┘
```

## Datenfluss-Hypothese

1. **Import**: Rohdaten landen in `backend.transactions`
2. **AI-Verarbeitung**: Prompts generieren Outputs in `backend.transaction_outputs`
3. **Enrichment**: Externe Datenquellen werden abgefragt
4. **Normalisierung**: Daten werden nach `public.companies` und `public.transactions` übertragen
5. **Risk Assessment**: Risikoscores und Flags werden berechnet
6. **Review**: Transaktionen mit `requires_review=true` landen in der Queue

## Technische Hinweise

### Probleme
- ⚠️ `public.transactions` hat 9x duplizierte `id` Spalte im Schema
- ⚠️ `backend.transactions` speichert Timestamps als TEXT statt TIMESTAMP
- ⚠️ Keine expliziten Foreign Key Constraints sichtbar zwischen den Schemas

### Empfehlungen
1. Schema-Anomalie in `public.transactions` untersuchen
2. Datum-Felder in `backend.transactions` zu echten TIMESTAMP-Typen migrieren
3. Indizes auf häufig genutzte JOIN/WHERE Spalten prüfen
4. Foreign Key Constraints zwischen den Schemas dokumentieren
