removed KycRiskCalculator, added 3 new field for the database table data_pool_backend, added simple risk level and mapping funcion for these new risk factor
This commit is contained in:
@@ -138,6 +138,9 @@ class SyncBackendDataPool implements ShouldQueue
|
||||
'status' => $record->status,
|
||||
'created_at' => $record->created_at,
|
||||
'last_modified_at' => $record->last_modified_at,
|
||||
'risk_score' => $record->risk_score,
|
||||
'risk_level' => $record->risk_level,
|
||||
'risk_details_json' => $record->risk_details_json,
|
||||
'prompt_id' => $record->prompt_id,
|
||||
'output_key' => $record->output_key,
|
||||
'content' => $record->content,
|
||||
@@ -191,6 +194,9 @@ class SyncBackendDataPool implements ShouldQueue
|
||||
't.status',
|
||||
't.created_at',
|
||||
't.last_modified_at',
|
||||
't.risk_score',
|
||||
't.risk_level',
|
||||
't.risk_details_json',
|
||||
'tout.prompt_id',
|
||||
'tout.output_key',
|
||||
'tout.content',
|
||||
|
||||
@@ -6,7 +6,6 @@ namespace App\Jobs;
|
||||
|
||||
use App\Models\Company;
|
||||
use App\Models\Transaction;
|
||||
use App\Services\KycRiskCalculator;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
@@ -32,13 +31,12 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
*/
|
||||
public function __construct(
|
||||
public ?int $batchSize = 100,
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
public function handle(KycRiskCalculator $kycCalculator): void
|
||||
public function handle(): void
|
||||
{
|
||||
$startTime = now();
|
||||
|
||||
@@ -47,8 +45,8 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
]);
|
||||
|
||||
try {
|
||||
DB::transaction(function () use ($kycCalculator) {
|
||||
$this->transformData($kycCalculator);
|
||||
DB::transaction(function () {
|
||||
$this->transformData();
|
||||
});
|
||||
|
||||
$duration = now()->diffInSeconds($startTime);
|
||||
@@ -69,7 +67,7 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
/**
|
||||
* Transform data from backend_data_pool to companies and transactions
|
||||
*/
|
||||
private function transformData(KycRiskCalculator $kycCalculator): void
|
||||
private function transformData(): void
|
||||
{
|
||||
// Get all unique transaction IDs from data pool
|
||||
$transactionIds = DB::table('backend_data_pool')
|
||||
@@ -97,7 +95,7 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
$firstOutput = $outputs->first();
|
||||
|
||||
// 1. Create or update Company
|
||||
$company = $this->createOrUpdateCompany($firstOutput, $outputs, $kycCalculator);
|
||||
$company = $this->createOrUpdateCompany($firstOutput, $outputs);
|
||||
if ($company->wasRecentlyCreated) {
|
||||
$processedCompanies++;
|
||||
}
|
||||
@@ -118,21 +116,23 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
/**
|
||||
* Create or update a Company from data pool outputs
|
||||
*/
|
||||
private function createOrUpdateCompany($firstOutput, $outputs, KycRiskCalculator $kycCalculator): Company
|
||||
private function createOrUpdateCompany($firstOutput, $outputs): Company
|
||||
{
|
||||
$corporateEntity = $firstOutput->corporate_entity;
|
||||
|
||||
// Calculate KYC Risk Level
|
||||
$kycRiskLevel = $kycCalculator->calculateKycRiskLevel(collect([$outputs])->first());
|
||||
// Use backend risk_score and map to risk_level
|
||||
$backendRiskScore = $firstOutput->risk_score ?? 50;
|
||||
$kycRiskLevel = $this->mapBackendRiskScoreToLevel($backendRiskScore);
|
||||
|
||||
// Extract company data from outputs
|
||||
$companyData = [
|
||||
'country' => $this->extractCountry($firstOutput, $outputs),
|
||||
'kyc_risk_level' => $kycRiskLevel,
|
||||
'sector' => $this->extractField($outputs, 'corporate_sector', 255),
|
||||
'headquarters' => $this->extractField($outputs, 'corporate_HQ', 255),
|
||||
'summary' => $this->extractField($outputs, 'corporate_summary', 5000), // text field, longer OK
|
||||
'legal_name' => $this->extractField($outputs, 'corporate_name', 255),
|
||||
'sector' => $this->extractLeanField($outputs, 'entity_corporate_sector', 255),
|
||||
'headquarters' => $this->extractLeanField($outputs, 'entity_corporate_HQ', 255),
|
||||
'summary' => $this->extractField($outputs, 'entity_corporate_summary', 5000), // text field, longer OK
|
||||
'legal_name' => $this->extractLegalName($outputs, $corporateEntity),
|
||||
'ticker' => null, // Ticker is not available in backend_data_pool
|
||||
];
|
||||
|
||||
return Company::updateOrCreate(
|
||||
@@ -146,14 +146,27 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
*/
|
||||
private function createOrUpdateTransaction(Company $company, $firstOutput, $outputs): Transaction
|
||||
{
|
||||
$reference = 'MIGRATED-' . $firstOutput->transaction_id;
|
||||
// Generate better reference number
|
||||
$reference = $this->generateTransactionReference($firstOutput);
|
||||
|
||||
// Map KYC Risk Level to Transaction Status
|
||||
$status = match ($company->kyc_risk_level) {
|
||||
// Use risk_score from backend (leading field)
|
||||
$backendRiskScore = $firstOutput->risk_score ?? 50; // Default to 50 (high risk) if not set
|
||||
|
||||
// Map backend risk_score to risk_level
|
||||
// -100 to 20 = Critical
|
||||
// 20 to 80 = High
|
||||
// 80 to 100 = Low
|
||||
$riskLevel = $this->mapBackendRiskScoreToLevel($backendRiskScore);
|
||||
|
||||
// Convert to 0-255 scale for frontend transactions table
|
||||
$riskScore = $this->mapBackendRiskScoreTo255Scale($backendRiskScore);
|
||||
|
||||
// Map risk level to Transaction Status
|
||||
$status = match ($riskLevel) {
|
||||
'critical' => Transaction::STATUS_TRUE_POSITIVE,
|
||||
'high' => Transaction::STATUS_FALSE_POSITIVE,
|
||||
'low' => Transaction::STATUS_CLEARED,
|
||||
default => Transaction::STATUS_FALSE_POSITIVE, // Default to high risk
|
||||
default => Transaction::STATUS_FALSE_POSITIVE,
|
||||
};
|
||||
|
||||
// Core transaction data
|
||||
@@ -162,13 +175,19 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
'amount' => $firstOutput->tx_amount,
|
||||
'currency' => $firstOutput->tx_currency ?? 'EUR',
|
||||
'counterparty' => $firstOutput->corporate_counterparty,
|
||||
'counterparty_country' => $this->extractCountryCode($firstOutput->tx_country_incoming),
|
||||
'channel' => $firstOutput->source_file,
|
||||
'counterparty_country' => $this->extractCountryCode($firstOutput->tx_country_incoming, $firstOutput->corporate_counterparty),
|
||||
'counterparty_kyc_risk_level' => $riskLevel,
|
||||
'channel' => $this->determineTransactionType($firstOutput),
|
||||
'executed_at' => $this->parseDate($firstOutput->tx_date),
|
||||
'risk_score' => $this->extractRiskScore($outputs),
|
||||
'risk_score' => $riskScore,
|
||||
'status' => $status,
|
||||
'requires_review' => true,
|
||||
'requires_review' => $this->shouldRequireReview($riskLevel),
|
||||
'flagged_reason' => $firstOutput->tx_purpose,
|
||||
// Store backend risk data
|
||||
'entity_risk_breakdown' => $firstOutput->risk_details_json,
|
||||
'counterparty_risk_breakdown' => null,
|
||||
'transaction_plausibility_breakdown' => null,
|
||||
'combined_risk_breakdown' => null,
|
||||
];
|
||||
|
||||
// Map all output_keys to their respective columns
|
||||
@@ -218,15 +237,29 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
|
||||
/**
|
||||
* Extract country code (convert to ISO 2-letter if needed)
|
||||
* Also checks counterparty name for country indicators
|
||||
*/
|
||||
private function extractCountryCode(?string $country): ?string
|
||||
private function extractCountryCode(?string $country, ?string $counterpartyName = null): ?string
|
||||
{
|
||||
// First, try to extract from counterparty name (highest priority for tax havens)
|
||||
if (! empty($counterpartyName)) {
|
||||
$extractedFromName = $this->extractCountryFromText($counterpartyName);
|
||||
if ($extractedFromName) {
|
||||
return $extractedFromName;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($country)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// If already 2 letters, return uppercase
|
||||
// If already 2 letters, check if it's a suspicious/wrong code
|
||||
if (strlen($country) === 2) {
|
||||
$suspiciousCodes = ['IO']; // British Indian Ocean Territory often wrong for Virgin Islands
|
||||
if (in_array(strtoupper($country), $suspiciousCodes)) {
|
||||
return null; // Reject suspicious codes
|
||||
}
|
||||
|
||||
return strtoupper($country);
|
||||
}
|
||||
|
||||
@@ -257,26 +290,77 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract risk score from tranx_score output
|
||||
* Extract country code from text (e.g., company name)
|
||||
*/
|
||||
private function extractRiskScore($outputs): int
|
||||
private function extractCountryFromText(string $text): ?string
|
||||
{
|
||||
$scoreOutput = $outputs->firstWhere('output_key', 'tranx_score');
|
||||
$countryPatterns = [
|
||||
'/\b(?:British )?Virgin Islands\b/i' => 'VG',
|
||||
'/\bCayman Islands\b/i' => 'KY',
|
||||
'/\bBermuda\b/i' => 'BM',
|
||||
'/\bBahamas\b/i' => 'BS',
|
||||
'/\bPanama\b/i' => 'PA',
|
||||
'/\bLiechtenstein\b/i' => 'LI',
|
||||
'/\bMonaco\b/i' => 'MC',
|
||||
'/\bLuxembourg\b/i' => 'LU',
|
||||
'/\bSwitzerland\b/i' => 'CH',
|
||||
'/\bAzerbaijan\b/i' => 'AZ',
|
||||
'/\bRussia\b/i' => 'RU',
|
||||
'/\bChina\b/i' => 'CN',
|
||||
'/\bGermany\b/i' => 'DE',
|
||||
];
|
||||
|
||||
if (! $scoreOutput) {
|
||||
return 128; // Default: Medium risk (255/2)
|
||||
foreach ($countryPatterns as $pattern => $code) {
|
||||
if (preg_match($pattern, $text)) {
|
||||
return $code;
|
||||
}
|
||||
}
|
||||
|
||||
$scoreData = json_decode($scoreOutput->content, true);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (is_array($scoreData) && isset($scoreData['score'])) {
|
||||
// Assume score is 0-100, convert to 0-255
|
||||
$score = (int) $scoreData['score'];
|
||||
|
||||
return (int) round(($score / 100) * 255);
|
||||
/**
|
||||
* Map backend risk_score (-100 to 100) to risk_level
|
||||
* -100 to 20 = Critical
|
||||
* 20 to 80 = High
|
||||
* 80 to 100 = Low
|
||||
*/
|
||||
private function mapBackendRiskScoreToLevel(int $backendRiskScore): string
|
||||
{
|
||||
if ($backendRiskScore <= 20) {
|
||||
return 'critical';
|
||||
}
|
||||
|
||||
return 128;
|
||||
if ($backendRiskScore <= 80) {
|
||||
return 'high';
|
||||
}
|
||||
|
||||
return 'low';
|
||||
}
|
||||
|
||||
/**
|
||||
* Map backend risk_score (-100 to 100) to 0-255 scale
|
||||
*/
|
||||
private function mapBackendRiskScoreTo255Scale(int $backendRiskScore): int
|
||||
{
|
||||
// Normalize -100 to 100 → 0 to 255
|
||||
// Formula: ((score + 100) / 200) * 255
|
||||
$normalized = (($backendRiskScore + 100) / 200) * 255;
|
||||
|
||||
return (int) round(max(0, min(255, $normalized)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if transaction requires review based on risk level
|
||||
*/
|
||||
private function shouldRequireReview(string $riskLevel): bool
|
||||
{
|
||||
return match ($riskLevel) {
|
||||
'critical' => true,
|
||||
'high' => true,
|
||||
'low' => false,
|
||||
default => true,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -313,6 +397,71 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
return $this->truncateString((string) $data, $maxLength);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract a lean/concise field from outputs (extracts first sentence only)
|
||||
*/
|
||||
private function extractLeanField($outputs, string $outputKey, int $maxLength = 255): mixed
|
||||
{
|
||||
$fullText = $this->extractField($outputs, $outputKey, 5000);
|
||||
|
||||
if (! $fullText) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Extract first sentence or up to first period
|
||||
$firstSentence = preg_split('/\.(?:\s|$)/', $fullText, 2)[0];
|
||||
|
||||
if ($firstSentence) {
|
||||
$firstSentence = trim($firstSentence).'.';
|
||||
|
||||
return $this->truncateString($firstSentence, $maxLength);
|
||||
}
|
||||
|
||||
return $this->truncateString($fullText, $maxLength);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract legal name from corporate name field
|
||||
*/
|
||||
private function extractLegalName($outputs, string $fallbackName): ?string
|
||||
{
|
||||
$fullText = $this->extractField($outputs, 'entity_corporate_name', 5000);
|
||||
|
||||
if (! $fullText) {
|
||||
return $fallbackName;
|
||||
}
|
||||
|
||||
// Pattern 1: "is exactly as shown in an official register: [NAME]"
|
||||
if (preg_match('/is exactly as shown in an official register:\s*([A-Z][^.,]+(?:AG|SE|GmbH|Inc\.|Ltd\.|Corp\.|N\.V\.|S\.A\.|Aktiengesellschaft))/i', $fullText, $matches)) {
|
||||
return trim($matches[1]);
|
||||
}
|
||||
|
||||
// Pattern 2: "is [NAME]" - matches various patterns like "legal name is NAME", "company is NAME"
|
||||
if (preg_match('/(?:legal name|name|company) (?:of .+ )?is\s+([A-Z][^.,]+(?:AG|SE|GmbH|Inc\.|Ltd\.|Corp\.|N\.V\.|S\.A\.|Aktiengesellschaft))/i', $fullText, $matches)) {
|
||||
$name = trim($matches[1]);
|
||||
// Remove trailing explanatory text
|
||||
$name = preg_replace('/\s+(?:is exactly|exactly as shown|with former|former names).*$/i', '', $name);
|
||||
|
||||
return trim($name);
|
||||
}
|
||||
|
||||
// Pattern 3: "of [NAME]" - matches "legal name of Deutsche Bank AG"
|
||||
if (preg_match('/legal name of\s+([A-Z][^.,]+(?:AG|SE|GmbH|Inc\.|Ltd\.|Corp\.|N\.V\.|S\.A\.|Aktiengesellschaft))/i', $fullText, $matches)) {
|
||||
$name = trim($matches[1]);
|
||||
$name = preg_replace('/\s+(?:is exactly|with former).*$/i', '', $name);
|
||||
|
||||
return trim($name);
|
||||
}
|
||||
|
||||
// Pattern 4: Extract company name with suffix at start of sentence
|
||||
if (preg_match('/^(?:The current legal name (?:of|is) )?([A-Z][^.,]+(?:AG|SE|GmbH|Inc\.|Ltd\.|Corp\.|N\.V\.|S\.A\.|Aktiengesellschaft))/i', $fullText, $matches)) {
|
||||
return trim($matches[1]);
|
||||
}
|
||||
|
||||
// If no pattern matches, use the fallback name
|
||||
return $fallbackName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Truncate string to max length
|
||||
*/
|
||||
@@ -322,7 +471,7 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
return $text;
|
||||
}
|
||||
|
||||
return substr($text, 0, $maxLength - 3) . '...';
|
||||
return substr($text, 0, $maxLength - 3).'...';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -343,6 +492,98 @@ class TransformDataPoolToProduction implements ShouldQueue
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a meaningful transaction reference
|
||||
*/
|
||||
private function generateTransactionReference($firstOutput): string
|
||||
{
|
||||
// Try to extract reference from raw_payload
|
||||
if (! empty($firstOutput->raw_payload)) {
|
||||
$payload = json_decode($firstOutput->raw_payload, true);
|
||||
|
||||
// Look for common reference fields
|
||||
$referenceFields = [
|
||||
'Transaction Reference',
|
||||
'Reference',
|
||||
'Transaction ID',
|
||||
'Payment Reference',
|
||||
'Transfer Reference',
|
||||
];
|
||||
|
||||
foreach ($referenceFields as $field) {
|
||||
if (isset($payload[$field]) && ! empty($payload[$field])) {
|
||||
return (string) $payload[$field];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Generate a date-based reference if no reference found
|
||||
$date = $this->parseDate($firstOutput->tx_date);
|
||||
$dateStr = $date ? $date->format('Ymd') : date('Ymd');
|
||||
|
||||
return sprintf('TXN-%s-%05d', $dateStr, $firstOutput->transaction_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine transaction type from available data
|
||||
*/
|
||||
private function determineTransactionType($firstOutput): string
|
||||
{
|
||||
// Try to determine from raw_payload first
|
||||
if (! empty($firstOutput->raw_payload)) {
|
||||
$payload = json_decode($firstOutput->raw_payload, true);
|
||||
|
||||
// Check for explicit transaction type field
|
||||
if (isset($payload['Transaction Type']) && ! empty($payload['Transaction Type'])) {
|
||||
return $payload['Transaction Type'];
|
||||
}
|
||||
|
||||
if (isset($payload['Payment Type']) && ! empty($payload['Payment Type'])) {
|
||||
return $payload['Payment Type'];
|
||||
}
|
||||
}
|
||||
|
||||
// Determine based on amount and countries
|
||||
$amount = (float) $firstOutput->tx_amount;
|
||||
$isInternational = $firstOutput->tx_country_outgoing !== $firstOutput->tx_country_incoming;
|
||||
|
||||
// Large international transactions are likely SWIFT
|
||||
if ($isInternational && $amount > 100000) {
|
||||
return 'SWIFT Transfer';
|
||||
}
|
||||
|
||||
// European transfers
|
||||
if ($isInternational && $this->isEuropeanCountry($firstOutput->tx_country_incoming)) {
|
||||
return 'SEPA Transfer';
|
||||
}
|
||||
|
||||
// Domestic high-value
|
||||
if (! $isInternational && $amount > 50000) {
|
||||
return 'Wire Transfer';
|
||||
}
|
||||
|
||||
// Default
|
||||
return 'Bank Transfer';
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if country is in Europe
|
||||
*/
|
||||
private function isEuropeanCountry(?string $countryCode): bool
|
||||
{
|
||||
if (empty($countryCode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$europeanCountries = [
|
||||
'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR',
|
||||
'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL',
|
||||
'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'CH', 'NO', 'IS',
|
||||
];
|
||||
|
||||
return in_array(strtoupper($countryCode), $europeanCountries);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if column exists in transactions table
|
||||
*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+299
@@ -0,0 +1,299 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('transactions', function (Blueprint $table) {
|
||||
// Entity Corporate Information
|
||||
$table->jsonb('entity_corporate_summary')->nullable();
|
||||
$table->jsonb('entity_corporate_history')->nullable();
|
||||
$table->jsonb('entity_corporate_purpose')->nullable();
|
||||
$table->jsonb('entity_corporate_sector')->nullable();
|
||||
$table->jsonb('entity_corporate_nace')->nullable();
|
||||
$table->jsonb('entity_corporate_products')->nullable();
|
||||
$table->jsonb('entity_corporate_markets')->nullable();
|
||||
$table->jsonb('entity_corporate_supply')->nullable();
|
||||
$table->jsonb('entity_corporate_name')->nullable();
|
||||
$table->jsonb('entity_corporate_form')->nullable();
|
||||
$table->jsonb('entity_corporate_forum')->nullable();
|
||||
$table->jsonb('entity_corporate_HQ')->nullable();
|
||||
$table->jsonb('entity_corporate_locations')->nullable();
|
||||
$table->jsonb('entity_corporate_holding')->nullable();
|
||||
$table->jsonb('entity_corporate_shareholders')->nullable();
|
||||
$table->jsonb('entity_corporate_board')->nullable();
|
||||
$table->jsonb('entity_corporate_supervisory')->nullable();
|
||||
$table->jsonb('entity_corporate_powerofattorney')->nullable();
|
||||
$table->jsonb('entity_corporate_taxID')->nullable();
|
||||
$table->jsonb('entity_corporate_LEI')->nullable();
|
||||
$table->jsonb('entity_corporate_UBO')->nullable();
|
||||
$table->jsonb('entity_corporate_employeecount')->nullable();
|
||||
$table->jsonb('entity_corporate_turnover')->nullable();
|
||||
$table->jsonb('entity_corporate_EBIT')->nullable();
|
||||
$table->jsonb('entity_corporate_netprofits')->nullable();
|
||||
$table->jsonb('entity_corporate_balancesheet')->nullable();
|
||||
$table->jsonb('entity_corporate_auditfindings')->nullable();
|
||||
$table->jsonb('entity_corporate_insolvency')->nullable();
|
||||
$table->jsonb('entity_corporate_liquidation')->nullable();
|
||||
$table->jsonb('entity_corporate_adhoc')->nullable();
|
||||
$table->jsonb('entity_corporate_pressrelease')->nullable();
|
||||
$table->jsonb('entity_corporate_votes')->nullable();
|
||||
$table->jsonb('entity_corporate_directordealings')->nullable();
|
||||
$table->jsonb('entity_corporate_brands')->nullable();
|
||||
$table->jsonb('entity_corporate_website')->nullable();
|
||||
$table->jsonb('entity_corporate_domain')->nullable();
|
||||
$table->jsonb('entity_corporate_IBAN')->nullable();
|
||||
$table->jsonb('entity_corporate_solvency')->nullable();
|
||||
$table->jsonb('entity_corporate_rating')->nullable();
|
||||
$table->jsonb('entity_corporate_ESG')->nullable();
|
||||
$table->jsonb('entity_corporate_license')->nullable();
|
||||
$table->jsonb('entity_corporate_warnings')->nullable();
|
||||
$table->jsonb('entity_corporate_eusanctions')->nullable();
|
||||
$table->jsonb('entity_corporate_ofacsanctions')->nullable();
|
||||
$table->jsonb('entity_corporate_uksanctions')->nullable();
|
||||
$table->jsonb('entity_corporate_pepexposure')->nullable();
|
||||
$table->jsonb('entity_corporate_adversemediascanning')->nullable();
|
||||
$table->jsonb('entity_corporate_corruptionexposure')->nullable();
|
||||
$table->jsonb('entity_corporate_AMLexposure')->nullable();
|
||||
$table->jsonb('entity_corporate_CTYexposure')->nullable();
|
||||
$table->jsonb('entity_corporate_adverse')->nullable();
|
||||
$table->jsonb('entity_corporate_pep')->nullable();
|
||||
$table->jsonb('entity_corporate_adverse2')->nullable();
|
||||
$table->jsonb('entity_corporate_exportcontrol')->nullable();
|
||||
$table->jsonb('entity_corporate_mediamatch')->nullable();
|
||||
$table->jsonb('entity_corporate_haven')->nullable();
|
||||
$table->jsonb('entity_corporate_insiders')->nullable();
|
||||
$table->jsonb('entity_corporate_courtcases')->nullable();
|
||||
$table->jsonb('entity_corporate_manda')->nullable();
|
||||
$table->jsonb('entity_corporate_pepdetail')->nullable();
|
||||
|
||||
// Counterparty Corporate Information
|
||||
$table->jsonb('counterparty_corporate_summary')->nullable();
|
||||
$table->jsonb('counterparty_corporate_history')->nullable();
|
||||
$table->jsonb('counterparty_corporate_purpose')->nullable();
|
||||
$table->jsonb('counterparty_corporate_sector')->nullable();
|
||||
$table->jsonb('counterparty_corporate_nace')->nullable();
|
||||
$table->jsonb('counterparty_corporate_products')->nullable();
|
||||
$table->jsonb('counterparty_corporate_markets')->nullable();
|
||||
$table->jsonb('counterparty_corporate_supply')->nullable();
|
||||
$table->jsonb('counterparty_corporate_name')->nullable();
|
||||
$table->jsonb('counterparty_corporate_form')->nullable();
|
||||
$table->jsonb('counterparty_corporate_forum')->nullable();
|
||||
$table->jsonb('counterparty_corporate_HQ')->nullable();
|
||||
$table->jsonb('counterparty_corporate_locations')->nullable();
|
||||
$table->jsonb('counterparty_corporate_holding')->nullable();
|
||||
$table->jsonb('counterparty_corporate_shareholders')->nullable();
|
||||
$table->jsonb('counterparty_corporate_board')->nullable();
|
||||
$table->jsonb('counterparty_corporate_supervisory')->nullable();
|
||||
$table->jsonb('counterparty_corporate_powerofattorney')->nullable();
|
||||
$table->jsonb('counterparty_corporate_taxID')->nullable();
|
||||
$table->jsonb('counterparty_corporate_LEI')->nullable();
|
||||
$table->jsonb('counterparty_corporate_UBO')->nullable();
|
||||
$table->jsonb('counterparty_corporate_employeecount')->nullable();
|
||||
$table->jsonb('counterparty_corporate_turnover')->nullable();
|
||||
$table->jsonb('counterparty_corporate_EBIT')->nullable();
|
||||
$table->jsonb('counterparty_corporate_netprofits')->nullable();
|
||||
$table->jsonb('counterparty_corporate_balancesheet')->nullable();
|
||||
$table->jsonb('counterparty_corporate_auditfindings')->nullable();
|
||||
$table->jsonb('counterparty_corporate_insolvency')->nullable();
|
||||
$table->jsonb('counterparty_corporate_liquidation')->nullable();
|
||||
$table->jsonb('counterparty_corporate_adhoc')->nullable();
|
||||
$table->jsonb('counterparty_corporate_pressrelease')->nullable();
|
||||
$table->jsonb('counterparty_corporate_votes')->nullable();
|
||||
$table->jsonb('counterparty_corporate_directordealings')->nullable();
|
||||
$table->jsonb('counterparty_corporate_brands')->nullable();
|
||||
$table->jsonb('counterparty_corporate_website')->nullable();
|
||||
$table->jsonb('counterparty_corporate_domain')->nullable();
|
||||
$table->jsonb('counterparty_corporate_IBAN')->nullable();
|
||||
$table->jsonb('counterparty_corporate_solvency')->nullable();
|
||||
$table->jsonb('counterparty_corporate_rating')->nullable();
|
||||
$table->jsonb('counterparty_corporate_ESG')->nullable();
|
||||
$table->jsonb('counterparty_corporate_license')->nullable();
|
||||
$table->jsonb('counterparty_corporate_warnings')->nullable();
|
||||
$table->jsonb('counterparty_corporate_eusanctions')->nullable();
|
||||
$table->jsonb('counterparty_corporate_ofacsanctions')->nullable();
|
||||
$table->jsonb('counterparty_corporate_uksanctions')->nullable();
|
||||
$table->jsonb('counterparty_corporate_pepexposure')->nullable();
|
||||
$table->jsonb('counterparty_corporate_adversemediascanning')->nullable();
|
||||
$table->jsonb('counterparty_corporate_corruptionexposure')->nullable();
|
||||
$table->jsonb('counterparty_corporate_AMLexposure')->nullable();
|
||||
$table->jsonb('counterparty_corporate_CTYexposure')->nullable();
|
||||
$table->jsonb('counterparty_corporate_adverse')->nullable();
|
||||
$table->jsonb('counterparty_corporate_pep')->nullable();
|
||||
$table->jsonb('counterparty_corporate_adverse2')->nullable();
|
||||
$table->jsonb('counterparty_corporate_exportcontrol')->nullable();
|
||||
$table->jsonb('counterparty_corporate_mediamatch')->nullable();
|
||||
$table->jsonb('counterparty_corporate_haven')->nullable();
|
||||
$table->jsonb('counterparty_corporate_insiders')->nullable();
|
||||
$table->jsonb('counterparty_corporate_courtcases')->nullable();
|
||||
$table->jsonb('counterparty_corporate_manda')->nullable();
|
||||
$table->jsonb('counterparty_corporate_pepdetail')->nullable();
|
||||
|
||||
// Entity Risk Assessment
|
||||
$table->jsonb('entity_sanctions_circumvention')->nullable();
|
||||
$table->jsonb('entity_corruption_sector')->nullable();
|
||||
$table->jsonb('entity_corruption_country')->nullable();
|
||||
$table->jsonb('entity_corruption_relationship')->nullable();
|
||||
$table->jsonb('entity_country_risk')->nullable();
|
||||
|
||||
// Counterparty Risk Assessment
|
||||
$table->jsonb('counterparty_sanctions_circumvention')->nullable();
|
||||
$table->jsonb('counterparty_corruption_sector')->nullable();
|
||||
$table->jsonb('counterparty_corruption_country')->nullable();
|
||||
$table->jsonb('counterparty_corruption_relationship')->nullable();
|
||||
$table->jsonb('counterparty_country_risk')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('transactions', function (Blueprint $table) {
|
||||
$table->dropColumn([
|
||||
// Entity Corporate Information
|
||||
'entity_corporate_summary',
|
||||
'entity_corporate_history',
|
||||
'entity_corporate_purpose',
|
||||
'entity_corporate_sector',
|
||||
'entity_corporate_nace',
|
||||
'entity_corporate_products',
|
||||
'entity_corporate_markets',
|
||||
'entity_corporate_supply',
|
||||
'entity_corporate_name',
|
||||
'entity_corporate_form',
|
||||
'entity_corporate_forum',
|
||||
'entity_corporate_HQ',
|
||||
'entity_corporate_locations',
|
||||
'entity_corporate_holding',
|
||||
'entity_corporate_shareholders',
|
||||
'entity_corporate_board',
|
||||
'entity_corporate_supervisory',
|
||||
'entity_corporate_powerofattorney',
|
||||
'entity_corporate_taxID',
|
||||
'entity_corporate_LEI',
|
||||
'entity_corporate_UBO',
|
||||
'entity_corporate_employeecount',
|
||||
'entity_corporate_turnover',
|
||||
'entity_corporate_EBIT',
|
||||
'entity_corporate_netprofits',
|
||||
'entity_corporate_balancesheet',
|
||||
'entity_corporate_auditfindings',
|
||||
'entity_corporate_insolvency',
|
||||
'entity_corporate_liquidation',
|
||||
'entity_corporate_adhoc',
|
||||
'entity_corporate_pressrelease',
|
||||
'entity_corporate_votes',
|
||||
'entity_corporate_directordealings',
|
||||
'entity_corporate_brands',
|
||||
'entity_corporate_website',
|
||||
'entity_corporate_domain',
|
||||
'entity_corporate_IBAN',
|
||||
'entity_corporate_solvency',
|
||||
'entity_corporate_rating',
|
||||
'entity_corporate_ESG',
|
||||
'entity_corporate_license',
|
||||
'entity_corporate_warnings',
|
||||
'entity_corporate_eusanctions',
|
||||
'entity_corporate_ofacsanctions',
|
||||
'entity_corporate_uksanctions',
|
||||
'entity_corporate_pepexposure',
|
||||
'entity_corporate_adversemediascanning',
|
||||
'entity_corporate_corruptionexposure',
|
||||
'entity_corporate_AMLexposure',
|
||||
'entity_corporate_CTYexposure',
|
||||
'entity_corporate_adverse',
|
||||
'entity_corporate_pep',
|
||||
'entity_corporate_adverse2',
|
||||
'entity_corporate_exportcontrol',
|
||||
'entity_corporate_mediamatch',
|
||||
'entity_corporate_haven',
|
||||
'entity_corporate_insiders',
|
||||
'entity_corporate_courtcases',
|
||||
'entity_corporate_manda',
|
||||
'entity_corporate_pepdetail',
|
||||
// Counterparty Corporate Information
|
||||
'counterparty_corporate_summary',
|
||||
'counterparty_corporate_history',
|
||||
'counterparty_corporate_purpose',
|
||||
'counterparty_corporate_sector',
|
||||
'counterparty_corporate_nace',
|
||||
'counterparty_corporate_products',
|
||||
'counterparty_corporate_markets',
|
||||
'counterparty_corporate_supply',
|
||||
'counterparty_corporate_name',
|
||||
'counterparty_corporate_form',
|
||||
'counterparty_corporate_forum',
|
||||
'counterparty_corporate_HQ',
|
||||
'counterparty_corporate_locations',
|
||||
'counterparty_corporate_holding',
|
||||
'counterparty_corporate_shareholders',
|
||||
'counterparty_corporate_board',
|
||||
'counterparty_corporate_supervisory',
|
||||
'counterparty_corporate_powerofattorney',
|
||||
'counterparty_corporate_taxID',
|
||||
'counterparty_corporate_LEI',
|
||||
'counterparty_corporate_UBO',
|
||||
'counterparty_corporate_employeecount',
|
||||
'counterparty_corporate_turnover',
|
||||
'counterparty_corporate_EBIT',
|
||||
'counterparty_corporate_netprofits',
|
||||
'counterparty_corporate_balancesheet',
|
||||
'counterparty_corporate_auditfindings',
|
||||
'counterparty_corporate_insolvency',
|
||||
'counterparty_corporate_liquidation',
|
||||
'counterparty_corporate_adhoc',
|
||||
'counterparty_corporate_pressrelease',
|
||||
'counterparty_corporate_votes',
|
||||
'counterparty_corporate_directordealings',
|
||||
'counterparty_corporate_brands',
|
||||
'counterparty_corporate_website',
|
||||
'counterparty_corporate_domain',
|
||||
'counterparty_corporate_IBAN',
|
||||
'counterparty_corporate_solvency',
|
||||
'counterparty_corporate_rating',
|
||||
'counterparty_corporate_ESG',
|
||||
'counterparty_corporate_license',
|
||||
'counterparty_corporate_warnings',
|
||||
'counterparty_corporate_eusanctions',
|
||||
'counterparty_corporate_ofacsanctions',
|
||||
'counterparty_corporate_uksanctions',
|
||||
'counterparty_corporate_pepexposure',
|
||||
'counterparty_corporate_adversemediascanning',
|
||||
'counterparty_corporate_corruptionexposure',
|
||||
'counterparty_corporate_AMLexposure',
|
||||
'counterparty_corporate_CTYexposure',
|
||||
'counterparty_corporate_adverse',
|
||||
'counterparty_corporate_pep',
|
||||
'counterparty_corporate_adverse2',
|
||||
'counterparty_corporate_exportcontrol',
|
||||
'counterparty_corporate_mediamatch',
|
||||
'counterparty_corporate_haven',
|
||||
'counterparty_corporate_insiders',
|
||||
'counterparty_corporate_courtcases',
|
||||
'counterparty_corporate_manda',
|
||||
'counterparty_corporate_pepdetail',
|
||||
// Entity Risk Assessment
|
||||
'entity_sanctions_circumvention',
|
||||
'entity_corruption_sector',
|
||||
'entity_corruption_country',
|
||||
'entity_corruption_relationship',
|
||||
'entity_country_risk',
|
||||
// Counterparty Risk Assessment
|
||||
'counterparty_sanctions_circumvention',
|
||||
'counterparty_corruption_sector',
|
||||
'counterparty_corruption_country',
|
||||
'counterparty_corruption_relationship',
|
||||
'counterparty_country_risk',
|
||||
]);
|
||||
});
|
||||
}
|
||||
};
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('transactions', function (Blueprint $table) {
|
||||
$table->string('counterparty_kyc_risk_level', 32)->nullable()->after('status');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('transactions', function (Blueprint $table) {
|
||||
$table->dropColumn('counterparty_kyc_risk_level');
|
||||
});
|
||||
}
|
||||
};
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('transactions', function (Blueprint $table) {
|
||||
// Entity risk breakdown (sender)
|
||||
$table->jsonb('entity_risk_breakdown')->nullable()->after('counterparty_kyc_risk_level');
|
||||
|
||||
// Counterparty risk breakdown (receiver)
|
||||
$table->jsonb('counterparty_risk_breakdown')->nullable()->after('entity_risk_breakdown');
|
||||
|
||||
// Transaction plausibility breakdown
|
||||
$table->jsonb('transaction_plausibility_breakdown')->nullable()->after('counterparty_risk_breakdown');
|
||||
|
||||
// Combined risk breakdown
|
||||
$table->jsonb('combined_risk_breakdown')->nullable()->after('transaction_plausibility_breakdown');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('transactions', function (Blueprint $table) {
|
||||
$table->dropColumn([
|
||||
'entity_risk_breakdown',
|
||||
'counterparty_risk_breakdown',
|
||||
'transaction_plausibility_breakdown',
|
||||
'combined_risk_breakdown',
|
||||
]);
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('backend_data_pool', function (Blueprint $table) {
|
||||
// Add risk fields from backend.transactions
|
||||
$table->integer('risk_score')->nullable()->after('last_modified_at');
|
||||
$table->text('risk_level')->nullable()->after('risk_score');
|
||||
$table->text('risk_details_json')->nullable()->after('risk_level');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('backend_data_pool', function (Blueprint $table) {
|
||||
$table->dropColumn(['risk_score', 'risk_level', 'risk_details_json']);
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,167 @@
|
||||
"output_key"
|
||||
"counterparty_corporate_summary"
|
||||
"entity_corporate_summary"
|
||||
"entity_corporate_history"
|
||||
"counterparty_corporate_history"
|
||||
"entity_corporate_purpose"
|
||||
"counterparty_corporate_purpose"
|
||||
"entity_corporate_sector"
|
||||
"counterparty_corporate_sector"
|
||||
"counterparty_corporate_nace"
|
||||
"entity_corporate_nace"
|
||||
"entity_corporate_products"
|
||||
"counterparty_corporate_products"
|
||||
"entity_corporate_markets"
|
||||
"counterparty_corporate_markets"
|
||||
"counterparty_corporate_supply"
|
||||
"entity_corporate_supply"
|
||||
"entity_corporate_name"
|
||||
"counterparty_corporate_name"
|
||||
"entity_corporate_form"
|
||||
"counterparty_corporate_form"
|
||||
"counterparty_corporate_forum"
|
||||
"entity_corporate_forum"
|
||||
"counterparty_corporate_HQ"
|
||||
"entity_corporate_HQ"
|
||||
"entity_corporate_locations"
|
||||
"counterparty_corporate_locations"
|
||||
"entity_corporate_holding"
|
||||
"counterparty_corporate_holding"
|
||||
"counterparty_corporate_shareholders"
|
||||
"entity_corporate_shareholders"
|
||||
"entity_corporate_board"
|
||||
"counterparty_corporate_board"
|
||||
"counterparty_corporate_supervisory"
|
||||
"entity_corporate_supervisory"
|
||||
"counterparty_corporate_powerofattorney"
|
||||
"entity_corporate_powerofattorney"
|
||||
"counterparty_corporate_taxID"
|
||||
"entity_corporate_taxID"
|
||||
"counterparty_corporate_LEI"
|
||||
"entity_corporate_LEI"
|
||||
"counterparty_corporate_UBO"
|
||||
"entity_corporate_UBO"
|
||||
"counterparty_corporate_employeecount"
|
||||
"entity_corporate_employeecount"
|
||||
"entity_corporate_turnover"
|
||||
"counterparty_corporate_turnover"
|
||||
"counterparty_corporate_EBIT"
|
||||
"entity_corporate_EBIT"
|
||||
"entity_corporate_netprofits"
|
||||
"counterparty_corporate_netprofits"
|
||||
"entity_corporate_balancesheet"
|
||||
"counterparty_corporate_balancesheet"
|
||||
"entity_corporate_auditfindings"
|
||||
"counterparty_corporate_auditfindings"
|
||||
"counterparty_corporate_insolvency"
|
||||
"entity_corporate_insolvency"
|
||||
"counterparty_corporate_liquidation"
|
||||
"entity_corporate_liquidation"
|
||||
"entity_corporate_adhoc"
|
||||
"counterparty_corporate_adhoc"
|
||||
"entity_corporate_pressrelease"
|
||||
"counterparty_corporate_pressrelease"
|
||||
"entity_corporate_votes"
|
||||
"counterparty_corporate_votes"
|
||||
"entity_corporate_directordealings"
|
||||
"counterparty_corporate_directordealings"
|
||||
"entity_corporate_brands"
|
||||
"counterparty_corporate_brands"
|
||||
"entity_corporate_website"
|
||||
"counterparty_corporate_website"
|
||||
"entity_corporate_domain"
|
||||
"counterparty_corporate_domain"
|
||||
"counterparty_corporate_IBAN"
|
||||
"entity_corporate_IBAN"
|
||||
"entity_corporate_solvency"
|
||||
"counterparty_corporate_solvency"
|
||||
"counterparty_corporate_rating"
|
||||
"entity_corporate_rating"
|
||||
"entity_corporate_ESG"
|
||||
"counterparty_corporate_ESG"
|
||||
"counterparty_corporate_license"
|
||||
"entity_corporate_license"
|
||||
"counterparty_corporate_warnings"
|
||||
"entity_corporate_warnings"
|
||||
"entity_corporate_eusanctions"
|
||||
"counterparty_corporate_eusanctions"
|
||||
"counterparty_corporate_ofacsanctions"
|
||||
"entity_corporate_ofacsanctions"
|
||||
"entity_corporate_uksanctions"
|
||||
"counterparty_corporate_uksanctions"
|
||||
"counterparty_corporate_pepexposure"
|
||||
"entity_corporate_pepexposure"
|
||||
"entity_corporate_adversemediascanning"
|
||||
"counterparty_corporate_adversemediascanning"
|
||||
"entity_corporate_corruptionexposure"
|
||||
"counterparty_corporate_corruptionexposure"
|
||||
"entity_corporate_AMLexposure"
|
||||
"counterparty_corporate_AMLexposure"
|
||||
"counterparty_corporate_CTYexposure"
|
||||
"entity_corporate_CTYexposure"
|
||||
"tranx_TX_AMOUNT"
|
||||
"tranx_historical"
|
||||
"tranx_TX_PURPOSE"
|
||||
"tranx_counterpartyassessment"
|
||||
"tranx_context"
|
||||
"tranx_report"
|
||||
"tranx_PURPOSEbase"
|
||||
"tranx_performanceperiod"
|
||||
"tranx_seasonality"
|
||||
"tranx_resolution"
|
||||
"trans_IBANvalidation"
|
||||
"tranx_businesslogic"
|
||||
"source_domaincheck"
|
||||
"tranx_plausibilty"
|
||||
"tranx_outliers"
|
||||
"tranx_patterns"
|
||||
"tranx_revenueimpact"
|
||||
"tranx_profitimpact"
|
||||
"tranx_marketimpact"
|
||||
"source_check"
|
||||
"source_approveuniqueID"
|
||||
"counterparty_sanctions_circumvention"
|
||||
"entity_sanctions_circumvention"
|
||||
"entity_corruption_sector"
|
||||
"counterparty_corruption_sector"
|
||||
"counterparty_corruption_country"
|
||||
"entity_corruption_country"
|
||||
"counterparty_corruption_relationship"
|
||||
"entity_corruption_relationship"
|
||||
"counterparty_corporate_adverse"
|
||||
"entity_corporate_adverse"
|
||||
"counterparty_corporate_pep"
|
||||
"entity_corporate_pep"
|
||||
"entity_corporate_adverse2"
|
||||
"counterparty_corporate_adverse2"
|
||||
"tranx_duplicate"
|
||||
"tranx_pattern2"
|
||||
"counterparty_corporate_exportcontrol"
|
||||
"entity_corporate_exportcontrol"
|
||||
"counterparty_corporate_mediamatch"
|
||||
"entity_corporate_mediamatch"
|
||||
"tranx_contracttenor"
|
||||
"entity_corporate_haven"
|
||||
"counterparty_corporate_haven"
|
||||
"tranx_mismatch"
|
||||
"entity_country_risk"
|
||||
"counterparty_country_risk"
|
||||
"corporate_haven2"
|
||||
"counterparty_corporate_insiders"
|
||||
"entity_corporate_insiders"
|
||||
"counterparty_corporate_courtcases"
|
||||
"entity_corporate_courtcases"
|
||||
"counterparty_corporate_manda"
|
||||
"entity_corporate_manda"
|
||||
"tranx_fakepurposecheck"
|
||||
"tranx_structuring"
|
||||
"tranx_newbankaccount"
|
||||
"counterparty_corporate_pepdetail"
|
||||
"entity_corporate_pepdetail"
|
||||
"tranx_weekday"
|
||||
"tranx_holdingobfuscation"
|
||||
"source_randomplausibility"
|
||||
"tranx_score"
|
||||
"tranx_reasoning"
|
||||
"tranx_recommendation"
|
||||
"tranx_sourcerepository"
|
||||
|
@@ -535,28 +535,28 @@ Transaction::STATUS_CLEARED => [
|
||||
<div class="rounded-3xl border border-zinc-200/60 bg-white/95 p-6 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90">
|
||||
<h4 class="text-sm font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400">Kerndaten Unternehmen</h4>
|
||||
<ul class="mt-4 space-y-3 text-sm text-zinc-600 dark:text-zinc-300">
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Rechtlicher Name</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->legal_name }}</span>
|
||||
<li class="flex items-start justify-between gap-3">
|
||||
<span class="flex-shrink-0">Rechtlicher Name</span>
|
||||
<span class="font-medium text-right text-zinc-900 dark:text-zinc-100">{{ $selected->company->legal_name }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Ticker</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->ticker }}</span>
|
||||
<!-- <li class="flex items-start justify-between gap-3">
|
||||
<span class="flex-shrink-0">Ticker</span>
|
||||
<span class="font-medium text-right text-zinc-900 dark:text-zinc-100">{{ $selected->company->ticker }}</span>
|
||||
</li> -->
|
||||
<li class="flex items-start justify-between gap-3">
|
||||
<span class="flex-shrink-0">Sektor</span>
|
||||
<span class="font-medium text-right text-zinc-900 dark:text-zinc-100">{{ $selected->company->sector }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Sektor</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->sector }}</span>
|
||||
<li class="flex items-start justify-between gap-3">
|
||||
<span class="flex-shrink-0">Hauptsitz</span>
|
||||
<span class="font-medium text-right text-zinc-900 dark:text-zinc-100">{{ $selected->company->headquarters }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Hauptsitz</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->headquarters }}</span>
|
||||
<li class="flex items-start justify-between gap-3">
|
||||
<span class="flex-shrink-0">Land</span>
|
||||
<span class="font-medium text-right text-zinc-900 dark:text-zinc-100">{{ $selected->company->country }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Land</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->country }}</span>
|
||||
</li>
|
||||
<!-- <li class="flex items-center justify-between">
|
||||
<span>KYC-Risikostufe</span>
|
||||
<!-- <li class="flex items-start justify-between gap-3">
|
||||
<span class="flex-shrink-0">KYC-Risikostufe</span>
|
||||
<span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-1 text-xs font-semibold uppercase tracking-wide text-slate-700 dark:bg-slate-800 dark:text-slate-200">
|
||||
{{ Str::title($selected->company->kyc_risk_level) }}
|
||||
</span>
|
||||
|
||||
Reference in New Issue
Block a user