Σάββατο, 11 Δεκεμβρίου 2010

Έλεγχος ΑΦΜ

Μιλάμε σήμερα για την νομιμότητα ενός 9-ψήφιου ΑΦΜ (Αριθμού Φορολογικού Μητρώου), όπως καθορίστηκε το 1998 και ισχύει μέχρι σήμερα. Η διαδικασία που παρουσιάζουμε μπορεί να φανεί χρήσιμη σε όσους προγραμματίζουν εφαρμογές που συμπεριλαμβάνουν καταχωρήσεις ΑΦΜ.

Όταν εντοπιστεί πλαστός αριθμός, πρέπει να ενημερώνεται η σχετική ΔΟΥ. Αν κάποιος αποδέχεται παραστατικά με πλαστό ΑΦΜ, κινδυνεύει να χαρακτηριστεί συνεργός σε φοροδιαφυγή.

Αν μετρήσουμε τα ψηφία του ΑΦΜ από αριστερά προς τα δεξιά, το ένατο ψηφίο είναι ψηφίο ελέγχου (checkdigit), δηλαδή μπορεί να προκύψει από τα οκτώ πρώτα με κάποιες πράξεις.
Ο έλεγχος σε ένα τυχαίο ΑΦΜ γίνεται ως εξής : κάνουμε τις προκαθορισμένες πράξεις στα οκτώ πρώτα ψηφία και προκύπτει ένα ψηφίο. Συγκρίνουμε αυτό το εξαγόμενο με το τελευταίο ψηφίο του ΑΦΜ. Αν είναι διαφορετικά, τότε ο ΑΦΜ είναι λανθασμένος.

Οι πράξεις είναι οι παρακάτω :
* Το πρώτο ψηφίο πολλαπλασιάζεται με 256, το δεύτερο πολλαπλασιάζεται με 128, (κλπ, τρίτο με 64, τέταρτο με 32, πέμπτο με 16, έκτο με 8, έβδομο με 4, όγδοο με 2).
* Προσθέτουμε τα οκτώ γινόμενα.
* Το άθροισμα που βρήκαμε διαιρείται (ακέραια διαίρεση) με το 11 και βρίσκουμε το υπόλοιπο (που θα είναι ένας αριθμός από 0 μέχρι 10).
* Αν το υπόλοιπο είναι 10, θεωρούμε ότι βρήκαμε 0.
* Το υπόλοιπο συγκρίνεται με το ψηφίο ελέγχου, δηλαδή με το ένατο ψηφίο του ΑΦΜ.

Δίνουμε και ένα (δοκιμασμένο) υποπρόγραμμα σε γλώσσα Microsoft Visual Basic για τον έλεγχο ενός πεδίου Α_Φ_Μ (πεδίο χαρακτήρων, σε μια φόρμα Access), πριν αποθηκεύσουμε το περιεχόμενό του.

Private Sub Α_Φ_Μ_Exit(Cancel As Integer)
' Manolas Emmanuel, 2010
Dim DIG(9) As Integer
Dim DigSum As Integer, phliko As Integer, ypoloipo As Integer
Dim i As Integer, Msg1 As String

Cancel = 0
If IsNull([Α_Φ_Μ].Value) Then
MsgBox "Το αφμ είναι ασυμπλήρωτο!", vbOKOnly, "έλεγχος αφμ"
Cancel = 1
Else
If Mid(Msg1, 1, 1) = "*" Then
MsgBox "Το αφμ αρχίζει από * και δεν γίνεται έλεγχος!", vbOKOnly, "μη ελληνικό αφμ"
Else
Msg1 = [Α_Φ_Μ].Value & "AAAAAAAAA"
Msg1 = Mid(Msg1, 1, 9)
If IsNumeric(Msg1) Then
DIG(1) = 256 * CInt(Mid(Msg1, 1, 1))
DIG(2) = 128 * CInt(Mid(Msg1, 2, 1))
DIG(3) = 64 * CInt(Mid(Msg1, 3, 1))
DIG(4) = 32 * CInt(Mid(Msg1, 4, 1))
DIG(5) = 16 * CInt(Mid(Msg1, 5, 1))
DIG(6) = 8 * CInt(Mid(Msg1, 6, 1))
DIG(7) = 4 * CInt(Mid(Msg1, 7, 1))
DIG(8) = 2 * CInt(Mid(Msg1, 8, 1))
DIG(9) = CInt(Mid(Msg1, 9, 1))
DigSum = 0
For i = 1 To 8
DigSum = DigSum + DIG(i)
Next i
phliko = DigSum \ 11
ypoloipo = DigSum - (phliko * 11)
If ypoloipo = 10 Then
ypoloipo = 0
End If
If ypoloipo <> DIG(9) Then
Msg1 = "Βρήκα checkdigit " & CStr(ypoloipo) & " αλλά το τελευταίο ψηφίο είναι " & CStr(DIG(9))
MsgBox Msg1, vbOKOnly, "έλεγχος αφμ"
Cancel = 1
End If
Else
Msg1 = "Το αφμ δεν φαίνεται σωστό. Ελέγξτε το!"
MsgBox Msg1, vbOKOnly, "έλεγχος αφμ"
End If
End If
End If
End Sub


Ο έλεγχος γίνεται αν το πεδίο έχει περιεχόμενο.
Το περιεχόμενο αναμένεται (για ελληνικό ΑΦΜ) να είναι εννιά ψηφία.
Αν το περιεχόμενο του πεδίου έχει κατά λάθος λιγότερα ψηφία, το πρόγραμμα προσαρτά μηδενικά από δεξιά. (Το ΑΦΜ 000000000 περνάει τον έλεγχο ως νόμιμο, αν όμως έχουμε ορίσει το πεδίο Α_Φ_Μ να παίρνει μοναδικές τιμές μέσα στον πίνακα Εταιρείες, τότε μόνο για μια "εταιρεία" μπορούμε να το χρησιμοποιήσουμε. Προσωρινά, μέχρι να μάθουμε το σωστό).
Για ΑΦΜ άλλης χώρας μπορούμε να βάζουμε μπροστά έναν αστερίσκο [*] για να μην γίνεται ο έλεγχος για ψηφίο ελέγχου.
Αν το ΑΦΜ δεν είναι σωστό, τότε (με την εντολή [Cancel = 1]) δεν επιτρέπεται η καταχώρησή του.


Τα στοιχεία προέρχονται από το άρθρο "Η απόρρητη συνταγή του νέου ΑΦΜ" του Θάνου Τσίρου, που δημοσιεύτηκε στην υποενότητα "Οικονομία" της εφημερίδας "Κυριακάτικη (Ελευθεροτυπία)" σελ.11 την Κυριακή 18/10/1998.

Δεν υπάρχουν σχόλια: