Turkey Tax Number Verification

With the method below you can verify a Turkish Tax Number

  METHOD vergino_dogrula.
    DATA: v_vkno     TYPE c LENGTH 10,
          vp         TYPE p,
          toplam     TYPE i,
          toplam_son TYPE i.
    FIELD-SYMBOLS: <fs_val>  TYPE any,
                   <fs_val2> TYPE any.


    " Vergi Kimlik sadece sayıdan oluşabilir
    IF NOT v_vkno CA '0123456789'.
      es_retmsg = VALUE #( retcode = 1
                               msg = 'Vergi Kimlik numarası sadece sayıdan oluşabilir.' ).
      " Vergi Kimlik no 10 karakter uzunluğunda olmalı.
    ELSEIF strlen( v_vkno ) NE 10.
      es_retmsg = VALUE #( retcode = 2
                               msg = 'Vergi Kimlik numarası 10 karakter uzunluğunda olmalı.' ).
    ENDIF.

    CHECK strlen( im_vergino ) EQ 10.

    v_vkno = im_vergino.

    DATA: BEGIN OF vkn,
            n1, n2, n3, n4, n5, n6, n7, n8, n9, n10,
            n11, n22, n33, n44, n55, n66, n77, n88, n99,
            n111, n222, n333, n444, n555, n666, n777, n888, n999,
          END OF vkn.

    " ilk 10 karakteri structurea yay
    WRITE v_vkno TO vkn.

    " MOD 10
    DO 9 TIMES.
      ASSIGN COMPONENT |n{ sy-index }| OF STRUCTURE vkn TO <fs_val>.
      ASSIGN COMPONENT |n{ sy-index * 11 }| OF STRUCTURE vkn TO <fs_val2>.
      IF <fs_val> IS ASSIGNED AND  <fs_val2> IS ASSIGNED.
        <fs_val2> = ( <fs_val> + ( 10 - sy-index ) ) MOD 10.
      ENDIF.
      UNASSIGN: <fs_val>, <fs_val2>.
    ENDDO.

    " üst alma
    DO 9 TIMES.
      ASSIGN COMPONENT |n{ sy-index * 11 }| OF STRUCTURE vkn TO <fs_val>.
      ASSIGN COMPONENT |n{ sy-index * 111 }| OF STRUCTURE vkn TO <fs_val2>.
      IF <fs_val> IS ASSIGNED AND  <fs_val2> IS ASSIGNED.
        CLEAR: vp.
        <fs_val2> = vp = ( <fs_val> * ( 2 ** ( 10 - sy-index ) ) ) MOD 9.
      ENDIF.

      IF <fs_val> NE 0 AND <fs_val2> EQ 0.
        <fs_val2> = 9.
      ENDIF.

      toplam = toplam + <fs_val2>.
      UNASSIGN: <fs_val>, <fs_val2>.
    ENDDO.

    IF toplam MOD 10 EQ 0.
      toplam_son = 0.
    ELSE.
      toplam_son = 10 - ( toplam MOD 10 ).
    ENDIF.


    " toplamın son rakamı vkn son rakamına uyması lazım
    IF toplam_son EQ vkn-n10.
      es_retmsg = VALUE #( retcode = 0 msg = 'Vergi Kimlik numarası doğru.' ).
    ELSE.
      es_retmsg = VALUE #( retcode = 4 msg = 'Vergi Kimlik numarası geçersiz.' ).
    ENDIF.
  ENDMETHOD.

Leave a Reply

Your email address will not be published. Required fields are marked *