Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TC&VKN doğrulama Function [Çözüm]
#1
Information 
Merahaba,
T.C. Kimlik ve Vergi Kimlik numaraları belirli bir algoritma ile üretilmektedir.
Veri girişi esnasında kullanıcı, müşteri veya üyelerin vergi kimlik numarası yada T.C. kimlik numarasını hatalı girip girmediğini kontrol edebileceğimiz fonksiyonu paylaşmak istedim.
2 farklı algoritmayı 1 function içinde toparladım.
Sonuc True yada False olarak geri dönecektir.  
uses 
System.Math;
.
.

function TC_Vkn_Kontrol(kimlikno:String):Boolean;
var
 s: array[1..11] of Integer;
 i:SmallInt;
 d,ilk,son,onuncu,onbirinci:integer;
 _Soniki, pSoniki,sonuc    :string;
begin
 Result:=False;
 if Length(kimlikno)=10 then
 Begin
   s[1]:=(StrToInt(kimlikno[1])+10-1) mod 10;
   s[2]:=(StrToInt(kimlikno[2])+10-2) mod 10;
   s[3]:=(StrToInt(kimlikno[3])+10-3) mod 10;
   s[4]:=(StrToInt(kimlikno[4])+10-4) mod 10;
   s[5]:=(StrToInt(kimlikno[5])+10-5) mod 10;
   s[6]:=(StrToInt(kimlikno[6])+10-6) mod 10;
   s[7]:=(StrToInt(kimlikno[7])+10-7) mod 10;
   s[8]:=(StrToInt(kimlikno[8])+10-8) mod 10;
   s[9]:=(StrToInt(kimlikno[9])+10-9) mod 10;
   for i := 1 to 9 do
   Begin
     if s[i]<>9 then
     begin
       d:=s[i];
       s[i]:=Ceil(d* IntPower(2 , 10-i)) mod 9;
     end;
   End;
   d:=(10 - (s[1]+s[2]+s[3]+s[4]+s[5]+s[6]+s[7]+s[8]+s[9]) mod 10) mod 10;
  // d:=(s[1]+s[2]+s[3]+s[4]+s[5]+s[6]+s[7]+s[8]+s[9]) mod 10; // düzeltme yapılan alan
   sonuc:=Copy(kimlikno,1,9)+IntToStr(d);
   if sonuc=kimlikno then Result:=True;
 End;
 if Length(kimlikno)=11 then
 Begin
   s[1]  := StrToInt(kimlikno[1]);
   s[2]  := StrToInt(kimlikno[2]);
   s[3]  := StrToInt(kimlikno[3]);
   s[4]  := StrToInt(kimlikno[4]);
   s[5]  := StrToInt(kimlikno[5]);
   s[6]  := StrToInt(kimlikno[6]);
   s[7]  := StrToInt(kimlikno[7]);
   s[8]  := StrToInt(kimlikno[8]);
   s[9]  := StrToInt(kimlikno[9]);
   s[10] := StrToInt(kimlikno[10]);
   s[11] := StrToInt(kimlikno[11]);
   ilk   := (s[1]+s[3]+s[5]+s[7]+s[9]) * 7;
   son   := s[2]+s[4]+s[6]+s[8];
   onuncu    := (ilk - son) mod 10;
   onbirinci := ((s[1]+s[2]+s[3]+s[4]+s[5]+s[6]+s[7]+s[8]+s[9]+s[10])) mod 10;
   _Soniki   := IntToStr(onuncu) + IntToStr(onbirinci);
   pSoniki   := kimlikno[10] + kimlikno[11];
   if _Soniki = pSoniki then Result := True
 End;
end;

Kullanımı;
 if TC_Vkn_Kontrol('01234567891')  then
   ShowMessage('Doğru')  else
   ShowMessage('Hatalı')
İyi Çalışmalar.
Cevapla
#2
Merhaba,
Birçok projede UniqueId olarak T.C.Kimlik numarası veya vergi kimlik numarası kullanılıyor. Bu anlamada çok faydalı bir paylaşım olduğunu düşünüyorum.
Katkılarınızdan dolayı teşekkür ederim.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
bu algoritmayı daha önce kullandım %99.99 bir sıkıntı yok fakat bazı müşterilerimde sıkıntı çıktı tckimlik numarası doğru fakat bu algoritmadan geçemedi



“Do. Or do not. There is no try.”
Cevapla
#4
(29-11-2017, Saat: 13:03)masteryoda Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olbu algoritmayı daha önce kullandım %99.99 bir sıkıntı yok fakat bazı müşterilerimde sıkıntı çıktı tckimlik numarası doğru fakat bu algoritmadan geçemedi

Çok talihsiz bir durum olmuş, inşallah düze çıkmıştır. Bu numaralar ilk dağıtıldığı sırada belli ki bunu pek ön görememiş numarayı dağıtanlar... 

