# TcmbKur (Logo ERP) — Müşteri Kurulum Kılavuzu

TcmbKur, **Logo ERP için** TCMB günlük döviz kurlarını indirip Logo kur tablolarına yazan, girilip
girilmediğini denetleyen ve e-posta ile raporlayan bir Windows servisidir.

Lisans doğrulaması **ErpLic** üzerinden yapılır (`https://lisans.erp.tr`). Uygulama ilk çalıştığında
bu makine için kalıcı kurulum kimliğini kendisi üretir ve lisans merkezinde **Bekliyor** durumuna
düşer; elle ürün API anahtarı girilmez. Lisans yalnız **Logo'ya kur yazımını** kapılar
(modül `TCMBKUR.LOGO.001`): lisans süresi dolduğunda kur yazımı durur, **e-posta ve raporlar
çalışmaya devam eder** ve panel uyarı gösterir.

Yönetim paneli yalnız bu makineden (`http://127.0.0.1:<port>`) açılır; internet üzerinden erişim yoktur.

---

## 1. Gereksinimler

| Konu | Gereksinim |
|---|---|
| İşletim sistemi | Windows 10/11 veya Windows Server 2016+ (64 bit), **yönetici** hesabı |
| .NET | **Gerekmez** — paket kendi çalışma zamanını içerir (self-contained win-x64) |
| SQL Server | Logo ERP'nin kullandığı örnek erişilebilir olmalı (varsayılan `.` = yerel; farklıysa `-SqlServer SUNUCU\ORNEK`) |
| Logo ERP | Kur yazılacak Logo veritabanı ve firma(lar)a erişim |
| Veritabanı | **Ayrı bir veritabanı gerekmez** — 1.5.0'dan itibaren uygulamanın kendi tabloları müşterinin Logo veritabanında `dbo.TCMBKUR_*` adıyla durur |
| İnternet | `https://www.tcmb.gov.tr` (kur verisi) · `https://lisans.erp.tr` **443** (kurulum kaydı ve lisans doğrulama) |

