C# ile vergi kimlik numarası (VKN) doğrulama
Vergi kimlik numarası (VKN) 10 hanelidir ve son hanesi ilk dokuz haneden hesaplanan kontrol hanesidir. Şirketler VKN kullanır. Şahıs işletmeleri ise vergi numarası olarak sahibinin TC kimlik numarasını kullanır. Bu sayfa algoritmayı anlatır ve iki durumu da kabul eden kontrolü gösterir.
Kısa cevap
using HeroKit.Globalization;
using HeroKit.Globalization.Turkey;
"4840847211".IsValidVkn(); // true
"4840847212".IsValidVkn(); // false
"10000000146".IsValidTaxId(Countries.Turkey); // true: şahıs işletmesi, TCKN
"4840847211".IsValidTaxId(Countries.Turkey); // true: şirket, VKN
dotnet add package HeroKit
Kurallar
- Tam olarak 10 hane vardır ve hepsi rakamdır.
- İlk 9 hanenin her biri için,
phanenin sırası (1–9) olmak üzere:a = (hane + 10 − p) mod 10b = (a × 2^(10 − p)) mod 9asıfır değilkenbsıfır çıkarsab = 9alınır.
- Bütün
bdeğerleri toplanır. 10. hane(10 − toplam mod 10) mod 10değerine eşittir.
Örnek: 4840847211
| Sıra | Hane | a | 2^(10 − p) | b |
|---|---|---|---|---|
| 1 | 4 | 3 | 512 | 6 |
| 2 | 8 | 6 | 256 | 6 |
| 3 | 4 | 1 | 128 | 2 |
| 4 | 0 | 6 | 64 | 6 |
| 5 | 8 | 3 | 32 | 6 |
| 6 | 4 | 8 | 16 | 2 |
| 7 | 7 | 0 | 8 | 0 |
| 8 | 2 | 4 | 4 | 7 |
| 9 | 1 | 2 | 2 | 4 |
Toplam 39. Kontrol hanesi (10 − 9) mod 10 = 1. Numaranın son hanesi de 1, yani numara geçerli.
Kütüphanesiz C# kodu
static bool IsValidVkn(string? value)
{
if (value is null || value.Length != 10 || !value.All(char.IsAsciiDigit))
return false;
int sum = 0;
for (int i = 0; i < 9; i++) // i = sıra − 1
{
int a = (value[i] - '0' + 9 - i) % 10;
int b = a * (1 << (9 - i)) % 9; // 1 << n = 2^n
if (a != 0 && b == 0)
b = 9;
sum += b;
}
return (10 - sum % 10) % 10 == value[9] - '0';
}
Bu kod, HeroKit'in IsValidVkn metoduyla 300.000 rastgele sayıda aynı sonucu verir.
Sık yapılan hatalar
- 9 kuralını atlamak.
asıfır değilkenbsıfır çıkarsa 9 alınmalıdır. Bu kural atlanırsa geçerli numaraların bir kısmı reddedilir. - Şahıs işletmelerini reddetmek. Fatura ya da cari kartında vergi numarası alanı yalnız VKN kabul ederse, şahıs işletmeleri TCKN'lerini giremez. Bu alanda
IsValidTaxId(Countries.Turkey)ya da[TaxId("TR")]kullanın. - Sayı tipinde saklamak. VKN
0ile başlayabilir.longolarak saklanırsa baştaki sıfır kaybolur.stringkullanın. - Biçim kontrolünü mükellef kontrolü sanmak. Algoritma numaranın doğru kurulduğunu söyler. Numaranın kayıtlı bir mükellefe ait olduğunu söylemez. Bunun için Gelir İdaresi Başkanlığı'nın (GİB) sorgulama hizmetlerini kullanın.
ASP.NET Core form doğrulaması
using HeroKit.Validation;
public sealed class InvoiceForm
{
[Required, TaxId("TR")] // VKN ya da TCKN
public string? TaxNumber { get; set; }
[Vkn] // yalnız VKN
public string? CompanyTaxNumber { get; set; }
}
FluentValidation kullanıyorsanız (dotnet add package HeroKit.FluentValidation):
RuleFor(x => x.TaxNumber).NotEmpty().TaxId(Countries.Turkey);
RuleFor(x => x.CompanyTaxNumber).Vkn();
MERSİS numarası
16 haneli MERSİS numarası "0", şirketin VKN'si ve 5 haneli bir sıra numarasından oluşur:
"0879001756600379".IsValidMersis(); // true
İlgili
- TCKN doğrulama
- IBAN doğrulama
- Form doğrulama: bütün doğrulama öznitelikleri