# @trkit-app-pack/legal

> KVKK ve e-ticaret yasal metin şablonları, çerez onayı ve onay kayıtları.

```bash
npm install @trkit-app-pack/legal
```

> Şablonlar hukuki danışmanlık yerine geçmez. Yayına almadan önce bir avukata kontrol ettirin.

## Şablonlar

| Kimlik | Başlık | Dayanak |
|---|---|---|
| `kvkk-aydinlatma` | KVKK Aydınlatma Metni | 6698 md. 10, Aydınlatma Tebliği |
| `acik-riza` | Açık Rıza Metni | 6698 md. 5/1, 6, 9 |
| `cerez-politikasi` | Çerez Politikası | KVKK Çerez Rehberi |
| `mesafeli-satis` | Mesafeli Satış Sözleşmesi | 6502, Mesafeli Sözleşmeler Yönetmeliği |
| `on-bilgilendirme` | Ön Bilgilendirme Formu | Mesafeli Sözleşmeler Yönetmeliği md. 5–6 |
| `teslimat-iade` | Teslimat ve İade Koşulları | 6502, Yönetmelik |
| `ticari-ileti` | Ticari Elektronik İleti Onayı | 6563 md. 6–8, İYS |
| `kvkk-basvuru` | KVKK Başvuru Formu | 6698 md. 11, 13 |

Her belgenin `templateVersion` ve `legalBasis` alanları vardır. Mevzuat değiştiğinde şablon sürümü artar.

## Üretme

```ts
import { generate, generateAll, toHtml, toMarkdown, toPlainText } from "@trkit-app-pack/legal";
import config from "@/trkit.config";

const { document, warnings } = generate("kvkk-aydinlatma", config);
toHtml(document);       // güvenli (kaçışlı) HTML
toMarkdown(document);
toPlainText(document);

// Sipariş bilgisiyle (mesafeli-satis, on-bilgilendirme)
generate("mesafeli-satis", config, { order });
```

Eksik bilgiler metinde `[MERSİS NO]` gibi görünür ve `warnings` dizisinde döner.

## Yapılandırma

```ts
interface LegalConfig {
  company: {
    unvan: string; marka?: string; mersis?: string; vergiDairesi?: string; vergiNo?: string;
    adres: string; telefon?: string; eposta: string; kvkkEposta?: string; kep?: string;
    website: string; sahis?: boolean; // şahıs şirketi: MERSİS yerine vergi no
  };
  kvkk?: {
    veriKategorileri?: DataCategoryKey[];
    aktarimlar?: { alici: string; amac: string; yurtDisi?: boolean }[];
    yurtDisiAktarim?: { hizmetler: string[]; dayanak: "yeterlilik" | "standart-sozlesme" | "baglayici-kurallar" | "arizi-acik-riza" };
    verbisNo?: string;
    kanallar?: string[];
  };
  satis?: {
    teslimatSuresiGun?: number;   // en fazla 30
    kargoyaVerilisGun?: number;
    kargoFirmalari?: string[];
    iadeKargo?: { firma: string; kod?: string };
    odemeYontemleri?: string[];
    dijitalUrun?: boolean;
  };
  cerezler?: { ad: string; saglayici: string; amac: string; sure: string; kategori: "zorunlu" | "fonksiyonel" | "analitik" | "pazarlama" }[];
  ticariIleti?: { kanallar?: ("sms" | "eposta" | "arama")[]; iysMarkaKodu?: string };
  pay?: { provider: string };     // aktarım listesine eklenir
  sms?: { provider: string };
  guncellemeTarihi?: string;      // YYYY-AA-GG
}
```

## Veri kategorileri

| Anahtar | Örnek veriler | Hukuki sebep |
|---|---|---|
| `kimlik` | Ad, soyad, fatura için TCKN | Sözleşme, hukuki yükümlülük |
| `iletisim` | Telefon, e-posta, adres | Sözleşme, meşru menfaat |
| `musteri-islem` | Sipariş geçmişi, talepler | Sözleşme, meşru menfaat |
| `finans` | Fatura bilgileri, iade IBAN'ı | Sözleşme, hukuki yükümlülük |
| `islem-guvenligi` | IP, log kayıtları | Hukuki yükümlülük (5651), meşru menfaat |
| `pazarlama` | Tercihler, çerez verileri | **Açık rıza** |
| `hukuki-islem` | Yazışmalar | Hakkın tesisi, hukuki yükümlülük |
| `lokasyon` | Konum | **Açık rıza** |
| `gorsel-isitsel` | Kamera, çağrı kaydı | Meşru menfaat |
| `saglik` | Sağlık bilgileri (özel nitelikli) | **Açık rıza** + ek önlemler |

Açık rıza gerektiren kategoriler açık rıza metnine otomatik eklenir.

## Çerez onayı

```ts
import { parseCookieConsent, serializeCookieConsent, isAllowed, COOKIE_CONSENT_NAME } from "@trkit-app-pack/legal";
```

React bileşeni için: [Çerez banner'ı](/docs/bilesenler/cerez-banner).

## Onay kayıtları

```ts
import { createConsentRecord, documentHash, latestByPurpose, type ConsentStore } from "@trkit-app-pack/legal";

const record = await createConsentRecord({
  subjectId: "u1",
  purpose: "ticari-ileti:sms",    // veya "kvkk:acik-riza", "cookie:analitik"
  granted: true,
  document: "ticari-ileti@2024.01.1",
  documentHash: await documentHash(document),
  source: "kayit-formu",
  ip, salt: process.env.CONSENT_SALT!,
});
```

`ConsentStore` arayüzü (`append`, `latest`) ile kendi veritabanınıza bağlayın. Kayıtları güncellemeyin; her değişiklik yeni bir kayıttır.