> İnternet erişimi kalıcı olmak zorunda değildir — bkz. [§7 Lisans sunucusuna ulaşılamıyorsa](#7-sorun-giderme).

---

## 2. Kurulum (5 dakika)

> **1.5.0 ile değişti — ayrı veritabanı yok.** Kurulum artık `TcmbKur` adında ikinci bir veritabanı
> **yaratmaz**. Uygulamanın kendi tabloları (ayarlar, kullanıcılar, kur arşivi, çalışma kayıtları,
> loglar) müşterinin **Logo veritabanının içinde** `dbo.TCMBKUR_*` adıyla durur. Böylece yedekleme
> tek veritabanıyla yapılır ve kur yazımı ile ayarlar aynı yedekten birlikte döner.

1. `TcmbKur-Logo-<sürüm>-win-x64.zip` dosyasını bir klasöre açın (ör. `C:\Kurulum\TcmbKur`). Paketin içindeki
   `manifest.json`, kurulumun bekleyeceği uygulama sürümünü taşır; kurulum bunu `TcmbKur.App.exe` ürün
   sürümüyle karşılaştırır ve uyuşmazlıkta mevcut servise dokunmadan hata verir. Paket üretildiğinde
   `dist\latest.json` yanında oluşur; bu dosyada ZIP'in SHA-256 özeti ve boyutu bulunur.
2. `install.ps1` üzerinde **sağ tık → PowerShell ile çalıştır** (UAC yönetici onayı ister).
   Alternatif olarak yönetici PowerShell'de:
   ```powershell
   powershell -ExecutionPolicy Bypass -File .\install.ps1
   ```
   Kurulum, uygulama tablolarının kurulacağı **Logo veritabanını** sorar: sunucudaki Logo
   veritabanlarını (firma sayısı ve kur tablosu sayısıyla birlikte) listeler, siz numarasını
   seçersiniz. Tek aday varsa onu kullanır. Adını zaten biliyorsanız sormadan geçmek için:
   ```powershell
   powershell -ExecutionPolicy Bypass -File .\install.ps1 -LogoDb TIGER3
   ```
   > `-AppDb` parametresi **kaldırıldı** (1.5.0). Eskiden ayrı uygulama veritabanının adını
   > veriyordu; artık böyle bir veritabanı yok.
3. Script şunları yapar:
   - dosyaları **`C:\ERP\TcmbKur`** altına kopyalar,
   - **5230'dan itibaren ilk boş portu** seçer (5230–5299),
   - seçilen **Logo veritabanında** servis hesabına (`NT AUTHORITY\SYSTEM`) `db_owner` verir —
     uygulama kendi `dbo.TCMBKUR_*` tablolarını ilk açılışta orada yaratır. Yetki verilemezse
     kurulum **durur** ve çalıştırılması gereken SQL'i ekrana yazar (yarım kurulum bırakılmaz),
   - `appsettings.Production.json` içindeki bağlantı dizesini **yerinde** düzeltir; dosyadaki
     diğer bölümleriniz (Serilog, lisans, SMTP) olduğu gibi kalır,
   - **`ERP TcmbKur`** servisini kurar/başlatır,
   - `/healthz` JSON sağlık kapısından (`status=ok`, `db=ok`, paket sürümüyle eşleşen `version`) geçer ve
     tarayıcıda **Kurulum sihirbazını** açar,
   - **otomatik güncellemeyi kurar**: `updater\` klasörünü `%ProgramData%\ErpUpdate\TCMBKUR` altına
     alır ve günlük **`ERP Update TCMBKUR`** zamanlanmış görevini kaydeder (bkz. [§5](#5-güncelleme)).
4. Giriş: **admin / admin** → ilk girişte yeni parola istenir.

---

## 3. Kurulum sihirbazı (`http://127.0.0.1:<port>/kurulum`)

Sihirbaz **6 adımdır**. `/kurulum` adresi 1. adımdan başlar; `/ayarlar` doğrudan 2. adıma girer.

### 1) Windows servisi
Veri girilmez. Servis durumu ve **Kur · Başlat · Durdur · Yeniden Başlat · Kaldır** düğmeleri ile
dinlenen adres görünür.

### 2) Logo bağlantısı
- **Logo klasörü** — *Gözat* / *Algıla* ile seçilir.
- **Logo SQL bağlantısı** — Sunucu, Port, Veritabanı, Kimlik doğrulama (Windows/SQL), Encrypt,
  TrustServerCertificate, Timeout. **Logo veritabanlarını bul** ile DB listeden seçilir.
- **Bağlantıyı Test Et** → **Firmaları keşfet** → kur yazılacak firmalar işaretlenir → **Kaydet**.

### 3) Kur çekme
Hedef gün, bülten kuralı, "TCMB ilanından (15:30) önce yazma", zamanlama (Günlük/Aralık) ve saat,
geriye bakılacak gün sayısı, yazım seçenekleri (`L_DAILYEXCHANGES`, `APPROVE=1`, güncelle, birime böl),
**RATES1–4 ↔ DA/DS/EA/ES** eşleştirmesi ve para birimleri → **Kaydet**.

### 4) E-posta (SMTP)
SMTP sunucusu/port/gönderen/kullanıcı/parola/SSL, rapor alıcıları, konu şablonu, xlsx/csv eki,
kontrol raporu ayarları → **Test e-postası** → **Kaydet**.

### 5) Lisans  ← *bu adım kuruluma özeldir, atlanmamalı*
Kart başlığı: **"Lisans ve deneme sürümü"**. Uygulama ilk açılışta kurulum kaydını otomatik oluşturur:

- Kurulum kimliği, makine adı ve ürün bilgisi `https://lisans.erp.tr` yönetimine **Bekliyor** olarak düşer.
- Ekranda kısa kod ve karekod görünür; bu bilgi yalnız kaydı bulmak içindir, lisans yetkisi değildir.
- ERP tarafı müşteriyle anlaşılmış lisansı merkezden bu kuruluma atar.
- **Durumu yenile** düğmesi son lisans durumunu tekrar sorar. Lisans atandıysa durum kartında ürün,
  modül, başlangıç/bitiş ve kalan haklar görünür.
- Lisans atanmadan Logo'ya kur yazımı yapılmaz; arşivleme, rapor ve e-posta ayarları yine
  tamamlanabilir.
- **Teklif al** düğmesi ürün sayfasını açar: `https://tcmbkur.erp.tr`.

#### İnternete çıkamayan sunucu (çevrimdışı lisans)

Sunucu `lisans.erp.tr` adresine hiç ulaşamıyorsa lisans **dosya ile** kurulur; aynı kart üzerindeki
**Çevrimdışı lisans** bölümü kullanılır:

1. **Cihaz bilgi dosyasını indir** düğmesi `TCMBKUR-<makine>.lisans-istek` dosyasını üretir. Sunucuda
   tarayıcı yoksa aynı dosya komut satırından da üretilir (uygulama klasöründe):

   ```powershell
   .\TcmbKur.App.exe lisans-istek
   .\TcmbKur.App.exe lisans-istek D:\gecici
   ```

   Klasör verilmezse dosya uygulamanın kendi klasörüne yazılır. Komut veritabanı bağlantısı
   gerektirmez; kurulum yarım kalmışken de çalışır.
2. Dosya e-posta/USB ile lisans temsilcinize iletilir. Dosya **sır taşımaz**; imzasız düz metindir.
3. ERP tarafı karşılığında `*.erplic` lisans dosyası gönderir. Bu dosya **yalnız o makinede**
   geçerlidir; başka sunucuya kopyalanamaz.
4. Gelen dosya aynı bölümden **yüklenir**; kabul edildiğinde kurulum çevrimdışı çalışmaya başlar.

Dosyanın ömrü dolmaya yaklaştığında ekranda sarı uyarı şeridi çıkar (bitiş tarihi + kalan gün).
Uyarıyı gördüğünüzde yeni cihaz bilgi dosyasını üretip iletin — dosya postayla gidip geldiği için
son güne bırakılmamalıdır.

### 6) Özet & bitir
10 maddelik kontrol listesi (servis, veritabanı, Logo bağlantısı/klasörü/firmaları, zamanlama,
RATES eşleşmesi, kontrol raporu, lisans, e-posta) ve tek eylem: **İlk çekimi yap**.

Günlük kurlar her sabah ayarlanan saatte otomatik yazılır; **Kurlar** ve **Çalışmalar** sayfalarından
izlenir; hatalı bir yazım **Çalışmalar → Geri al** ile geri alınır.

---

## 4. Servis yönetimi, sağlık ve loglar

| Konu | Değer |
|---|---|
| Servis adı | **`ERP TcmbKur`** (görünen ad: `ERP TcmbKur - Logo ERP TCMB Kur Servisi`) |
| Servis hesabı | `LocalSystem` (`NT AUTHORITY\SYSTEM`) |
| Kurulum klasörü | `C:\ERP\TcmbKur` |
| Port | Varsayılan **5230**; doluysa 5230–5299 arası ilk boş port |
| Gerçek adres | `C:\ERP\TcmbKur\listen-url.txt` |
| Sağlık | `GET http://127.0.0.1:<port>/healthz` → `status=ok`, `db=ok`, `version=<paket sürümü>` |
| Log dosyaları | `C:\ERP\TcmbKur\logs\tcmbkur-<tarih>.log` (günlük, 14 dosya saklanır) |
| Veritabanı | Müşterinin **Logo veritabanı**; uygulamanın tabloları `dbo.TCMBKUR_*` (ayarlar `dbo.TCMBKUR_Config`) |
| Sır anahtarları | `C:\ERP\TcmbKur\keys` |

Servis komutları (yönetici PowerShell):
```powershell
Get-Service 'ERP TcmbKur'
Restart-Service 'ERP TcmbKur'
Invoke-RestMethod http://127.0.0.1:5230/healthz
```

### Yedekleme — iki şeyi birden yedekleyin
1. **Logo veritabanı** — ayarlar, kur geçmişi ve çalışma kayıtları `dbo.TCMBKUR_*` tablolarında,
   yani Logo verisiyle **aynı** veritabanında. Zaten aldığınız Logo yedeği bunları da kapsar.
2. **`C:\ERP\TcmbKur\keys` klasörü** — ⚠ SMTP parolası ve lisans anahtarları bu anahtarlarla
   çözülür. Klasör kaybolursa uygulama çökmez ama **bu sırlar sessizce "tanımsız" olur** ve
   yeniden girilmeleri gerekir.

---

## 5. Güncelleme

**1.3.0 sürümünden itibaren TcmbKur kendini günceller.** Kurulum, uygulamanın **dışında** yaşayan bir
güncelleme uygulayıcısı kurar ve günlük çalıştırır. Bu sürüme geçiş (1.2.x → 1.3.0) elle yapılan
**son** güncellemedir; sonrakiler kendiliğinden gelir.

### 5.1 Otomatik güncelleme (varsayılan)

| Konu | Değer |
|---|---|
| Zamanlanmış görev | **`ERP Update TCMBKUR`** — her gün **03:20**, `NT AUTHORITY\SYSTEM` hesabıyla |
| Uygulayıcı klasörü | `C:\ProgramData\ErpUpdate\TCMBKUR` (uygulama klasörünün **dışında**) |
| Kaynak | `https://lisans.erp.tr` — imzalı sürüm bildirimi; paket `https://tcmbkur.erp.tr` üzerinden iner |
| Log | `C:\ProgramData\ErpUpdate\TCMBKUR\logs` |

Bir koşu şu adımlardan geçer: **imzalı** sürüm bildirimi alınır (imza doğrulanamazsa hiçbir şey
yapılmaz) → paket indirilir, **SHA-256 ve boyutu** doğrulanır → servis durdurulur, klasör yedeklenir,
takas edilir → servis başlatılır ve **sağlık kapısından** geçmesi beklenir (`/healthz` 200 **ve
sürüm = hedef sürüm**). Kapıdan geçemezse **önceki sürüme kendiliğinden dönülür**, bozuk paket
karantinaya alınır ve durum sunucuya bildirilir. Veritabanınız, ayarlarınız ve `keys\` klasörünüz
takasın dışındadır (bkz. aşağıdaki tablo).

Güncelleme **lisanstan bağımsızdır**: lisansı süresi dolmuş bir kurulum da güvenlik yamasını alır.

Kontrol (yönetici PowerShell):
```powershell
Get-ScheduledTask 'ERP Update TCMBKUR' | Get-ScheduledTaskInfo    # son ve sonraki koşu
Start-ScheduledTask 'ERP Update TCMBKUR'                          # beklemeden dene
Get-Content "$env:ProgramData\ErpUpdate\TCMBKUR\logs\*.log" -Tail 40
```

Saati değiştirmek için kurulumu `-UpdaterTime 04:30` ile yeniden çalıştırın. Görev kaldırıldığında
(`uninstall.ps1` bunu kendisi yapar) ürün çalışmaya devam eder, yalnız güncellenmez.

### 5.2 Elle güncelleme

Yeni sürüme gece beklemeden geçmek isterseniz veya kurulum `-SkipUpdater` ile yapıldıysa:

1. Ürün sayfasından yeni sürümün zip'ini indirin (bkz. [§8 dipnot](#8-ürün-sayfası-ve-indirme)).
2. Zip'i açıp **`install.ps1`** çalıştırın — servisi elle durdurmanız gerekmez, script durdurur.
   Servis güncellenir ve **aynı portla** yeniden başlar.

> ⚠ Dosya adında **`-noupdate`** geçen bir paket otomatik güncelleme **içermez**; böyle bir kurulumun
> her güncellemesi elle yapılır.

**Ne korunur, ne korunmaz** (elle kurulumda kopyalama `robocopy /E` iledir, `/MIR` **değildir** —
hedefte var olan hiçbir dosya silinmez; otomatik takas da aynı dışlama listesini uygular):

| Öğe | Durum |
|---|---|
| Logo veritabanındaki `dbo.TCMBKUR_*` tabloları ve **tüm ayarlar** | ✅ Korunur (tablolar yoksa oluşturulur, asla silinmez) |
| `appsettings.Production.json` (bağlantı dizesi) | ✅ Korunur (kopyalamadan dışlanır; sadece yoksa üretilir) |
| `keys\` (sır çözme anahtarları) | ✅ Korunur |
| `logs\` | ✅ Korunur |
| `listen-url.txt` | ✅ Korunur |
| **`appsettings.json`** | ⚠ **ÜZERİNE YAZILIR** |

> ⚠ **Önemli:** Elle yaptığınız yapılandırma değişikliklerini **`appsettings.json` içine yazmayın** —
> her güncellemede kaybolur. Bunun yerine **`appsettings.Production.json`** dosyasını kullanın; servis
> `--environment Production` ile koştuğu için bu dosya önceliklidir ve güncellemede korunur.

---

## 6. "Teklif al" adresi

Uygulamadaki **Teklif al** bağlantısının varsayılanı ürünün kendi adresidir:
`https://tcmbkur.erp.tr`.

Bu adres tanıtım, güncel paket, SHA-256 özeti ve kurulum kılavuzunu içerir. Normal kurulumda
`appsettings.Production.json` içine ayrıca `Lisans:TeklifUrl` yazmanız gerekmez.

---

## 7. Sorun giderme

| Belirti | Yapılacak |
|---|---|
| Panel açılmıyor | `services.msc` → `ERP TcmbKur` çalışıyor mu · `C:\ERP\TcmbKur\logs\tcmbkur-*.log` · `C:\ERP\TcmbKur\listen-url.txt` (gerçek port) |
| **`Error occurred during a cryptographic operation.`** | **Kimlik ikiliği / DPAPI kapsamı.** Aynı exe iki farklı Windows kimliğiyle koşar: servis `LocalSystem`, operatör konsolu (`TcmbKur.App.exe setup`) etkileşimli yönetici. Sırlar **makine kapsamlı** DPAPI ile korunur ve anahtar halkası `C:\ERP\TcmbKur\keys` altındadır. Bu klasör silindi/başka makineden kopyalandıysa eski sırlar çözülemez → SMTP parolasını ve lisans anahtarlarını **sihirbazdan yeniden girin**. Klasörün ACL'i `Administrators` + `SYSTEM` olmalıdır. |
| **Lisans: "koltuk dolu" / SeatLimit** | Lisans `MaxSeats = 1`'dir: aynı anda tek aktif kurulum. Önceki makinenin **kirası düşene kadar** (birkaç dakika) bekleyip **Durumu yenile**'ye basın. Eski kurulumun servisi durdurulmuş olmalıdır. Kalıcı taşımada eski cihaz ErpLic yönetiminden `Removed` işaretlenir. |
| **Lisans sunucusuna ulaşılamıyor** | **Uygulama KİLİTLENMEZ.** İmzalı grant önbelleği + **grace** süresi + çevrimdışı `.erplic` dosyası devrededir; internet kesikken kur yazımı çalışmaya devam eder. Kilit yalnız şu durumlarda olur: imzalı iptal, sürenin dolması, ya da grace + çevrimdışı hakkın tükenmesi. Kalıcı kesintide `lisans.erp.tr:443`'e giden güvenlik duvarı/proxy kuralını kontrol edin. |
| "Lisans ataması bekleniyor" | Sihirbaz → **Lisans** adımındaki kısa kodu ERP'ye iletin; lisans merkezden atandıktan sonra **Durumu yenile**'ye basın. |
| "Logo bağlantısı yapılandırılmamış" | Sihirbaz → **Logo bağlantısı** → Kaydet |
| Kur yazılmadı / atlandı | Çalışmalar → satır detayı (uyarılar, hata); Logo'da kur kodu `L_CURRENCYLIST`'te tanımlı mı |
| E-posta gitmiyor | Sihirbaz → **E-posta** → Test e-postası; Loglar |
| SQL yetki hatası (servis) | SSMS: `NT AUTHORITY\SYSTEM` → **Logo veritabanında** `db_owner` (uygulama kendi `dbo.TCMBKUR_*` tablolarını orada yaratır). Kurulum bu yetkiyi kendisi verir; veremediyse ekrana yazdığı SQL'i yetkili bir hesapla çalıştırıp kurulumu tekrarlayın. |
| Eski `TcmbKur` veritabanı ne olacak? | 1.5.0 onu **kullanmaz ve silmez**. İçindeki ayarlar/kullanıcılar taşınmaz — sihirbazdan yeniden girilir (temiz başlangıç). Yedeğini aldıktan sonra veritabanını elle kaldırabilirsiniz. |

### Yönetici parolasını unuttum
Yönetici PowerShell/CMD ile:
```powershell
cd C:\ERP\TcmbKur
.\TcmbKur.App.exe reset-admin
```
Ekrana yazılan **geçici parola** ile `admin` girişi yapılır, yeni parola istenir.
Farklı kullanıcı: `.\TcmbKur.App.exe reset-admin kullaniciadi` ·
belirli parola: `.\TcmbKur.App.exe reset-admin --password YeniParola`.

### Kaldırma
`uninstall.ps1` (sağ tık → PowerShell ile çalıştır): servisi kaldırır; **veritabanı ve ayarlar korunur**.

> ⚠ `uninstall.ps1 -RemoveFiles` kurulum klasörünün tamamını siler — **`keys\` dâhil**. Bu durumda
> veritabanındaki şifreli sırlar (SMTP parolası, lisans anahtarları) bir daha çözülemez.
> Kaldırmadan önce `keys\` klasörünü yedekleyin.

---

## 8. Ürün sayfası ve indirme

Ürün sayfası: `https://tcmbkur.erp.tr` (tanıtım · kurulum · dokümantasyon)

Güncel paket doğrudan şu adresten iner:
`https://tcmbkur.erp.tr/dl/logo-tcmb-kur`

Sürümü sabitlenmiş kalıcı adres:
`https://tcmbkur.erp.tr/dl/logo-tcmb-kur/1.5.0`

Kurulum kılavuzu:
`https://tcmbkur.erp.tr/dl/logo-tcmb-kur/kurulum-kilavuzu.md`
