# @trkit-app-pack/validate

> TCKN, VKN, IBAN, telefon, plaka, posta kodu ve MERSİS doğrulama; hazır zod şemaları ve Türkçe hata mesajları.

```bash
npm install @trkit-app-pack/validate zod
```

zod 4 önerilir; zod 3.25+ da desteklenir. zod kullanmıyorsanız saf fonksiyonları `@trkit-app-pack/validate/core` üzerinden içe aktarın.

## Türkçe zod mesajları

```ts
import { z } from "zod";
import { zodTurkce } from "@trkit-app-pack/validate";

zodTurkce(z); // uygulama başında bir kez

z.string().min(3).parse("a");       // En az 3 karakter olmalıdır
z.email().parse("x");               // Geçerli bir e-posta adresi giriniz
z.number().max(10).parse(11);       // 10 veya daha küçük olmalıdır
z.object({ a: z.string() }).parse({}); // Bu alan zorunludur
```

Şemada verdiğiniz özel mesajlar korunur. Tanınmayan durumlarda zod'un kendi Türkçe yereline düşer.

## zod şemaları

```ts
import { tckn, vkn, vergiNo, iban, telefon, cepTelefonu, plaka, postaKodu, mersis } from "@trkit-app-pack/validate";

const schema = z.object({ tckn, iban, telefon: cepTelefonu });
schema.parse({ tckn: "10000000146", iban: "tr33 0006 1005 1978 6457 8413 26", telefon: "0532 123 45 67" });
// { tckn: "10000000146", iban: "TR330006100519786457841326", telefon: "+905321234567" }
```

Özelleştirilebilir fabrikalar: `tcknSchema(o)`, `vknSchema(o)`, `taxIdSchema(o)`, `ibanSchema(o)`, `phoneSchema({ mobileOnly?, message? })`, `plateSchema(o)`, `postalCodeSchema(o)`, `mersisSchema(o)`.

## TCKN

```ts
isValidTckn("10000000146");   // true
maskTckn("10000000146");      // "100******46"
generateTckn();               // test verisi için geçerli rastgele numara
```

Algoritma: 11 hane, ilk hane 0 olamaz; 10. hane `((1,3,5,7,9. haneler toplamı × 7) − (2,4,6,8. haneler toplamı)) mod 10`; 11. hane ilk 10 hanenin toplamı mod 10.

## VKN ve vergi no

```ts
isValidVkn("1234567890");
detectTaxId("10000000146");   // "tckn"
detectTaxId("<10 hane>");     // "vkn" | null
isValidTaxId(v);              // fatura formlarındaki "TCKN / VKN" alanı
generateVkn();
```

## IBAN

```ts
isValidTrIban("TR33 0006 1005 1978 6457 8413 26"); // true
parseTrIban("TR330006100519786457841326");
// { iban, bankCode: "00061", bankName: null, accountNumber: "0519786457841326" }
formatIban("TR330006100519786457841326"); // "TR33 0006 1005 1978 6457 8413 26"
isValidIbanChecksum("DE89370400440532013000"); // her ülke için mod-97
```

`TR_BANK_CODES` yaygın bankaların EFT kodlarını içerir (Ziraat 00010, Garanti BBVA 00062, İş Bankası 00064…).

## Telefon

```ts
detectPhoneKind("0532 123 45 67");   // "mobile"
detectPhoneKind("0212 555 12 34");   // "landline"
detectPhoneKind("0850 123 45 67");   // "national"
toE164("0532 123 45 67");            // "+905321234567"
formatPhone("+905321234567");        // "0532 123 45 67"
maskPhone("05321234567");            // "0532 *** ** 67"
isValidMobilePhone(v);
```

Kabul edilen girişler: `0532…`, `532…`, `+90 (532) …`, `90532…`, `0090532…`.

## Plaka, posta kodu, MERSİS

```ts
isValidPlate("34 ABC 123");  // true
formatPlate("34abc123");     // "34 ABC 123"
isValidPostalCode("21100");  // true (ilk iki hane il kodu)
isValidMersis("0123456789000015");
```

Plaka kuralları: il kodu 01–81; 1 harf → 4–5 rakam, 2 harf → 3–4 rakam, 3 harf → 2–3 rakam; Ç, Ğ, İ, Ö, Ş, Ü, Q, W, X kullanılmaz.

> Algoritmik doğrulama, numaranın gerçek bir kişiye/şirkete ait olduğunu kanıtlamaz.
