# 3. TEKNİK ÜRÜN AKIŞLARI

## 3. TEKNİK ÜRÜN AKIŞLARI

### 3.1. Kurallar & Detaylar

*Ürün için özelleştirilmiş detayların ekleneceği alandır.*&#x20;

#### 3.1.1. Sektör/BDDK

#### 3.1.2. Çalışan Joblar

·       FigoScoreProUpdateClientReportRequestStatusAsInProgress :\
Süre: 10 Dk\
Amaç: Firma formu doldurmaya başladığında rapor statüsünü in progress’e çeker.&#x20;

·       FigoScoreProCompleteClientReportRequestStatus:\
Süre: Her akşam 20:00\
Amaç: Müşterinin talebindeki tüm firmalar süreçlerini tamamladıysa müşteri Talebi hem portal hem OP’de tamamlandıya çekilir.&#x20;

·       FigoScoreProCreateTargetCompanyReport:\
Süre: 30 dk\
Amaç: LLM responsu oluşmuş firma raporlarını oluşturur.&#x20;

·       FigoScoreProCompanyProfileInquiry:\
Süre: 10 dk\
Amaç: Operasyona excel ile firmalar yüklendiği zaman ticaret sicil gazetesinden alınması gereken verileri çeker.

### 3.2. Tablo Bazlı Business Kuralları

{% file src="/files/dbS2QC1MDKIcTmBtkZ8U" %}

### 3.3. Ön Yüzde DB Kayıt Edilen Alanlar

{% file src="/files/rt5eo8xX6PWIz9hZvSIv" %}

### 3.4. Takip Edilen Eventler ve Ön Yüz Yerleri

Formda Özet ve Onay sayfasında Formu Kaydet butonuna basıldığında “Özet ve Onay completed” eventi atılır.

### 3.5. Kullanılan Endpointler ve API Entegrasyonları

*Buraya Robonun yazdığı yeni endpointi de ekleyelim. VKN ile gittiğimiz.*

### 3.6. LLM Promptu

Finansal CFO Danışmanı - Bilanço Oranı Analizi Promptu

Rol

Finansal CFO danışmanı (bilanço oranı analizi odaklı)

Amaç

İletilen veri içerisinden, son iki mali yılın bilanço oranlarını inceleyerek şirketin finansal sağlığını, mevcut durumunu ve olası risklerini net bir yönetici özeti olarak sunmak.

Görevler

Analiz Kapsamı

* Dönem Tipi Kontrolü:
* Sadece yıllık dönemleri (PeriodQuarter: null) analiz et
* Ara dönemleri (PeriodQuarter: 1, 2, 3, 4) analize dahil etme
* Veri setinde hem yıllık hem ara dönem varsa, yalnızca yıllık dönemleri kullan
* Dönem Seçimi:
* Yalnızca en güncel iki YILLIK dönemi analiz et (örneğin 2024 ve 2023)
* Daha eski yılları (2022 ve öncesi) kesinlikle kullanma
* Tek Dönem Analizi Durumu:
* Eğer yalnızca güncel dönem (ör. 2024) üzerinden yapılan değerlendirme daha kritik sonuç veriyorsa, yalnızca güncel dönem analizi yap.

Analiz Yöntemi

* Tekil Değerlendirme: Güncel yılı kendi içinde yorumla
* Karşılaştırmalı Değerlendirme: İki yıl arasındaki değişimleri analiz et
* Güçlü/Zayıf Yönler: 3 güçlü yön ve 3 zayıf yön seç
* Genel Değerlendirme: Şirketin finansal sağlığı hakkında profesyonel özet ver

Analiz Standartları

* Format kuralları:
* Oranları yalnızca % formatında, iki ondalık basamakla yaz
* Bir önceki yıl değerini karşılaştır, yalnızca artış için “arttı”, azalış için “azaldı” yaz
* Aynı metrik birden fazla yerde farklı yorumlanmasın, çelişki olmasın
* Oran değerini ve açıklamasını aynı formatla yaz, yüzde ve ondalık gösterimleri karıştırma
* Sayısal değişim yönü açıklama ile tam uyumlu olsun (ör. 135 → 108 ise “düştü”)
* Oran kısıtı:\
  Yorumlarda sadece aşağıdaki oranları kullan. Bunların dışına çıkma.
* Cari Oran
* Likidite (Asit Test) Oranı
* Nakit Oranı
* Yabancı Kaynaklar Toplamı / Aktif Toplamı Oranı
* Öz Kaynaklar / Aktif Toplamı Oranı
* Kısa Vadeli Banka Kredileri / Kısa Vadeli Yabancı Kaynaklar Oranı
* Banka Kredileri / Yabancı Kaynaklar Toplamı Oranı
* Dönen Varlıklar / Aktif Toplamı Oranı
* Maddi Duran Varlıklar (Net) / Aktif Toplamı Oranı
* Alacak Devir Hızı
* Çalışma Sermayesi Devir Hızı
* Borç Devir Hızı
* Alacak Tahsil Süresi
* Stokta Kalma Süresi
* Borç Ödeme Süresi
* Nakit Dönüşüm Süresi
* Net Kar (Zarar) / Aktif Toplamı Oranı
* Faaliyet Karı (Zararı) / Net Satışlar Oranı
* Brüt Satış Karı (Zararı) / Net Satışlar Oranı
* Net Kar (Zarar) / Net Satışlar Oranı
* Faaliyet Giderleri / Net Satışlar Oranı
* Faiz Giderleri / Net Satışlar Oranı
* Oranları finansal sağlığa etkisi en yüksekten en düşüğe doğru sırala. Liste bitmeden 3 güçlü ve 3 zayıf oran seç.
* Eşik değerler: Finansal literatürde kabul gören eşik değerleri ve sektör ortalamalarını kullan.
* Hariç tutulacaklar: Genel finansal skor, kredi limiti, puanlama veya bunların değişimleri kesinlikle dahil edilmesin.

Dil ve Üslup Kuralları

* Profesyonel analist dili kullan
* Ölçüsüz ifadeler (“çöküş yaşanmıştır” gibi) yasak
* Ölçülü ifadeler kullan (“önemli düşüş gözlenmiştir”)
* Oran değerlerinden bahsederken yıllık dönem belirtilmeli (örn. “2024 yılında”)

Çıktı Formatı

* SADECE JSON formatında yanıt ver
* Markdown işaretleri (\`\`\` gibi) kullanma
* null veya "" kullanma
* Alan adlarını birebir eşleştir

JSON Yapısı

{\
"executive\_summary": "...",\
"strong\_ratios": \[\
{"ratio": "...", "short\_desc": "...", "description": "..."},\
{"ratio": "...", "short\_desc": "...", "description": "..."},\
{"ratio": "...", "short\_desc": "...", "description": "..."}\
],\
"weak\_ratios": \[\
{"ratio": "...", "short\_desc": "...", "description": "..."},\
{"ratio": "...", "short\_desc": "...", "description": "..."},\
{"ratio": "...", "short\_desc": "...", "description": "..."}\
]\
}

## FigoScorePro Teknik Ürün Akışı Dökümanı

### 📋 İçindekiler

1. Genel Bakış
2. Mimari Yapı
3. Ana Ürün Akışları
4. Entegrasyonlar
5. Veri Modelleri
6. Job ve Scheduler İşlemleri
7. Güvenlik ve Validasyonlar
8. Performans ve Optimizasyon

***

### 🎯 Genel Bakış

FigoScorePro, şirketlerin hedef firmalar hakkında kapsamlı risk analizi ve kredi değerlendirmesi yapmalarını sağlayan bir B2B kredi istihbarat platformudur.

#### Temel Özellikler

* **Hedef Şirket Analizi**: Ticaret sicili, finansal durum ve risk değerlendirmesi
* **Otomatik Veri Toplama**: Robomotion entegrasyonu ile TSG (Ticaret Sicil Gazetesi) verilerinin otomatik çekilmesi
* **AI Destekli Değerlendirme**: LLM (Large Language Model) ile risk analizi
* **Çoklu Form Yönetimi**: 9 aşamalı detaylı bilgi toplama formu
* **Takip ve İzleme**: Hedef firmaların düzenli takibi ve otomatik güncellemeler
* **Mail Yönetimi**: Toplu mail gönderimi ve iletişim takibi

#### Temel İş Akışı

```
Müşteri → Rapor Talebi → Hedef Şirket Ekleme → Robomotion Task → TSG Sorgusu → 
Form Doldurma → LLM Analizi → Bilanço Verileri → Rapor Oluşturma → Sonuç
```

***

### 🏗️ Mimari Yapı

#### Katman Mimarisi

```
┌─────────────────────────────────────┐
│      FigoPara.Api (Controller)      │  ← HTTP Endpoints
├─────────────────────────────────────┤
│   FigoPara.Business (Business)      │  ← İş Mantığı
├─────────────────────────────────────┤
│    FigoPara.Service (Service)       │  ← Veri Erişim
├─────────────────────────────────────┤
│       FigoPara.DAL (Entities)       │  ← Veritabanı
└─────────────────────────────────────┘

         ↕️ Entegrasyonlar ↕️
         
┌──────────────┬──────────────┬──────────────┐
│  Robomotion  │  TSG/Mernis  │   Scoring    │
│  (RPA Bot)   │   (Resmi)    │ (Bilanço)   │
└──────────────┴──────────────┴──────────────┘
```

#### Temel Bileşenler

**1. Controller Katmanı (`FigoScoreController.cs`)**

```
Area/FigoScore/Controllers/FigoScoreController.cs
```

**Görevleri:**

* HTTP endpoint'lerini yönetir
* Authorization kontrolü
* Request/Response mapping
* Validation tetikleme

**Önemli Endpoint'ler:**

* `GET /searchFigoScoreProClients` - Müşteri listesi
* `POST /createClientReportRequest` - Rapor talebi oluşturma
* `GET/POST /figoScoreProForm/{targetCompanyId}` - Form işlemleri
* `POST /sendBulkMailsToTargetCompanies` - Toplu mail gönderimi

**2. Business Katmanı (`FigoScoreProBusiness.cs`)**

```
FigoPara.Business/FigoScore/FigoScoreProBusiness.cs (2627 satır)
```

**Görevleri:**

* İş kurallarını uygular
* Karmaşık operasyonları orchestrate eder
* Cross-cutting concerns (logging, validation)
* Transaction yönetimi

**Ana Metodlar:**

* `CreateClientReportRequestAsync()` - Rapor talebi yönetimi
* `InitializeForFigoScorePro()` - Hedef şirket başlatma
* `CreateFigoScoreProTaskAsync()` - Robomotion task oluşturma
* `SendFigoScoreProCommandAsync()` - LLM komut gönderimi
* `CreateReportRequestAsync()` - Final rapor oluşturma
* `CheckRiskyCreditLimitFlagsAsync()` - Tehlikeli flag kontrolü

**3. Service Katmanı**

```
FigoPara.Service/FigoScorePro/
├── FigoScoreClientRequestService.cs
├── FigoScoreTargetCompanyService.cs
└── FigoScoreTargetCompanyRepositoryUnit.cs
```

**Görevleri:**

* CRUD operasyonları
* Repository pattern uygulaması
* Query optimizasyonu
* Data transformation

***

### 🔄 Ana Ürün Akışları

#### 1. Rapor Talebi Oluşturma Akışı

<figure><img src="/files/lMhTFrkM8Ti95QGEm5tA" alt=""><figcaption></figcaption></figure>

**Akış Detayları:**

**A. Rapor Talebi Validasyonu**

```csharp
// Kontroller:
- ClientCompanyId boş olmamalı
- TargetCompanies listesi dolu olmalı
- Her target company için VKN validasyonu
- Duplicate target company kontrolü
```

**B. Client Onboarding (İlk Kullanım)**

```csharp
FigoScoreOnboardingRequestModel:
- CreateTenant: true (Tenant oluştur)
- DefineCredit: true (0 bakiye, Manuel Yükleme paketi)
- CreateSubscription: true (12 aylık, Manuel Yükleme paketi)
```

**C. Mail Kayıtları Oluşturma**

```csharp
// Her target company için:
FIN_FIGOSCORE_TARGET_COMPANY_MAILS
- ClientCompanyId
- TargetCompanyIdentifier
- ReportRequestId
- Email (from target company list)
- IsActive: true
- IsSent: false
```

***

#### 2. Robomotion Task ve TSG Sorgulama Akışı

<figure><img src="/files/kQAOlHE6Iq5TFoliiV1x" alt=""><figcaption></figcaption></figure>

**TSG'den Çekilen Temel Veriler:**

| Alan Grubu            | Veri                                                | Kaynak Tablo                                                                                                |
| --------------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| **Temel Bilgiler**    | Ünvan, VKN, Mersis, Kuruluş Tarihi                  | FIN\_FIGOSCORE\_TARGET\_COMPANY\_BASE\_INFORMATION                                                          |
| **Sicil Bilgileri**   | Ticaret Sicil No, Sicil Müdürlüğü, Ticaret Odası No | -                                                                                                           |
| **Yönetim**           | Yönetim Kurulu Üyeleri (Aktif/Eski)                 | FIN\_FIGOSCORE\_TARGET\_COMPANY\_BOARD\_MEMBER                                                              |
| **Ortaklık**          | Kurucu Ortaklar, Hissedarlar                        | <p>FIN\_FIGOSCORE\_TARGET\_COMPANY\_SHAREHOLDERS<br>FIN\_FIGOSCORE\_TARGET\_COMPANY\_FOUNDERS</p>           |
| **Değişiklikler**     | Ünvan Değişiklikleri, Adres Değişiklikleri          | <p>FIN\_FIGOSCORE\_TARGET\_COMPANY\_TITLE\_HISTORY<br>FIN\_FIGOSCORE\_TARGET\_COMPANY\_ADDRESS\_HISTORY</p> |
| **Risk Göstergeleri** | Tehlikeli Flagler (N8, N7, K1, K2, N25, N24, N16)   | FIN\_FIGOSCORE\_UCID\_FLAG\_TRACKING                                                                        |
| **Ticari Bilgiler**   | Markalar, İşletmeler, NACE Kodları                  | <p>FIN\_FIGOSCORE\_TARGET\_COMPANY\_BRANDS<br>FIN\_FIGOSCORE\_TARGET\_COMPANY\_NACE\_CODES</p>              |

**Robomotion API Detayları:**

**Task Oluşturma**

```http
POST https://robomotion-api/create-task
Content-Type: application/json

{
  "identifier": "1234567890",          // VKN
  "companyName": "Örnek Şirket A.Ş.",
  "taskType": "Default" | "CachedFlags"
}

Response:
{
  "id": "task-uuid-123",               // TaskId
  "ucid": "12345678901234567890",      // UCID (Unique Company ID)
  "status": "Pending" | "InProgress" | "Completed" | "Failed"
}
```

**Profil Sonucu Sorgulama**

```http
GET https://robomotion-api/company-profile-result
  ?identifier=1234567890
  &taskId=task-uuid-123

Response:
{
  "status": "Completed",
  "profileDetails": {
    "mersisNumber": "...",
    "tradeRegistryNumber": "...",
    "registrationDate": "2020-01-15",
    "registryCenter": "İstanbul",
    "registryCity": "İstanbul",
    "establishmentDate": "2020-01-01",
    "establishmentTitle": "Önceki Ünvan",
    "legalStructure": "Anonim Şirket",
    "foundingPartners": ["Ahmet Yılmaz", "Mehmet Demir"],
    "titleChanges": [...],
    "addressChanges": [...],
    "website": "https://example.com"
  }
}
```

***

#### 3. Form Doldurma Süreci (9 Aşama)

<figure><img src="/files/p3ojGbh9pDD2taHQ5m8b" alt=""><figcaption></figcaption></figure>

**Her Aşama için İşlem:**

```csharp
UpsertFigoScoreProFormAsync(model):
1. Validation (alan uzunlukları, zorunlu alanlar)
2. Stage bazlı upsert metodu çağır
3. UpdateBaseInformationStageAsync() - Stage güncelle
4. Form durumunu InProgress yap

Stage 9 (Final):
5. CompanySectorUpdateWithNaceCode() - Sektör güncelle
6. SendFigoScoreProCommandAsync() - LLM komut gönder
```

**Form Alanları ve Validasyonlar:**

| Stage                    | Ana Alanlar                                           | Max Karakter | Zorunlu         |
| ------------------------ | ----------------------------------------------------- | ------------ | --------------- |
| **1. Şirket Bilgileri**  | CompanyName, Website, Phone, Email, MainCustomers     | 500-2000     | ✓ (Name, Email) |
| **2. Finansal Bilgiler** | BankAccounts, BankRelationships, CurrentDebt          | 2000         | ✗               |
| **3. Ticari Bilgiler**   | ProductsAndServices, ExportCountries, ImportCountries | 2000         | ✓ (Products)    |
| **4. Sicil Bilgileri**   | TradeRegisterNumber, RegistrationOffice, MersisNumber | 50-500       | ✓ (TRN)         |
| **5. Şirket Geçmişi**    | FoundingDate, CorporationType, TitleChanges           | -            | ✓ (Date, Type)  |
| **6. Kurucular**         | Founders (List)                                       | 100/founder  | ✓ (Min 1)       |
| **7. Yönetim Kadrosu**   | ManagementStaff (List)                                | 100/person   | ✓ (Min 1)       |
| **8. Yapısal Bilgiler**  | CapitalStructure, LatestCapitalIncreaseDate           | 2000         | ✗               |
| **9. Grup Yapısı**       | ParentCompany, Subsidiaries, Partnerships             | 2000         | ✗               |

***

#### 4. Riskli Flag Kontrolü ve LLM Süreci

<figure><img src="/files/cSBDJ6GgedM4ujIWW0rr" alt=""><figcaption></figcaption></figure>

**Tehlikeli Flag Listesi:**

```csharp
private static readonly HashSet<string> RiskyFlags = new()
{
    "N8",   // İflas
    "N7",   // Konkordato
    "K1",   // Tasfiye
    "K2",   // Tasfiye (Diğer)
    "N25",  // İcra Takibi
    "N24",  // Haciz
    "N16"   // Kara Liste
};
```

**LLM Command Yapısı:**

```csharp
FigoScoreProCommand {
    TargetCompanyId: 12345,
    AnalysisDataList: [
        {
            Year: 2023,
            Periods: [{...}],
            Analysis: {
                CreditLimit: 500000,
                Total: 75.5,           // Finansal Skor (0-100)
                // ... diğer finansal ratiolar
            }
        },
        {
            Year: 2022,
            ...
        }
    ]
}
```

**Finansal Skor Kodlama:**

```csharp
Total (0-100) → FinancialScoreCode
- 70.0 - 100.0 → A+
- 55.0 - 69.9  → A
- 40.0 - 54.9  → B+
- 30.1 - 39.9  → B
- 25.0 - 30.0  → C
- 0.0  - 24.9  → D
```

***

#### 5. Rapor Oluşturma ve Finalizasyon

<figure><img src="/files/0TCsWAV5L427HDVrd8N8" alt=""><figcaption></figcaption></figure>

**Rapor Yapısı:**

```json
FigoScoreTargetCompanyReports {
    "Id": 1,
    "TargetCompanyId": 12345,
    "ReportNo": "FSP-2024-001234",
    "Status": 1,
    "CreditLimit": 500000.00,        // null (riskli flag varsa)
    "FinancialScore": 75.5,          // null (riskli flag varsa)
    "FinancialScoreCode": "A+",      // null (riskli flag varsa)
    "ContactPerson": "Ahmet Yılmaz",
    "InterviewDate": "2024-01-15",
    "CreatedAt": "2024-01-20T10:30:00"
}
```

```json
FigoScoreTargetCompanyReportMeta {
    "BaseInformation": "{...}",      // TargetCompanyFormResponseModel (JSON)
    "BalanceSheet": "[{...}]",       // ScoringAnalysisGetCompanyELedgerScoreResponseModel[] (JSON)
    "RiskEvaluation": "{...}"        // TargetCompanyRiskEvaluationResponseModel (JSON) veya LLM text
}
```

**RiskEvaluation Yapısı (Normal Akış):**

```json
{
    "ExecutiveSummary": "LLM tarafından üretilen özet...",
    "StrongRatios": [
        {
            "Ratio": "Current Ratio",
            "ShortDescription": "Cari oran yüksek, kısa vadeli ödeme gücü güçlü",
            "Description": "Detaylı açıklama..."
        }
    ],
    "WeakRatios": [
        {
            "Ratio": "Debt to Equity",
            "ShortDescription": "Borç/Özkaynak oranı yüksek",
            "Description": "Detaylı açıklama..."
        }
    ]
}
```

**RiskEvaluation (Riskli Flag Durumu):**

```json
{
    "ExecutiveSummary": "Bu işletme hakkında ticaret sicilinde İflas ve Konkordato kaydı bulunmaktadır. Bu nedenle firma için finansal analiz, risk skoru, kredi limiti önerisi ve güçlü/zayıf yön değerlendirmesi üretilmemektedir.",
    "StrongRatios": [
        {
            "Ratio": "N/A",
            "ShortDescription": "Bu alan, firma için finansal analiz yapılmadığından görüntülenmemektedir.",
            "Description": null
        }
    ],
    "WeakRatios": [
        {
            "Ratio": "N/A",
            "ShortDescription": "Bu alan, firma için finansal analiz yapılmadığından görüntülenmemektedir.",
            "Description": null
        }
    ]
}
```

***

### 🔗 Entegrasyonlar

#### 1. Robomotion Entegrasyonu

**Amaç:** TSG (Ticaret Sicil Gazetesi) ve resmi kaynaklardan otomatik veri çekme

**Endpoints:**

```
Base URL: https://prod-registry-api.figopara.com
```

| Endpoint                  | Method | Amaç                  |
| ------------------------- | ------ | --------------------- |
| `/create-task`            | POST   | TSG sorgusu başlat    |
| `/task-inquiry`           | GET    | Task durumunu sorgula |
| `/company-profile-result` | GET    | Profil sonucunu al    |
| `/create-tracking`        | POST   | Flag takibi başlat    |
| `/flag-search-ml`         | GET    | Flag listesi çek      |

**Task Yaşam Döngüsü:**

```
Pending (0) → InProgress (1) → Completed (2) / Failed (3)
```

**Retry Mekanizması:**

```csharp
// CompanyProfileInquiryJob (Her 10 dakikada)
- InProgress kayıtları kontrol et
- Robomotion'dan sonuç sorgula
- Completed/Failed ise DB'yi güncelle
- InProgress ise bir sonraki job'da tekrar dene
- Timeout: 8 dakika (job başına)
- Batch Limit: 100 kayıt (SysParam ile ayarlanabilir)
```

#### 2. Scoring API (Bilanço) Entegrasyonu

**Amaç:** Şirketlerin Bilanço verilerinden finansal analiz

```csharp
ScoringAnalysisGetCompanyELedgerScoreRequestModel {
    Identifier: "1234567890",    // VKN
    Token: "session-token",      // DisposableNoPasswordLogin
    Version: 2
}

Response:
[
    {
        Year: 2023,
        Periods: [
            {
                PeriodQuarter: null,  // Yıllık dönem (çeyreklik değil)
                // ... bilanço verileri
            }
        ],
        Analysis: {
            CreditLimit: 500000.00,
            Total: 75.5,             // Finansal skor
            Liquidity: 2.3,          // Likidite rasyosu
            Profitability: 12.5,     // Kârlılık
            Leverage: 0.45,          // Kaldıraç
            // ... diğer rasyolar
        }
    },
    // ... önceki yıllar
]
```

**Filtreleme Kuralları:**

```csharp
// Sadece yıllık dönemleri al (çeyreklik hariç)
IsYearlyPeriod(data) → data.Periods.All(p => !p.PeriodQuarter.HasValue)

// Son N yıl al (SysParam: FIGOSCORE_PRO_MAX_YEARS_TO_PROCESS, default: 2)
var maxYears = GetMaxYearsToProcess(); // 2
yearlyPeriods.Take(maxYears)
```

#### 3. MassTransit (LLM) Entegrasyonu

**Amaç:** AI destekli risk değerlendirmesi ve rapor üretme

```csharp
FigoScoreProCommand {
    TargetCompanyId: 12345,
    AnalysisDataList: [...Bilanço verileri...]
}

// Endpoint (appsettings.json)
"FigoScoreEndPointName": "queue:figoscore-pro-analysis"

// Consumer (LLM Service)
- Finansal verileri analiz et
- Güçlü/zayıf yönleri belirle
- Executive summary oluştur
- DB'ye kaydet: FIN_FIGOSCORE_TARGET_COMPANY_LLM_PROCESS
```

**LLM Response:**

```json
{
    "TargetCompanyId": 12345,
    "LlmResponse": "Şirket son 3 yılda istikrarlı büyüme göstermiştir...",
    "LlmProcess": "Success" | "Failed" | "Pending",
    "CreatedAt": "2024-01-20T15:30:00"
}
```

***

### 📊 Veri Modelleri

#### Veritabanı Tabloları ve İlişkiler

<figure><img src="/files/4SlYD0NwCMrmwJWn7oDB" alt=""><figcaption></figcaption></figure>

#### Temel Tablolar

**1. FIN\_FIGOSCORE\_CLIENT\_REPORT\_REQUEST**

```sql
-- Müşteri rapor talepleri
Columns:
- Id (PK)
- ClientCompanyId (FK → FIN_COMPANY)
- RequestDate
- Status (Pending, InProgress, Completed, Cancelled)
- DueDate
- CreatedAt, UpdatedAt
```

**2. FIN\_FIGOSCORE\_CLIENT\_TARGET\_COMPANIES**

```sql
-- Hedef şirketler (rapor talebi ile ilişkili)
Columns:
- Id (PK)
- ClientCompanyId (FK)
- ReportRequestId (FK → FIN_FIGOSCORE_CLIENT_REPORT_REQUEST)
- TargetCompanyIdentifier (VKN)
- TargetCompanyTitle
- ContactPerson
- ContactPhone
- ContactEmail
- Status (Pending, InProgress, Completed, Cancelled)
- CreatedAt, UpdatedAt
```

**3. FIN\_FIGOSCORE\_TARGET\_COMPANY\_BASE\_INFORMATION**

```sql
-- Hedef şirket temel bilgileri (form verileri)
Columns:
- Id (PK)
- TargetCompanyId (FK → FIN_COMPANY)
- Stage (1-9: Form aşaması)
- CompanyName
- TaxNumber
- TaxOffice
- Phone
- Email
- Address
- Website
- MainProducts
- MainCustomers
- BankRelationships
- TradeRegisterNumber
- RegistrationOffice
- MersisNumber
- FoundingDate
- CorporationType
- CapitalStructure
- // ... 50+ alan
- CreatedAt, UpdatedAt
```

**4. FIN\_FIGOSCORE\_TARGET\_COMPANY\_INQUIRED\_INFORMATIONS**

```sql
-- Robomotion'dan sorgulanmış bilgiler
Columns:
- Id (PK)
- TargetCompanyIdentifier
- TaskId (Robomotion Task ID)
- TaskStatus (Pending, InProgress, Completed, Failed)
- InquiredInformations (JSON - CompanyProfileDetailModel)
- UsedInForm (0: Kullanılmadı, 1: Forma dolduruldu)
- CompanyProfileStatus (Pending, InProgress, Completed, Failed)
- CreatedAt, UpdatedAt
```

**5. FIN\_FIGOSCORE\_TARGET\_COMPANY\_REPORTS**

```sql
-- Oluşturulmuş raporlar
Columns:
- Id (PK)
- TargetCompanyId (FK)
- ReportNo (FSP-YYYY-XXXXXX)
- Status (1: Active)
- CreditLimit (decimal, nullable)
- FinancialScore (decimal, nullable)
- FinancialScoreCode (A+, A, B+, B, C, D, nullable)
- ContactPerson
- InterviewDate
- CreatedAt, UpdatedAt
```

**6. FIN\_FIGOSCORE\_TARGET\_COMPANY\_REPORT\_META**

```sql
-- Rapor detay verileri (JSON formatında)
Columns:
- Id (PK)
- ReportId (FK → FIN_FIGOSCORE_TARGET_COMPANY_REPORTS)
- BaseInformation (JSON - Form verileri)
- BalanceSheet (JSON - Bilanço verileri)
- RiskEvaluation (JSON - LLM analizi veya override mesaj)
- CreatedAt, UpdatedAt
```

**7. FIN\_FIGOSCORE\_TARGET\_COMPANY\_LLM\_PROCESS**

```sql
-- LLM işlem sonuçları
Columns:
- Id (PK)
- TargetCompanyId (FK)
- LlmResponse (TEXT - AI üretimi veya boş)
- LlmProcess (Pending, Success, Failed)
- CreatedAt, UpdatedAt
```

**8. FIN\_FIGOSCORE\_UCID\_FLAG\_TRACKING**

```sql
-- UCID bazlı flag takibi (Robomotion tracking)
Columns:
- Id (PK)
- Ucid (Unique Company ID - Robomotion)
- TrackingId (Robomotion Tracking ID)
- TaskId (Robomotion Task ID)
- CompanyId (FK)
- TargetCompanyIdentifier
- TrackingPeriod (Months, default: 12)
- IsActive (1: Active, 0: Stopped)
- CreatedAt, UpdatedAt
```

**9. FIN\_FIGOSCORE\_TARGET\_COMPANY\_MAILS**

```sql
-- Hedef şirket mail kayıtları
Columns:
- Id (PK)
- ClientCompanyId (FK)
- TargetCompanyIdentifier
- ReportRequestId (FK)
- Email
- IsActive (1: Active, 0: Deleted)
- IsSent (0: Not Sent, 1: Sent)
- SentDate (nullable)
- CreatedAt, UpdatedAt
```

***

### ⏰ Job ve Scheduler İşlemleri

#### Hangfire Jobs (FigoPara.Web.Scheduler)

```csharp
// JobManager.cs - ConfigureRecurringJobs()
```

| Job Adı                                                     | Cron                         | Business Method                                      | Açıklama                                   |
| ----------------------------------------------------------- | ---------------------------- | ---------------------------------------------------- | ------------------------------------------ |
| **FigoScoreProUpdateClientReportRequestStatusAsInProgress** | `*/10 * * * *` (10dk)        | `UpdateClientReportRequestStatusAsInProgressAsync()` | Pending talepleri InProgress yap           |
| **FigoScoreProCompleteClientReportRequestStatus**           | `Cron.Daily(20, 00)` (20:00) | `CompleteClientReportRequestStatusAsync()`           | Tamamlanan talepleri Completed yap         |
| **FigoScoreProCreateTargetCompanyReport**                   | `*/30 * * * *` (30dk)        | `CreateTargetCompanyReportOfCompletedFormsAsync()`   | LLM tamamlanan formlardan rapor oluştur    |
| **FigoScoreProCompanyProfileInquiry**                       | `*/10 * * * *` (10dk)        | `CompanyProfileInquiryJob()`                         | Robomotion task sonuçlarını kontrol et     |
| **FigoScoreProUpdateCompanyTargetReportInfoDetail**         | `*/10 * * * *` (10dk)        | `UpdateCompanyTargetReportInfoDetailRequestAsync(5)` | Rapor detaylarını güncelle (5 kayıt/batch) |

#### Job Detayları

**1. CompanyProfileInquiryJob**

```csharp
/*
Amaç: InProgress durumundaki Robomotion taskları kontrol et
Çalışma Süresi: Max 8 dakika (timeout koruması)
Batch Limit: SysParam (FIGOSCORE_PRO_COMPANY_PROFILE_INQUIRY_MAX_RECORDS_PER_RUN, default: 100)
*/

Flow:
1. GetInProgressInquiriesAsync() → InProgress kayıtlar
2. Take(maxRecordsPerRun) → İlk N kayıt
3. Foreach (sıralı işlem - SQL transaction çakışması önlenir):
   - GetCompanyProfileResultAsync(taskId) → Robomotion sorgu
   - İf status = Completed/Failed → UpdateCompanyInquiredInformationAsync()
   - İf status = InProgress → Skip (10dk sonra tekrar kontrol edilecek)
4. Performans metrikleri logla:
   - Toplam InProgress kayıt sayısı
   - İşlenen kayıt sayısı
   - Başarılı/başarısız sayısı
   - Ortalama işlem süresi
   - Tahmini tüm kayıtlar için süre
```

**2. CreateTargetCompanyReportOfCompletedFormsAsync**

```csharp
/*
Amaç: Form doldurma tamamlanan ve LLM analizi yapılan şirketler için rapor oluştur
Çalışma Süresi: 30 dakikada 1
*/

Flow:
1. GetClientReportRequestTargetCompanyIdsInProgressAsync()
2. GetFigoScoreProLLMProcessResponses(ids) → Completed LLM responses
3. Foreach target company:
   - CheckRiskyCreditLimitFlagsAsync() → Flag kontrolü
   - İf riskli flag var → Override LLM response kullan
   - GetTargetCompanyFormAsync() → Form verileri
   - GetTargetCompanyEledgerScore() → Bilanço verileri
   - CreateReportRequestAsync() → Rapor oluştur
   - UpdateTargetCompanyRequestedReportStatus() → InProgress → Completed
```

**3. UpdateClientReportRequestStatusAsInProgressAsync**

```csharp
/*
Amaç: Vadesi gelen Pending talepleri InProgress yap
Çalışma Süresi: 10 dakikada 1
*/

Logic:
- DueDate <= NOW AND Status = Pending
- SET Status = InProgress
```

**4. CompleteClientReportRequestStatusAsync**

```csharp
/*
Amaç: Tüm hedef şirketleri tamamlanan talepleri Completed yap
Çalışma Süresi: Her gün 20:00
*/

Logic:
- Count(TargetCompanies WHERE Status != Completed) = 0
- SET ReportRequest.Status = Completed
```

***

### 🔒 Güvenlik ve Validasyonlar

#### 1. Authorization

```csharp
// Controller Level
[FigoAuthorize]
[FigoAction(ActionConst.FigoScorePro, "Action Name", "FSP.XX", CompanyTypes)]

CompanyTypes:
- Admin: Tüm işlemler
- Company: Kendi talepleri
- Financer: Okuma yetkisi
```

#### 2. Input Validations

```csharp
// Business Layer - Partial Class: FigoScoreProBusinessValidation.cs

CreateClientReportRequestAsyncValidation(model):
- ClientCompanyId > 0
- TargetCompanies not null/empty
- Each TargetCompany.Identifier valid (10 digit VKN)
- Duplicate TargetCompany check

UpsertTargetCompanyFormAsyncValidation(model):
- TargetCompanyId > 0
- Stage in [1-9]
- Stage-specific field validations

ValidateCompanyInformationFieldLengths(model):
- CompanyName: max 500
- MainProducts: max 2000
- MainCustomers: max 2000
- Email: valid format
```

#### 3. Business Rules

```csharp
// Riskli Flag Kuralı
İf HasRiskyFlag(N8, N7, K1, K2, N25, N24, N16):
    - LLM sorgusu yapma
    - Bilanço CreditLimit = -1
    - Bilanço Total = 0
    - Override LLM mesajı kullan
    - Raporda finansal analiz gösterme

// Form Stage Kuralı
Stage 1-8: UpdateBaseInformationStageAsync()
Stage 9: FinalizeFormProcess()
    - Sektör güncelle (NACE kod)
    - LLM command gönder
    - Status → InProgress

// Bilanço Filtreleme Kuralı
- Sadece yıllık dönemler (PeriodQuarter = null)
- Min 1 yıllık dönem gerekli
- Max N yıl al (SysParam: MAX_YEARS_TO_PROCESS, default: 2)
```

### 📈 Sistem Parametreleri (SysParameter)

<table><thead><tr><th width="409.800048828125">Key</th><th width="98.5999755859375">Default</th><th>Açıklama</th></tr></thead><tbody><tr><td><code>FIGOSCORE_PRO_MAX_YEARS_TO_PROCESS</code></td><td>2</td><td>Bilançodan kaç yıllık veri işlenecek</td></tr><tr><td><code>FIGOSCORE_PRO_DEFAULT_TRACKING_PERIOD_MONTHS</code></td><td>12</td><td>Flag tracking süresi (ay)</td></tr><tr><td><code>FIGOSCORE_PRO_COMPANY_PROFILE_INQUIRY_MAX_RECORDS_PER_RUN</code></td><td>100</td><td>CompanyProfileInquiryJob batch limiti</td></tr><tr><td><code>FIGOSCOREPRO_SIGNUP_UTM_URL</code></td><td>-</td><td>Hedef şirket kayıt formu URL'i</td></tr></tbody></table>

***

### 🔄 Veri Akış Özeti

#### Tam End-to-End Flow

```
1. BAŞLANGIÇ
   ↓
2. Admin: Rapor Talebi Oluştur
   ├─ ClientCompanyId
   ├─ TargetCompanies (VKN listesi)
   └─ DueDate
   ↓
3. CREATE PROCESSES (Her Hedef Şirket İçin)
   ├─ Client Onboarding (Tenant, Credit, Subscription)
   ├─ Mail Kayıtları Oluştur
   ├─ Robomotion Task Oluştur → UCID al
   ├─ Robomotion Tracking Oluştur
   └─ DB: FIN_FIGOSCORE_TARGET_COMPANY_INQUIRED_INFORMATIONS (Pending)
   ↓
4. ROBOMOTION TSG QUERY (Arka Plan)
   ├─ TSG'ye bağlan
   ├─ Şirket verilerini çek (Sicil, Yönetim, Ortaklar, Flagler)
   └─ TaskStatus: Pending → InProgress → Completed
   ↓
5. JOB: CompanyProfileInquiryJob (Her 10dk)
   ├─ InProgress taskları kontrol et
   ├─ Robomotion'dan sonuç al
   ├─ Completed ise: DB güncelle, UsedInForm=0
   └─ InitializeFormFromInquiredInformationAsync() çağrılır
   ↓
6. FORM DOLDURMA (Hedef Şirket veya Admin)
   ├─ Stage 1: Şirket Bilgileri (TSG verilerinden ön doldurulmuş)
   ├─ Stage 2: Finansal Bilgiler
   ├─ Stage 3: Ticari Bilgiler
   ├─ Stage 4: Sicil Bilgileri (TSG verilerinden ön doldurulmuş)
   ├─ Stage 5: Şirket Geçmişi (TSG verilerinden ön doldurulmuş)
   ├─ Stage 6: Kurucular
   ├─ Stage 7: Yönetim Kadrosu
   ├─ Stage 8: Yapısal Bilgiler (TSG verilerinden ön doldurulmuş)
   └─ Stage 9: Grup Yapısı → FinalizeFormProcess()
   ↓
7. FINALIZE (Stage 9 Tamamlandığında)
   ├─ Sektör Güncelle (NACE kod ile Scoring API)
   ├─ Flag Kontrolü: CheckRiskyCreditLimitFlagsAsync()
   │  ├─ Riskli Flag Var mı? (N8, N7, K1, K2, N25, N24, N16)
   │  ├─ Var ise: LLM gönderme, Override mesaj kaydet
   │  └─ Yok ise: Bilanço + LLM command gönder
   ├─ Bilanço Verileri Al (Scoring API)
   ├─ FigoScoreProCommand → MassTransit → LLM Service
   └─ LlmProcess: Pending
   ↓
8. LLM PROCESSING (Asenkron, Arka Plan)
   ├─ Bilanço verilerini analiz et
   ├─ Güçlü/zayıf yönleri belirle
   ├─ Executive summary oluştur
   └─ DB: FIN_FIGOSCORE_TARGET_COMPANY_LLM_PROCESS (Success)
   ↓
9. JOB: CreateTargetCompanyReportOfCompletedFormsAsync (Her 30dk)
   ├─ LLM Completed kayıtları al
   ├─ Her kayıt için:
   │  ├─ Flag kontrolü tekrar yap
   │  ├─ Riskli flag varsa: BalanceSheet/RiskEvaluation modifiye et
   │  ├─ Form verileri + Bilanço + LLM birleştir
   │  └─ FIN_FIGOSCORE_TARGET_COMPANY_REPORTS + REPORT_META oluştur
   └─ Status: InProgress → Completed
   ↓
10. RAPOR HAZIR
    ├─ Admin/Client: GetLatestTargetCompanyReportAsync()
    ├─ Rapor görüntüle (PDF/Web)
    └─ CreditLimit, FinancialScore, RiskEvaluation
```

***

### 📝 Ek Notlar

#### Önemli İş Kuralları

1. **Form Auto-Fill:** TSG'den çekilen veriler forma otomatik doldurulur ama kullanıcı override edebilir
2. **Riskli Flag Önceliği:** Flag varsa finansal analiz yapılmaz, override mesaj gösterilir
3. **Yıllık Dönem Kuralı:** Bilançodan sadece yıllık dönemler alınır, çeyreklik veriler atlanır
4. **Tracking Süresi:** Her UCID için 12 aylık otomatik takip (SysParam ile değiştirilebilir)
5. **Job Batch Limits:** SQL transaction çakışmasını önlemek için sıralı işlem
6. **Mail Yönetimi:** Toplu mail gönderimi, gönderim takibi, mail validasyonu

#### Geliştirme Notları

* **ProjectToType Kullan:** Include + Adapt yerine performans için
* **Async/Await:** Tüm IO operasyonlarında kullan
* **Validation:** Business layer'da yap, erken fail
* **Logging:** FigoLog ile structured logging
* **Exception Handling:** Try-catch her business metod
* **SysParameter:** Hardcoded değerler yerine dinamik config

***

### 📚 Referanslar

#### Kod Lokasyonları

```
FigoPara.Api/Area/FigoScore/Controllers/FigoScoreController.cs
FigoPara.Business/FigoScore/FigoScoreProBusiness.cs
FigoPara.Business/FigoScore/FigoScoreProBusinessValidation.cs
FigoPara.Service/FigoScorePro/FigoScoreClientRequestService.cs
FigoPara.Service/FigoScorePro/FigoScoreTargetCompanyService.cs
FigoPara.DAL/FigoScorePro/*.cs (26 entity)
FigoPara.Web.Scheduler/Jobs/JobManager.cs
```

#### API Documentation

* Swagger: `/swagger/index.html`
* Action Group: `FigoScorePro İşlemleri`
* Action Codes: `FSP.C1` - `FSP.C7`, `FSP.F1` - `FSP.F9`, `FSP.M1` - `FSP.M4`

***

**Döküman Versiyonu:** 1.0\
**Son Güncelleme:** Ocak 2026\
**Hazırlayan:** Slytherin Team\
**Kapsam:** FigoScorePro Full Technical Flow


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.figopara.com/int-docs/urun-dokumantasyonu/figoskor-pro/3.-teknik-urun-akislari.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
