UNIT DDS_EGN;
INTERFACE
Function TaxNum_OK(Const TaxNum: String; Const AllowNull: Boolean = False): Boolean;
//проверка за коректност на данъчен номер.
Function EGN_Ok(Const EGN: String; Const AllowNull: Boolean = False): Boolean;
//Проверка за коректност на ЕГН.
Function BULSTAT_OK(Const BULSTAT: String; Const AllowNull: Boolean = False): Boolean;
//Проверка за коректност на деветцифров и тринадесетцифров код по Булстат.
Function BULSTAT_OK_9(BULSTAT: String): Boolean;
//проверка за коректност на деветцифров код по Булстат.
Function BULSTAT_OK_13(BULSTAT: String): Boolean;
//проверка за коректност за тринадесетцифров код по Булстат.
IMPLEMENTATION
Function TaxNum_OK(Const TaxNum: String; Const AllowNull: Boolean = False): Boolean;
Var i, B, Code, CheckSum: Integer;
Begin
Result:=False;
If TaxNum='' Then Begin
Result:=AllowNull;
Exit;
End
Else If Length(TaxNum)<>10 Then
Exit;
For i:=1 To 10 Do
If Not(TaxNum In ['0'..'9']) Then
Exit;
CheckSum:=0;
Val(TaxNum[1], B, Code);
Inc(CheckSum, B*4);
Val(TaxNum[2], B, Code);
Inc(CheckSum, B*3);
Val(TaxNum[3], B, Code);
Inc(CheckSum, B*2);
For i:=4 To 9 Do Begin
Val(TaxNum, B, Code);
Inc(CheckSum, B*(11-i));
End; //For
Val(TaxNum[10], B, Code);
CheckSum:=(11-(CheckSum mod 11)) mod 11;
//външното mod 11 е от 28.01.98, т.к. в описанието не се предполага остатък 0.
Result:=Not((CheckSum=10)Or(CheckSum<>B));
End; //TaxNum_OK
Function EGN_Ok(Const EGN: String; Const AllowNull: Boolean = False): Boolean;
Const
Arr: Array[1..9] Of Byte = (2,4,8,5,10,9,7,3,6);
Var
Sum, i, Numb, Code: Integer;
Begin
Result:=False;
If EGN='' Then Begin
Result:=AllowNull;
Exit;
End
Else If Length(EGN)<>10 Then
Exit;
Sum:=0;
For i:=1 To 9 Do Begin
Val(EGN, Numb, Code);
Inc(Sum, numb*arr);
End; //For
Sum:=Sum mod 11;
If Sum=10 Then
Sum:=0;
Val(EGN[10], Numb, Code);
If Sum=Numb Then
Result:=True;
End; //EGN_Ok
Function BULSTATSum(TestStr : String;_s, _f, Offset:byte):LongInt;
Var
ic : byte;
Code,ValCode : Integer;
BuffSum : LongInt;
Begin
BuffSum := 0;
For ic := _s To _f Do
Begin
Val(TestStr[ic - Offset], Code, ValCode);
Inc(BuffSum, ic * Code);
End; { For ic }
BULSTATSum := BuffSum;
End; { BULSTATSum }
Function BULSTAT_OK_9(BULSTAT: String):Boolean;
Var CheckNum, ic: byte;
Code,ValCode: Integer;
Begin
Val(BULSTAT[9], CheckNum, ValCode);
Case (BULSTATSum(BULSTAT,1, 8, 0)Mod 11) Of
10: If (BULSTATSum(BULSTAT,3, 10, 2)Mod 11)=10 Then
Code:=Byte(CheckNum<>0)
Else
Code:=Byte((BULSTATSum(BULSTAT,3, 10, 2)Mod 11)<>CheckNum);
Else //Case
Code:=Byte((BULSTATSum(BULSTAT,1, 8, 0)Mod 11)<>CheckNum);
End; //Case
{31.5.1999 Петя
If (Code > 0) Then Message('Невалиден БУЛСТАТ !');}
Result:=Code=0;
End; { BULSTAT_OK_9 }
Function BulstatSum13(TestStr : String;
Digit9,Offset : Byte): LongInt;
Var
ic : byte;
Code,ValCode : Integer;
BuffSum : LongInt;
Begin
BuffSum := Digit9 * (2 + Offset);
For ic := 10 To 12 Do
Begin
Val(TestStr[ic], Code, ValCode);
case ic of
10 : Inc(BuffSum, (7+Offset) * Code);
11 : Inc(BuffSum, (3+Offset) * Code);
12 : Inc(BuffSum, (5+Offset) * Code);
End; {case}
End; { For ic }
BulstatSum13 := BuffSum;
End; { BULSTATSum }
Function BULSTAT_OK_13(BULSTAT: String):Boolean;
Var CheckNum, ic, Digit9: byte;
Code,ValCode: Integer;
Sum: LongInt;
Begin
Val(BULSTAT[13], CheckNum, ValCode);
//определяне на деветата цифра с помощта на алгоритъма за деветцифрения код по Булстат.
Digit9:=BULSTATSum(BULSTAT,1, 8, 0)Mod 11;
If Digit9=10 Then Begin
Digit9:=BULSTATSum(BULSTAT, 3, 10, 2)Mod 11;
If Digit9=10 Then
Digit9:=0;
End;
//определяне на деветата цифра
Sum:=BulstatSum13(BULSTAT, Digit9, 0);
Case (Sum mod 11) Of
10: If (BulstatSum13(BULSTAT, Digit9, 2)Mod 11)=10 Then
Code:=Byte(CheckNum<>0)
Else
Code:=Byte((BulstatSum13(BULSTAT, Digit9, 2)Mod 11)<>CheckNum);
Else //Case
Code:=Byte((Sum Mod 11)<>CheckNum);
End; //Case
Result:=Code=0;
End; //BULSTAT_OK_13
Function BULSTAT_OK(Const BULSTAT: String; Const AllowNull: Boolean = False): Boolean;
Var Len :Byte;
Begin
Result:=False;
If BULSTAT='' Then Begin
Result:=AllowNull;
Exit;
End;
Len:=Length(BULSTAT);
Case Len of
9,10: Result:=Bulstat_OK_9(BULSTAT);
13: Result:=Bulstat_OK_13(BULSTAT);
End; //case
End; //Bulstat_Ok
End.
|