Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Project : Αποδείξεις - Έλεγχος ορθότητας ΑΦΜ

Project : Αποδείξεις - Έλεγχος ορθότητας ΑΦΜ 13 Χρόνια 9 Μήνες πριν #1169

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
pmav99 έγραψε:
Αν και είναι πολύ απλό, σα data validation, μπορεί να ενσωματωθεί και κώδικας για έλεγχο της ορθότητας του ΑΦΜ


Κάτι τέτοιο:
def calculate_afm(afm):
    """ Calculates the integrity of the personal tax number.
        Author: marmako@gmail.com
 
    """
 
    if len(afm) != 9:
        print("Το ΑΦΜ: {0} δεν είναι έγκυρο.\nΠρέπει να έχει \
        εννέα ψηφία.".format(afm))
        return False
 
    if afm.isdigit() == False:
        print("Το ΑΦΜ: {0} δεν είναι έγκυρο.\nΠρέπει να αποτελείται από \
        ψηφία.".format(afm))
        return False
 
    chcknumbers = [0, 2, 4, 8, 16, 32, 64, 128, 256]
    lchcknumbers = len(chcknumbers)-1
    sum = 0
 
    for i in range(9):
        sum = sum + (int(afm[i]) * chcknumbers[lchcknumbers])
        lchcknumbers -= 1
 
    ch_digit = int(afm[8])  
 
    ypoloipo = sum % 11
 
    if ypoloipo == 10:
        ypoloipo = 0
 
    if ypoloipo == ch_digit :
        return True
    else:
        return False
 
if __name__=='__main__':
    print(calculate_afm('000555248'))
 

Βέβαια ένα άλλο που έχω εφαρμόσει είναι η ταυτοποίηση του ΑΦΜ από το site της ΓΓΠΣ, με υλοποίηση urllib και re.
Το ιδανικό θα ήταν υλοποίηση και των δύο εκδοχών, σε περίπτωση που η ΓΓΠΣ τσεκάρει και τη βάση της, που δεν το νομίζω.
Γράφω σε Python 3
Τελευταία διόρθωση: 13 Χρόνια 9 Μήνες πριν από kamar.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": pmav99

Απ: Project : Αποδείξεις 13 Χρόνια 9 Μήνες πριν #1170

  • bold
  • Το Άβαταρ του/της bold
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 4
ωραιος kamar
υπαρχει μονο ενα μικρο τυπογραφικο λαθος...
kamar έγραψε:
....    
    ypoloipo = sum % 11
 
    if ypoloipo == 10:
        ypoloipo = 0
 
    ......

σωστό: ypoloipo = (sum % 11)%10

`σε σύγκριση με το κωδικα της VB
RetVal = (((TotalVal Mod 11) Mod 10) = Val(Right(VatNo, 1)))
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Re: Απ: Project : Αποδείξεις 13 Χρόνια 9 Μήνες πριν #1177

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
bold έγραψε:
ωραιος kamar
υπαρχει μονο ενα μικρο τυπογραφικο λαθος...
kamar έγραψε:
....    
    ypoloipo = sum % 11
 
    if ypoloipo == 10:
        ypoloipo = 0
 
    ......

σωστό: ypoloipo = (sum % 11)%10

`σε σύγκριση με το κωδικα της VB
RetVal = (((TotalVal Mod 11) Mod 10) = Val(Right(VatNo, 1)))

Πιστεύω ότι με αυτόν τον τρόπο φαίνεται πιο περιγραφικός ο κώδικας.
Επίσης δεν μου αρέσει (προσωπικά) να γράφω κώδικα σε μια γραμμή.
Το ότι δεν είναι λάθος το γνωρίζω γιατί τη συγκεκριμένη συνάρτηση τη χρησιμοποιώ αρκετό καιρό.
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Re: Απ: Project : Αποδείξεις 13 Χρόνια 9 Μήνες πριν #1178

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
3. Άλλαξα τα ονόματα μερικών μεταβλητών. Καλό είναι να αποφεύγουμε να χρησιμοποιούμε για ονόματα μεταβλητών τις reserved words της Python (στην προκειμένη περίπτωση την sum).

Αυτό μου διέφυγε τελείως. Για να είμαι ειλικρινής δεν ήξερα ότι υπάρχει τέτοια συνάρτηση στην Python.:(
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Re: Απ: Project : Αποδείξεις 13 Χρόνια 9 Μήνες πριν #1179

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Λογικά όλοι οι editors με color highlight πρέπει να σου εμφανίζουν τις reserved words με διαφορετικό χρώμα. Ρίξε ένα μάτι αν θες εδώ

Επίσης μπορείς να χρησιμοποιείς το pylint το οποίο θα σε προειδοποιεί για την ορθότητα του κώδικα σου.
Τελευταία διόρθωση: 13 Χρόνια 9 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: Project : Αποδείξεις 13 Χρόνια 9 Μήνες πριν #1171

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
O Κώδικας του kamar με μερικές αλλαγές.

1. Άλλαξα το όνομα της συνάρτησης
2. Οι έλεγχοι γίνονται πλέον με τη δομή if ... /elif ... / else ...
3. Άλλαξα τα ονόματα μερικών μεταβλητών. Καλό είναι να αποφεύγουμε να χρησιμοποιούμε για ονόματα μεταβλητών τις reserved words της Python (στην προκειμένη περίπτωση την sum).
4. Ενσωμάτωσα την πρόταση του bold. Για την ακρίβεια δεν είναι λάθος ο κώδικας του kamar απλά είναι πιο απλό να το γράψεις με δύο "%"
def check_afm(afm):
    """ 
    Checks the integrity of the personal tax number.
 
    Author: marmako@gmail.com
    """
    if afm.isdigit() == False:
        msg  = "Το ΑΦΜ: {0} δεν είναι έγκυρο.\n".format(afm)
        msg += "Πρέπει να αποτελείται ΜΟΝΟ από ψηφία."
        print(msg)
        return False
 
    elif len(afm) != 9:
        msg  = "Το ΑΦΜ: {0} δεν είναι έγκυρο.\n".format(afm)
        msg += "Πρέπει να έχει εννέα ψηφία."
        print(msg)
        return False
 
    else:
        chck_numbers = [256, 128, 64, 32, 16, 8, 4, 2, 1]
        length = len(chck_numbers) - 1
        athroisma = 0
 
        for i in range(length):
            athroisma += (int(afm[i]) * chck_numbers[i])
 
        ch_digit = int(afm[-1])  
 
        ypoloipo = (athroisma % 11) % 10
 
        if ypoloipo == ch_digit :
            return True
        else:
            return False
 
if __name__ == '__main__':
    print(check_afm('000555248')) # Ακυρο ΑΦΜ
    print(check_afm('000555240')) # Εγκυρο ΑΦΜ
Τελευταία διόρθωση: 13 Χρόνια 9 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Re: Απ: Project : Αποδείξεις 13 Χρόνια 9 Μήνες πριν #1181

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 409
  • Ληφθείσες Ευχαριστίες 88
pmav99 έγραψε:
Λογικά όλοι οι editors με color highlight πρέπει να σου εμφανίζουν τις reserved words με διαφορετικό χρώμα. Ρίξε ένα μάτι αν θες εδώ

Κατά σύμπτωση το Eclipse με Pydev δεν αλλάζει χρώμα στη sum.
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: Re: Απ: Project : Αποδείξεις 13 Χρόνια 9 Μήνες πριν #1195

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
kamar έγραψε:
3. Άλλαξα τα ονόματα μερικών μεταβλητών. Καλό είναι να αποφεύγουμε να χρησιμοποιούμε για ονόματα μεταβλητών τις reserved words της Python (στην προκειμένη περίπτωση την sum).

Αυτό μου διέφυγε τελείως. Για να είμαι ειλικρινής δεν ήξερα ότι υπάρχει τέτοια συνάρτηση στην Python.:(

Από την έκδοση 2.3 και μετά. Αν ο lexer τoυ Eclipse είναι πιο παλιός, ίσως να μην έχει ενσωματωθεί. Θα άξιζε πιστεύω ένα bug report.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: Project : Αποδείξεις - Έλεγχος ορθότητας ΑΦΜ 13 Χρόνια 9 Μήνες πριν #1201

  • Maximus
  • Το Άβαταρ του/της Maximus
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 32
Πολύ-πολύ ενδιαφέρον!

Μια και είδα τον αλγόριθμο αλλά όχι ακόμα την υλοποίηση του kamar, λέω να φτιάξω έναν... έλεγχο για τον έλεγχο ορθότητας του ΑΦΜ (κοινώς, unit test)!
Όποιος θέλει να συνεισφέρει με δοκιμαστικά δεδομένα, ευπρόσδεκτος! :)

Python 2 ή 3;
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: Project : Αποδείξεις - Έλεγχος ορθότητας ΑΦΜ 13 Χρόνια 9 Μήνες πριν #1202

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Όλες οι αποδείξεις γράφουν πανω το ΑΦΜ αυτού που τις έκοψε.

Επίσης μπορείς να τσεκάρεις κάποια νούμερα από εδώ

Γράψε κώδικα που να τρέχει και στα δύο :P
Τελευταία διόρθωση: 13 Χρόνια 9 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Maximus

Απ: Project : Αποδείξεις - Έλεγχος ορθότητας ΑΦΜ 13 Χρόνια 9 Μήνες πριν #1203

  • Maximus
  • Το Άβαταρ του/της Maximus
  • Αποσυνδεμένος
  • pyt___
  • Δημοσιεύσεις: 32
Σωστός!! ;)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: Project : Αποδείξεις - Έλεγχος ορθότητας ΑΦΜ 13 Χρόνια 9 Μήνες πριν #1216

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Εκτός από του Αιγύπτιους, ούτε και εγώ έχω Ιντερνετ συνήθως αυτό τον καιρό μιας και είμαι στο στρατό. Κοιτάζοντας λοιπόν βιαστικά το thread, δεν πρόσεξα ότι έχει κώδικα και πιο κάτω (το scroll down) και το υλοποίησα ξανά. Μιας και η υλοποίηση διέφερε αρκετούτσικα (ίδιο αποτέλεσμα φυσικά), την τροποποίησα ώστε να μοιάζει με τον κώδικα που έχετε παραπάνω και είπα να το ανεβάσω για εκπαιδευτικούς σκοπούς.
def check_afm(afm):
    """ Checks the integrity of the personal tax number
 
    Author: marmako@gmail.com
 
    """
 
    # the error messages (convention: the start with msg_)
    msg_invalid = "Το ΑΦΜ {} δεν είναι έγκυρο.\n".format(afm)
    msg_specific = None
 
    # check what may be wrong, with an explanatory message (msg_specific)
    if not afm.isdigit():
        msg_specific = "Πρέπει να αποτελείται ΜΟΝΟ από ψηφία."
    elif not len(afm) == 9:
        msg_specific = "Πρέπει να έχει εννέα ψηφία."
    else:
        # the algorithm of validating an ΑΦΜ
        # we split the number in two parts
        # head contains all the digits but the last one in reverse order
        head_of_afm = afm[-2::-1]
        check_digit = afm[-1]
 
        total = 0
        for i, d in enumerate(head_of_afm):
            total += int(d) * 2 ** (i + 1)
 
        if (total % 11) % 10 != int(check_digit):
            msg_specific = "ΤΟ ΑΦΜ απέτυχε στον έλεγχο ορθότητας."
 
 
    # handle the errors
    if msg_specific is not None:
        print(msg_invalid + msg_specific)
        return False
 
    # if nothing goes wrong
    return True
 
def main():
    # Valid ΑΦΜ
    afms = ["011111111", "000555240"]
    for afm in afms:
        check_afm(afm)
 
 
    # Invalid ΑΦΜ
    afm = "000555248"
    check_afm(afm)
 
if __name__ == '__main__':
    main()
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": pmav99
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.420 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου