Ελεγχος Εγκυρότητας Α.Φ.Μ.

Πρόσφατα χρειάστηκε να μεταφέρω δεδομένα από μια βάση δεδομένων σε μια άλλη. Φυσικά όπως θα γνωρίζουν οι περισσότεροι αυτές οι διαδικασίες ποτέ δεν είναι τόσο απλές όσο ακούγονται, ειδικά όταν πρέπει να πέσει μαγείρεμα στα δεδομένα (βλ. διαφορετικοί πίνακες, διαφορετικοί τύποι πεδίων, διαφορετικές τιμές).

Σε αυτά τα δεδομένα υπήρχε και το ΑΦΜ, και μιας και πολλές φορές γινόταν λανθασμένη καταχώρηση, ήταν ευκαιρία να γίνει ένα ξακαθάρισμα. Ψάχνοντας στο Internet για αλγόριθμους ελέγχου του ΑΦΜ βρήκα κάποιες λύσεις σε διάφορες γλώσσες, οπότε έπιασα μια που βρήκα στο digitalnews.gr (σε C# για να μην κάνω και πολλές αλλαγές – έτσι νόμιζα τουλάχιστον) και (αντ)έγραψα την δικιά μου C# function και, ιδού το αποτέλεσμα:

bool CheckAFM(string afm)
{
    long remainder, sum;
    int nn, k;    

    if (afm.Length != 9)
        return false;
    for (nn = 2, k = 7, sum = 0; k >= 0; k--, nn += nn)
        sum += nn * (afm[k] - '0');
    remainder = sum % 11;    

    return (remainder == 10)
    	   ? afm[8] == '0'
            : (afm[8] - '0') == remainder;
}

Νομίζω πως είναι ότι πιο κοντινό στην αντίστοιχη C/C++ υλοποίηση:

bool CheckAFM(const char* afm)
{
    long remainder, sum;
    int nn, k;     

    if (strlen(afm) != 9)
        return false;
    for (nn = 2, k = 7, sum = 0; k >= 0; k--, nn += nn)
        sum += nn * (afm[k] - '0');
    remainder = sum % 11;    

    return (remainder == 10)
            ? afm[8] == '0'
            : (afm[8] - '0') == remainder;
}

Κατεβάστε τον κώδικα…

One Comment

  1. Δύο web services που θα μπορούσαν να χρησιμοποιηθούν για να ελεγχθεί αν ο Α.Φ.Μ. ανήκει σε κάποιο νομικό (ή και φυσικό) πρόσωπο:
    https://www1.gsis.gr/wsgsis/RgWsBasStoixN/RgWsBasStoixNSoapHttpPort?wsdl
    http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
    Μάλλον προτιμότερο είναι το δεύτερο αφού μπορεί να γίνει έλεγχος και για ευρωπαϊκούς Α.Φ.Μ.