Konuya benim de bir katkım olsun maksadıyla çok eskiden hazırladığım bir TC Kimlik no Hesaplama fonksiyonunu da buradan paylaşmak istiyorum. İlk 9 basamağı verdiğinizde size 10 ve 11'nci basamakları da hesaplayıp tam bir TC Kimlik no olarak değer döndürüyor.

Neden böyle bir şeye ihtiyaç duyduğumuzu merak eden arkadaşlarımız olursa yine buradan açıklamaya çalışırız.
  function TC_No_Hesapla(aTCNo: String): String;
  var
    X   ,                                                     //  X = mevcut bayt,
    Y   : Array[1..11] of Byte;                               //  Y = yeni bayt anlamında...
    I   ,                                                     //  Genel sayaç.
    T   ,                                                     //  T = Tek basamaklı "rakamlar"
    C   ,                                                     //  C = Çift basamaklı "rakamlar"
    _11 : Integer;                                            //  _11 = hesaplanacak olan 11.ci basamağa ait "rakam"
  begin
    T := 0; C:= 0; _11 := 0; Result := '';                    //  Değişkenleri sıfırlıyoruz.
    for I := 1 to 9 do begin                                  //  Parametrenin ilk 9 hanesini
        X[I] := StrToInt(aTCNo[I]);                           //  > okuyoruz
        case (I mod 2) of                                     //  Sayaçtaki basamağın tek mi çift mi olduğuna bakıyoruz
            1: T := T + X[I];                                 //  Tek haneli bir basamakda isek "T" değişkeninde "rakamları" toplayıp bir "sayı" elde ediyoruz.
            0: C := C + X[I];                                 //  Çift haneli ise aynı şeyi "C" için gerçekleştiriyoruz
        end;
        _11 := _11 + X[I];                                    //  11.ci basamak tüm basamakların toplamını ifade edeceği için rakamları toplayarak "_11" değişkeninde biriktiriyoruz.
        Y[I] := X[I];                                         //  İlk 9 basamak birebir aynı olacağı için basamakları eskiden yeniye kopyalıyoruz
    end;
    T := T * 7;                                               //  Tek sayılar toplamının 7 katını hesaplıyoruz
    Y[10] := (T - C) mod 10;                                  //  10.cu basamağı hesaplamak için Tek sayıların toplamından çift sayıların toplamını çıkarıp 10'a bölümünden "kalanı" alıyoruz.
    Y[11] := (_11 + Y[10]) mod 10;                            //  11.ci basamak ilk 10 basamağın toplamının 10'a bölümünden kalanı ifade ediyor...
    for I := 1 to 11 do Result := Result + Y[I].ToString[1];  //
  end;
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Cevapla
#5
(29-11-2017, Saat: 13:03)masteryoda Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olbu algoritmayı daha önce kullandım %99.99 bir sıkıntı yok fakat bazı müşterilerimde sıkıntı çıktı tckimlik numarası doğru fakat bu algoritmadan geçemedi

Daha öncesinde farklı bir algoritma ile de yapmıştım ve sizinde söylediğiniz durum ortaya çıkmıştı. Bu algoritma ile yaptığım testlerde hep doğru sonuç almıştım. Sizin cevabınızdan sonra biraz daha inceleme yaptım. Çok eski kuruluşlu(1988) bir firma için denemek istediğimde hatalı sonuç olarak geri dönüş oldu.
Bir ihtimal, algoritmaya göre vergi kimlik numarası üretilmesi daha sonraki yıllarda uygunmış olabilir mi?
GİB tarafından bir bilgi talep etmek cevap alabilmek biraz kolay olsaydı, aslında işimiz daha kolay olabilirdi.

Veri girişini engellemek ve kullanıcıyı bilgilendirmek adına aşağıdaki gibi bir yöntem uygulanabilir.
VKN.gif
Cevapla
#6
(29-11-2017, Saat: 14:06)Cyber Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(29-11-2017, Saat: 13:03)masteryoda Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olbu algoritmayı daha önce kullandım %99.99 bir sıkıntı yok fakat bazı müşterilerimde sıkıntı çıktı tckimlik numarası doğru fakat bu algoritmadan geçemedi

Daha öncesinde farklı bir algoritma ile de yapmıştım ve sizinde söylediğiniz durum ortaya çıkmıştı. Bu algoritma ile yaptığım testlerde hep doğru sonuç almıştım. Sizin cevabınızdan sonra biraz daha inceleme yaptım. Çok eski kuruluşlu(1988) bir firma için denemek istediğimde hatalı sonuç olarak geri dönüş oldu.
Bir ihtimal, algoritmaya göre vergi kimlik numarası üretilmesi daha sonraki yıllarda uygunmış olabilir mi?
GİB tarafından bir bilgi talep etmek cevap alabilmek biraz kolay olsaydı, aslında işimiz daha kolay olabilirdi.

Veri girişini engellemek ve kullanıcıyı bilgilendirmek adına aşağıdaki gibi bir yöntem uygulanabilir.
VKN.gif

Merhaba,

Bildiğim kadarıyla "1111111111" Vergi nosu BA/BS formlarında Vergi kimlik numarası bilinmeyen yurt-içi tüzel mükellefler için kullanılan bir vergi kimlik numarası. Eğer mükellef yurt-dışı ise bu sayı "2222222222" şeklinde kullanılıyor. Bu iki sayı özel bir durumu ifade ettiği için hatalı bile olsa kullanımda olabiliyor diye biliyorum.
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Cevapla
#7
VKN kontrol kısmı için kodu sadeleştirken bir eksik tanımlama yapmışım. Tesadüf odur ki daha sonrasında test ettiğim kimlik no düzenleme yaptığım aşamayı geçecek kimlik no olduğu için fark edememişim.
Şuan için geçmiş tarihli kimlik numaralarında da yaptığım kontroller olumlu sonuç veriyor.

  // d:=(s[1]+s[2]+s[3]+s[4]+s[5]+s[6]+s[7]+s[8]+s[9]) mod 10; // düzeltme yapılan alan
   d:=(10 - (s[1]+s[2]+s[3]+s[4]+s[5]+s[6]+s[7]+s[8]+s[9]) mod 10) mod 10;

Test aşamalarının uzun tutulmasının bir faydasına böylelikle bir kez daha hatırlamış oldum Sad

İyi Çalışmalar.
Cevapla
#8
(29-11-2017, Saat: 16:34)Cyber Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlVKN kontrol kısmı için kodu sadeleştirken bir eksik tanımlama yapmışım. Tesadüf odur ki daha sonrasında test ettiğim kimlik no düzenleme yaptığım aşamayı geçecek kimlik no olduğu için fark edememişim.
Şuan için geçmiş tarihli kimlik numaralarında da yaptığım kontroller olumlu sonuç veriyor.

  // d:=(s[1]+s[2]+s[3]+s[4]+s[5]+s[6]+s[7]+s[8]+s[9]) mod 10; // düzeltme yapılan alan
   d:=(10 - (s[1]+s[2]+s[3]+s[4]+s[5]+s[6]+s[7]+s[8]+s[9]) mod 10) mod 10;

Test aşamalarının uzun tutulmasının bir faydasına böylelikle bir kez daha hatırlamış oldum  Sad

İyi Çalışmalar.

bende bu algoritmaya güvenerek müşterinin de isteği üzerine hatalı ise kayıt yapılmasın şeklinde bir yol izlemiştim ama daha sonra kaldırmak zorunda kaldım uyarı verdirtmek daha iyi bir çözüm.

“Do. Or do not. There is no try.”
Cevapla
#9
ALTER FUNCTION [dbo].[fnIsValidTCKimlikNo](@TCKimlikNo BIGINT)
RETURNS BIT
AS
BEGIN
	DECLARE
		@temp			BIGINT,
		@d1				TINYINT,
		@d2				TINYINT,
		@d3				TINYINT,
		@d4				TINYINT,
		@d5				TINYINT,
		@d6				TINYINT,
		@d7				TINYINT,
		@d8				TINYINT,
		@d9				TINYINT,
		@d10			TINYINT,
		@d11			TINYINT,
		@LastTwoDigit	TINYINT,
		@Result			BIT

	SET @Result = 0

	IF LEN(CONVERT(VARCHAR, @TCKimlikNo)) = 11
	BEGIN
		SET @temp = @TCKimlikNo / 100 -- Son 2 basamağı uçuruyoruz Wink
		SET @LastTwoDigit = @TCKimlikNo % 100

		SELECT
			@d9		= @temp % 10,
			@temp	= @temp / 10,
			@d8		= @temp % 10,
			@temp	= @temp / 10,
			@d7		= @temp % 10,
			@temp	= @temp / 10,
			@d6		= @temp % 10,
			@temp	= @temp / 10,
			@d5		= @temp % 10,
			@temp	= @temp / 10,
			@d4		= @temp % 10,
			@temp	= @temp / 10,
			@d3		= @temp % 10,
			@temp	= @temp / 10,
			@d2		= @temp % 10,
			@temp	= @temp / 10,
			@d1		= @temp % 10,

			@d10	= (((@d1 + @d3 + @d5 + @d7 + @d9) * 7) - (@d2 + @d4 + @d6 + @d8) ) % 10,
			@d11	= (@d1 + @d2 + @d3 + @d4 + @d5 + @d6 + @d7 + @d8 + @d9 + @d10) % 10

		IF ((@d10 * 10) + @d11) = @LastTwoDigit SET @Result = 1
	END

	RETURN @Result	
END

Sql Server için ilgili fonksiyonumu da ben paylaşayım Smile
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi