/* ;; Here I Found Actual Tally GSTNo Validation Formula How Is work & What Is Weakness of Tally GSTNo Validation. ;; First Weakness of GSTNo Validation Any 2 Odd Or Even Value Change Then Its Not Get Result Example : PAN No. ABCDE1234G When in GST No. Type : "ABBDF1234G" (3 Character Decrease and 5 Character Increase) Then Not Show Any Error in Tally GST Validation. Try IT Hear Is Full Working GST Validation */ ;; Add Field After LEDGSTIN [#Line: LED GSTIN] Add: Field: At End: FGSTCheck [Field: FGSTCheck] Use: Name Field On: Accept: Yes: Field Accept On: Accept: Yes: Call: Fc_GSTCheck:$$Value Background: RED [Function: Fc_GSTCheck] Parameter: pGSTNo : String Variable: vGSTNO : String Variable: vFirst14Digit : String ;; Convert To Capital 10 : Set: vGSTNo : $$CaseConvert:AllCapital:##pGSTNo ;; Check 15 Digit 20 : Do If: ($$StringLength:##vGSTNo != 15) : Msg Box: "Error" : "Total Character Should Be 15 Digit" ;; Check First 2 Character Is Number 30 : Do If: Not($$FuncIsNumber$$StringPart:##vGSTNo:0:2)) : Msg Box: "Error" : "First 2 Character Should Be Number" ;; Check PAN No 40 : Do If: Not ($$FuncIsValidPAN$$StringPart:##vGSTNo:2:12)) : Msg Box: "Error" : "Check PAN" ;; 2nd Last Digit 50 : Do If: ($$StringPart:##vGSTNo:13:1) != "Z" : Msg Box: "Error" : "2nd Last Digit Should Be 'Z'" ;; Store First 14 Digit In Variable 60 : Set: vFirst14Digit: ($$StringPart:##vGSTNo:0:14) ;; Compare Last Character 70 : Do If: ($$StringPart:##vGSTNo:14:1) != ($$Fc_CheckLastDegit:##vFirst14Digit) : Msg Box: "Error" : "Invalid GST No." [Function: Fc_CheckLastDegit] Parameter: pFirst14Digit: String Variable: vIndex : Number: 1 Variable: vLoopChar : String Variable: vLoopNum : Number Variable: vTmpSum : Number Variable: vODDValue : Number Variable: vModAmt : Number Variable: vTotalOFSum : Number Variable: vCuttentSum : Number Variable: vReturn : String ;; Add List Variable In Character Position 010 : WHILE : ##vIndex <= 14 ;; Split Loop Character 020 : SET: vLoopChar : $$StringPart:##pFirst14Digit##vIndex-1):1 ;; Find Current Character Position 030 : Set: vLoopNum : $$Fc_ReturnNumber:##vLoopChar ;; Get Odd Even Number 040 : Set: vODDValue : IF $$isOdd:##vIndex Then 1 Else 2 ;; Store Tmp Value 050 : Set: vTmpSum : (##vLoopNum * ##vODDValue) ;; MOD Function Alternative formula (=number-(INT(number/divisor)*divisor)) 060 : Set: vModAmt : (##vTmpSum -(($$RoundDown##vTmpSum/36):1.00 ) * 36)) ;; Sum OF Value 070 : Set: vCuttentSum : (##vTmpSum / 36) + ##vModAmt ;; Sum Rounding 080 : Set: vCuttentSum : $$RoundDown:##vCuttentSum:1.00 ;; Add In Total Sum 090 : Set: vTotalOFSum : ##vTotalOFSum + ##vCuttentSum 100 : INCR : vIndex 110 : End While ;;======================================================;; ;; GET Number To Character /*MOD(36-MOD(Sum,36),36)*/ ;; ;;======================================================;; ;; MOD Function Alternative formula (=number-(INT(number/divisor)*divisor)) 200 : Set: vModAmt : (##vTotalOFSum - (($$RoundDown##vTotalOFSum/36):1.00)*36)) ;; Subtract 36 210 : Set: vModAmt : 36 - ##vModAmt ;; MOD Function Alternative formula (=number-(INT(number/divisor)*divisor)) 220 : Set: vModAmt : (##vModAmt - (($$RoundDown##vModAmt/36):1.00)*36)) ;; Store Return Character 230 : Set: vReturn : $$Fc_ReturnCharacter:##vModAmt ;; Return Character 250 : Return: ##vReturn [Function: Fc_ReturnNumber] Parameter: pCharacter : String Return: Number 01 : Do IF : ##pCharacter = "0" : Return: 0 02 : Do IF : ##pCharacter = "1" : Return: 1 03 : Do IF : ##pCharacter = "2" : Return: 2 04 : Do IF : ##pCharacter = "3" : Return: 3 05 : Do IF : ##pCharacter = "4" : Return: 4 06 : Do IF : ##pCharacter = "5" : Return: 5 07 : Do IF : ##pCharacter = "6" : Return: 6 08 : Do IF : ##pCharacter = "7" : Return: 7 09 : Do IF : ##pCharacter = "8" : Return: 8 10 : Do IF : ##pCharacter = "9" : Return: 9 11 : Do IF : ##pCharacter = "A" : Return: 10 12 : Do IF : ##pCharacter = "B" : Return: 11 13 : Do IF : ##pCharacter = "C" : Return: 12 14 : Do IF : ##pCharacter = "D" : Return: 13 15 : Do IF : ##pCharacter = "E" : Return: 14 16 : Do IF : ##pCharacter = "F" : Return: 15 17 : Do IF : ##pCharacter = "G" : Return: 16 18 : Do IF : ##pCharacter = "H" : Return: 17 19 : Do IF : ##pCharacter = "I" : Return: 18 20 : Do IF : ##pCharacter = "J" : Return: 19 21 : Do IF : ##pCharacter = "K" : Return: 20 22 : Do IF : ##pCharacter = "L" : Return: 21 23 : Do IF : ##pCharacter = "M" : Return: 22 24 : Do IF : ##pCharacter = "N" : Return: 23 25 : Do IF : ##pCharacter = "O" : Return: 24 26 : Do IF : ##pCharacter = "P" : Return: 25 27 : Do IF : ##pCharacter = "Q" : Return: 26 28 : Do IF : ##pCharacter = "R" : Return: 27 29 : Do IF : ##pCharacter = "S" : Return: 28 30 : Do IF : ##pCharacter = "T" : Return: 29 31 : Do IF : ##pCharacter = "U" : Return: 30 32 : Do IF : ##pCharacter = "V" : Return: 31 33 : Do IF : ##pCharacter = "W" : Return: 32 34 : Do IF : ##pCharacter = "X" : Return: 33 35 : Do IF : ##pCharacter = "Y" : Return: 34 36 : Do IF : ##pCharacter = "Z" : Return: 35 [Function: Fc_ReturnCharacter] Parameter: pNumber : Number Return: String 01 : Do IF : ##pNumber = 0 : Return: "0" 02 : Do IF : ##pNumber = 1 : Return: "1" 03 : Do IF : ##pNumber = 2 : Return: "2" 04 : Do IF : ##pNumber = 3 : Return: "3" 05 : Do IF : ##pNumber = 4 : Return: "4" 06 : Do IF : ##pNumber = 5 : Return: "5" 07 : Do IF : ##pNumber = 6 : Return: "6" 08 : Do IF : ##pNumber = 7 : Return: "7" 09 : Do IF : ##pNumber = 8 : Return: "8" 10 : Do IF : ##pNumber = 9 : Return: "9" 11 : Do IF : ##pNumber = 10 : Return: "A" 12 : Do IF : ##pNumber = 11 : Return: "B" 13 : Do IF : ##pNumber = 12 : Return: "C" 14 : Do IF : ##pNumber = 13 : Return: "D" 15 : Do IF : ##pNumber = 14 : Return: "E" 16 : Do IF : ##pNumber = 15 : Return: "F" 17 : Do IF : ##pNumber = 16 : Return: "G" 18 : Do IF : ##pNumber = 17 : Return: "H" 19 : Do IF : ##pNumber = 18 : Return: "I" 20 : Do IF : ##pNumber = 19 : Return: "J" 21 : Do IF : ##pNumber = 20 : Return: "K" 22 : Do IF : ##pNumber = 21 : Return: "L" 23 : Do IF : ##pNumber = 22 : Return: "M" 24 : Do IF : ##pNumber = 23 : Return: "N" 25 : Do IF : ##pNumber = 24 : Return: "O" 26 : Do IF : ##pNumber = 25 : Return: "P" 27 : Do IF : ##pNumber = 26 : Return: "Q" 28 : Do IF : ##pNumber = 27 : Return: "R" 29 : Do IF : ##pNumber = 28 : Return: "S" 30 : Do IF : ##pNumber = 29 : Return: "T" 31 : Do IF : ##pNumber = 30 : Return: "U" 32 : Do IF : ##pNumber = 31 : Return: "V" 33 : Do IF : ##pNumber = 32 : Return: "W" 34 : Do IF : ##pNumber = 33 : Return: "X" 35 : Do IF : ##pNumber = 34 : Return: "Y" 36 : Do IF : ##pNumber = 35 : Return: "Z"
there is a bug is checked. but last char always will "Z" is not ok, and its popup always even if having correct GSTN