Γεννήτρια & Επαληθευτής CUIT/CUIL | Εργαλείο Φορολογικού ID της Αργεντινής
Δημιουργήστε έγκυρους δοκιμαστικούς αριθμούς CUIT/CUIL της Αργεντινής ή επαληθεύστε υπάρχοντες. Δωρεάν διαδικτυακό εργαλείο για προγραμματιστές που ελέγχουν φορολογικά ID και μισθοδοτικά συστήματα με επικύρωση συμβατή με το AFIP.
Γεννήτρια CUIT/CUIL
Εισάγετε έναν 8-ψήφιο αριθμό DNI ή χρησιμοποιήστε την τυχαία γεννήτρια
Χρήση τυχαία παραγόμενου DNI
Τεκμηρίωση
Γεννήτρια και Επαληθευτής Αργεντίνικου CUIT/CUIL
Εισαγωγή
Στα φορολογικά και εργασιακά συστήματα της Αργεντινής, θα συναντάτε συνεχώς δύο κρίσιμα αναγνωριστικά: CUIT (Clave Única de Identificación Tributaria) και CUIL (Clave Única de Identificación Laboral). Σκεφτείτε το CUIT ως το φορολογικό αναγνωριστικό για επιχειρήσεις και ιδιώτες που πληρώνουν φόρους, ενώ το CUIL προσδιορίζει τους εργαζόμενους στο σύστημα κοινωνικής ασφάλισης. Και τα δύο χρησιμοποιούν το ίδιο μορφότυπο 11 ψηφίων και τον ίδιο αλγόριθμο επαλήθευσης, γεγονός που καθιστά ιδιαίτερα σημαντική τη δοκιμή εφαρμογών που χειρίζονται αυτούς τους αριθμούς.
Κατά την ανάπτυξη λογισμικού για την αργεντίνικη αγορά, χρειάζεστε έγκυρα δεδομένα δοκιμής. Εδώ είναι που αυτό το εργαλείο έρχεται να βοηθήσει. Μπορείτε να δημιουργήσετε μαθηματικά ορθούς αριθμούς CUIT/CUIL για δοκιμές χωρίς να χρησιμοποιείτε πραγματικά προσωπικά στοιχεία, ή να επικυρώσετε υπάρχοντες αριθμούς για να διασφαλίσετε ότι συμμορφώνονται με τον επίσημο αλγόριθμο του AFIP. Αυτό που είναι ιδιαίτερα χρήσιμο είναι ότι το εργαλείο καλύπτει τόσο την πλευρά της δημιουργίας (παραγωγή έγκυρων αριθμών κατά παραγγελία) όσο και την πλευρά της επικύρωσης (εντοπισμός σφαλμάτων μορφοποίησης, μη έγκυρων κωδικών τύπου και εσφαλμένων ψηφίων επαλήθευσης πριν προκαλέσουν προβλήματα σε παραγωγικό περιβάλλον).
Δομή και Υπολογισμός CUIT/CUIL
Κατανόηση της Μορφής
Ένας έγκυρος αριθμός CUIT/CUIL αποτελείται από 11 ψηφία που συνήθως εμφανίζονται στη μορφή XX-XXXXXXXX-X. Δείτε πώς αναλύεται:
-
Κωδικός Τύπου (πρώτα 2 ψηφία): Προσδιορίζει τον τύπο οντότητας
- 20, 23, 24: Άρρενα άτομα (CUIL)
- 27: Θήλεα άτομα (CUIL)
- 30, 33, 34: Εταιρείες και οργανισμοί (CUIT)
-
Αριθμός DNI (μεσαία 8 ψηφία): Για άτομα, αυτός είναι ο αριθμός εθνικού δελτίου ταυτότητας (DNI). Μια συνηθισμένη παγίδα: εάν το πραγματικό DNI έχει λιγότερα από 8 ψηφία, πρέπει να συμπληρωθεί με προηγούμενα μηδενικά. Για παράδειγμα, το DNI 1234567 γίνεται 01234567 στο CUIT/CUIL. Οι εταιρείες λαμβάνουν έναν μοναδικό εκχωρημένο αριθμό.
-
Ψηφίο Επαλήθευσης (τελευταίο ψηφίο): Αυτό το ψηφίο ελέγχου επικυρώνει ολόκληρο τον αριθμό χρησιμοποιώντας έναν σταθμισμένο αλγόριθμο. Εάν αυτό το ψηφίο δεν ταιριάζει με τον υπολογισμό, ολόκληρο το CUIT/CUIL είναι άκυρο - κάτι που συχνά προκαλεί σύγχυση στους προγραμματιστές όταν κατασκευάζουν χειροκίνητα δεδομένα δοκιμής.
Υπολογισμός Ψηφίου Επαλήθευσης
Το ψηφίο επαλήθευσης χρησιμοποιεί έναν σταθμισμένο αλγόριθμο modulo-11. Δείτε πώς λειτουργεί:
- Πάρτε τα πρώτα 10 ψηφία του CUIT/CUIL (κωδικός τύπου + DNI)
- Πολλαπλασιάστε κάθε ψηφίο με το αντίστοιχο βάρος του: 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
- Αθροίστε όλα τα γινόμενα
- Υπολογίστε: 11 μείον (άθροισμα modulo 11)
- Χειριστείτε οριακές περιπτώσεις: εάν το αποτέλεσμα είναι 11, χρησιμοποιήστε 0· εάν είναι 10, χρησιμοποιήστε 9
Αυτό που μπερδεύει τους περισσότερους είναι οι οριακές περιπτώσεις στα βήματα 5. Κατά τη δοκιμή, θα πάρετε περιστασιακά ένα αποτέλεσμα 10 ή 11, και η λήθη αντιστοίχισης αυτών σε 9 και 0 αντίστοιχα προκαλεί αποτυχίες επικύρωσης που μπορεί να είναι δύσκολο να εντοπιστούν εάν δεν είστε ενήμεροι αυτού του κανόνα.
Μαθηματικά, αυτό μπορεί να εκφραστεί ως:
Όπου:
- είναι το ψηφίο επαλήθευσης
- είναι το -οστό ψηφίο των πρώτων 10 ψηφίων
- είναι το αντίστοιχο βάρος από την ακολουθία [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
- Ειδικές περιπτώσεις: εάν τότε , εάν τότε
Οδηγός Βήμα προς Βήμα
Χρήση του Γεννήτορα
-
Επιλέξτε την καρτέλα "Γεννήτορας" στο επάνω μέρος της διεπαφής του εργαλείου.
-
Επιλέξτε έναν Κωδικό Τύπου από το αναπτυσσόμενο μενού:
- 20: Άρρεν (CUIL)
- 23: Επιχείρηση (CUIT)
- 24: Προσωρινή Επιχείρηση (CUIT)
- 27: Θήλυ (CUIL)
- 30: Εταιρεία (CUIT)
- 33: Αστική Ένωση (CUIT)
- 34: Ίδρυμα (CUIT)
-
Εισάγετε έναν Αριθμό ΑΔΤ (προαιρετικό):
- Εισάγετε έναν 8-ψήφιο αριθμό ΑΔΤ στο παρεχόμενο πεδίο
- Εάν αφεθεί κενό, το εργαλείο θα χρησιμοποιήσει έναν τυχαία παραγόμενο ΑΔΤ
- Εάν εισάγετε λιγότερα από 8 ψηφία, το σύστημα θα συμπληρώσει με μηδενικά στην αρχή
-
Παραγωγή Τυχαίου ΑΔΤ (προαιρετικό):
- Κάντε κλικ στο κουμπί "Τυχαίο" για να παραγάγετε έναν τυχαίο 8-ψήφιο αριθμό ΑΔΤ
-
Προβολή του Παραγόμενου CUIT/CUIL:
- Το εργαλείο εμφανίζει αυτόματα ένα έγκυρο CUIT/CUIL με βάση τις εισόδους σας
- Η μορφή θα είναι XX-XXXXXXXX-X με το σωστό ψηφίο ελέγχου
-
Αντιγραφή του Αποτελέσματος:
- Κάντε κλικ στο εικονίδιο αντιγραφής για να αντιγράψετε το παραγόμενο CUIT/CUIL στο πρόχειρο
- Ένα μήνυμα επιβεβαίωσης θα εμφανιστεί όταν αντιγραφεί επιτυχώς
Χρήση του Επαληθευτή
-
Επιλέξτε την καρτέλα "Επαληθευτής" στο επάνω μέρος της διεπαφής του εργαλείου.
-
Εισάγετε το CUIT/CUIL προς Επαλήθευση:
- Εισάγετε το CUIT/CUIL στη μορφή XX-XXXXXXXX-X
- Το εργαλείο θα μορφοποιήσει αυτόματα την είσοδό σας με παύλες καθώς πληκτρολογείτε
- Μπορείτε επίσης να εισάγετε τον αριθμό χωρίς παύλες (XXXXXXXXXXX)
-
Κάντε κλικ στο κουμπί "Επαλήθευση":
- Το εργαλείο θα ελέγξει τη μορφή, τον κωδικό τύπου και το ψηφίο ελέγχου
-
Προβολή του Αποτελέσματος Επαλήθευσης:
- Για έγκυρους αριθμούς CUIT/CUIL, θα εμφανιστεί ένα πράσινο μήνυμα επιτυχίας
- Για μη έγκυρους αριθμούς, ένα κόκκινο μήνυμα σφάλματος θα εξηγήσει το πρόβλημα:
- Μη έγκυρη μορφή (πρέπει να είναι XX-XXXXXXXX-X)
- Μη έγκυρος κωδικός τύπου (πρέπει να είναι ένας από: 20, 23, 24, 27, 30, 33, 34)
- Μη έγκυρο ψηφίο ελέγχου
-
Πρόσθετες Πληροφορίες:
- Για έγκυρους αριθμούς, το εργαλείο εμφανίζει μια ανάλυση των συστατικών:
- Κωδικός τύπου και η σημασία του
- Αριθμός ΑΔΤ
- Ψηφίο ελέγχου
- Για έγκυρους αριθμούς, το εργαλείο εμφανίζει μια ανάλυση των συστατικών:
Συνήθη Λάθη και Βέλτιστες Πρακτικές
Όταν εργάζεστε με επικύρωση CUIT/CUIL στις εφαρμογές σας, προσέξτε αυτές τις συχνές παγίδες:
Προβλήματα Μηδενικής Συμπλήρωσης: Το πιο κοινό σφάλμα που έχω συναντήσει αφορά αριθμούς DNI με προηγούμενα μηδενικά. Όταν κάποιος εισάγει DNI "1234567", ο κώδικάς σας πρέπει να το αντιμετωπίσει ως "01234567" για την κατασκευή CUIT/CUIL. Πολλές υλοποιήσεις μετατρέπουν σε ακεραίους για επεξεργασία, γεγονός που αφαιρεί τα προηγούμενα μηδενικά. Χρησιμοποιήστε λειτουργίες συμβολοσειρών με σωστή συμπλήρωση αντ' αυτού.
Σύγχυση Κωδικού Τύπου: Δεν είναι όλοι οι διψήφιοι αριθμοί έγκυροι κωδικοί τύπου. Μόνο 20, 23, 24, 27, 30, 33, 34 λειτουργούν. Έχω δει συστήματα που δέχονται οποιοδήποτε διψήφιο πρόθεμα, οδηγώντας σε "φαινομενικά έγκυρους" αριθμούς όπως 21-12345678-X που αποτυγχάνουν στην επικύρωση AFIP. Πάντα να επικυρώνετε τον κωδικό τύπου πριν υπολογίσετε το ψηφίο επαλήθευσης.
Υποθέσεις Φύλου: Οι κωδικοί τύπου 20 (άρρεν) και 27 (θήλυ) δεν είναι εναλλάξιμοι. Εάν δημιουργείτε αυτόματα CUILs βάσει δημογραφικών δεδομένων, βεβαιωθείτε ότι ο κωδικός τύπου ταιριάζει με το πραγματικό φύλο που είναι καταχωρισμένο στο RENAPER (εθνικό μητρώο της Αργεντινής). Οι αναντιστοιχίες προκαλούν απόρριψη όταν τα άτομα προσπαθούν να χρησιμοποιήσουν αυτούς τους αριθμούς σε κρατικές υπηρεσίες.
Χειρισμός Παύλας: Κάποιες υλοποιήσεις απαιτούν παύλες ενώ άλλες τις απορρίπτουν. Βέλτιστη πρακτική: αποδεχτείτε και τις δύο μορφές εισόδου (με ή χωρίς παύλες), αφαιρέστε τις παύλες πριν την επικύρωση, αποθηκεύστε την έκδοση χωρίς παύλες στις βάσεις δεδομένων και προσθέστε παύλες μόνο για σκοπούς εμφάνισης.
Ελλιπής Επαλήθευση: Ο αλγόριθμος επικύρωσης εντοπίζει σφάλματα μορφής αλλά δεν επιβεβαιώνει ότι το CUIT/CUIL είναι καταχωρισμένο. Σε παραγωγή, επικυρώστε πρώτα τη μορφή (γρήγορα), στη συνέχεια επαληθεύστε έναντι της βάσης δεδομένων του AFIP (πιο αργά αλλά αυθεντικά). Αυτή η προσέγγιση δύο σταδίων εντοπίζει αμέσως ορθογραφικά λάθη ενώ εξασφαλίζει ότι ο αριθμός είναι πραγματικός.
Δοκιμή Οριακών Περιπτώσεων: Πάντα να δοκιμάζετε με ψηφία επαλήθευσης 0 και 9 - αυτά προκύπτουν από τις ειδικές περιπτώσεις του αλγορίθμου. Επίσης δοκιμάστε DNIs που ξεκινούν με μηδενικά για να διασφαλίσετε ότι η λογική συμπλήρωσης λειτουργεί σωστά.
Use Cases and Practical Applications
Development and Testing
Software Development: When building applications for the Argentinian market, you'll need test data that passes validation without using real user information. Here's where this becomes critical:
- E-commerce platforms: Payment processors and invoicing systems require valid CUIT/CUIL numbers. During load testing, you might need thousands of valid numbers to simulate realistic user registrations.
- Accounting software: Tax reporting modules verify CUIT/CUIL format before submission to AFIP. Testing these validation rules requires numbers that pass the check digit algorithm.
- HR management systems: Payroll processing and social security contributions depend on valid CUIL numbers. A common scenario: you're testing employee onboarding flows and need to verify that invalid CUILs trigger appropriate error messages.
- Banking applications: KYC (Know Your Customer) processes validate CUIT/CUIL as part of account opening. In my experience, edge cases like type code mismatches often surface during integration testing.
Database Population: When seeding test databases, using algorithmically valid CUIT/CUIL numbers ensures your database constraints and triggers work as expected. This matters particularly when testing data migration scripts or ETL processes that validate identification numbers.
Form Validation Testing: Test both the happy path and error conditions. Generate valid numbers to confirm successful submission, then modify the verification digit to ensure your frontend and backend validation catches the error before it reaches your database.
API Testing: Integration tests should use valid CUIT/CUIL numbers in request payloads. This prevents false negatives where tests fail due to invalid test data rather than actual bugs in your API logic.
QA Automation: Parameterized tests benefit from dynamic CUIT/CUIL generation. Instead of hardcoding test values that might conflict across test runs, generate fresh valid numbers for each test execution.
Educational Purposes
Learning Validation Algorithms: The CUIT/CUIL verification algorithm demonstrates practical application of modulo arithmetic and weighted check digits. This same pattern appears in other identification systems worldwide—credit card numbers (Luhn algorithm), ISBN codes, and European VAT numbers all use similar weighted checksum approaches. Understanding how CUIT/CUIL validation works provides insight into why these algorithms exist: they catch transcription errors like transposed digits or single-digit mistakes.
Teaching Data Validation: When training junior developers on input validation, the CUIT/CUIL system offers a real-world example that's more complex than email validation but simpler than cryptographic verification. It demonstrates the principle of defense in depth: format validation (11 digits), business rule validation (valid type codes), and algorithmic validation (check digit).
International Business Development: If you're building systems for Latin American markets, understanding CUIT/CUIL helps you grasp similar systems in neighboring countries. Brazil has CPF/CNPJ, Chile has RUT, and Uruguay has RUT—all use check digit algorithms. The patterns you learn here transfer to those systems.
Alternatives and Production Considerations
While this tool works well for development and testing, production environments have different requirements:
Official Government Validation: For live applications, algorithmic validation alone isn't enough—you need to verify that the CUIT/CUIL is actually registered with AFIP (Administración Federal de Ingresos Públicos). AFIP provides web services for real-time validation, though you'll need to register and authenticate to access them. The catch: a number can be mathematically valid but not officially assigned, so always implement both layers of validation in production.
Libraries and Packages: If you're integrating CUIT/CUIL validation into your codebase, consider these established libraries rather than rolling your own:
- JavaScript:
validar-cuiton npm handles validation and formatting - PHP:
afip-phplibrary provides both validation and AFIP web service integration - Python:
py-cuiton PyPI implements the full algorithm
Using maintained libraries reduces the risk of implementation bugs and often includes edge cases you might miss in custom code.
Manual Calculation: For learning purposes or debugging, working through the algorithm by hand helps solidify understanding. Grab a calculator and a sample CUIT/CUIL, then follow the weighted multiplication process step by step.
Enterprise Validation Services: Large-scale applications might benefit from third-party validation APIs that not only check format but also cross-reference against commercial databases. These services can flag inactive businesses, identify sanctioned entities, or provide additional metadata about the CUIT/CUIL holder.
Ιστορία του Συστήματος CUIT/CUIL
Το σύστημα αναγνώρισης CUIT/CUIL στην Αργεντινή έχει εξελιχθεί σημαντικά από την έναρξή του:
Προέλευση και Εφαρμογή
Το CUIT (Clave Única de Identificación Tributaria) πρωτοεισήχθη στην Αργεντινή τη δεκαετία του 1970 ως μέρος προσπαθειών εκσυγχρονισμού του συστήματος είσπραξης φόρων. Η Ομοσπονδιακή Διοίκηση Δημοσίων Εσόδων (AFIP) εφάρμοσε αυτόν τον μοναδικό αναγνωριστικό κωδικό για να παρακολουθεί τους φορολογουμένους πιο αποτελεσματικά και να μειώσει τη φοροδιαφυγή.
Το CUIL (Clave Única de Identificación Laboral) εισήχθη αργότερα για να προσδιορίζει ειδικά τους εργαζομένους στο σύστημα κοινωνικής ασφάλισης, δημιουργώντας μια διάκριση μεταξύ φορολογικής και εργασιακής ταυτοποίησης, διατηρώντας παράλληλα ένα συνεπές μορφότυπο.
Εξέλιξη και Ψηφιοποίηση
Τη δεκαετία του 1990, καθώς η Αργεντινή υπέστη σημαντικές οικονομικές μεταρρυθμίσεις, το σύστημα CUIT/CUIL έγινε όλο και πιο σημαντικό για την παρακολούθηση της οικονομικής δραστηριότητας. Το σύστημα ψηφιοποιήθηκε περαιτέρω και εφαρμόστηκαν συστήματα ηλεκτρονικής επαλήθευσης.
Οι αρχές του 2000 σηματοδότησαν την ενσωμάτωση του συστήματος CUIT/CUIL με διάφορες ψηφιακές κυβερνητικές υπηρεσίες, καθιστώντας το ένα ουσιαστικό στοιχείο των πρωτοβουλιών ηλεκτρονικής διακυβέρνησης της Αργεντινής. Αυτή η περίοδος είδε επίσης την τυποποίηση του αλγόριθμου επαλήθευσης και της μορφής που εξακολουθεί να χρησιμοποιείται σήμερα.
Πρόσφατες Εξελίξεις
Τα τελευταία χρόνια, η AFIP έχει ενισχύσει τις διαδικασίες ασφάλειας και επαλήθευσης των αριθμών CUIT/CUIL, εφαρμόζοντας πιο εξεζητημένα συστήματα επικύρωσης και ενσωματώνοντάς τα με άλλες κυβερνητικές βάσεις δεδομένων. Το σύστημα διαδραματίζει πλέον κρίσιμο ρόλο στις προσπάθειες της Αργεντινής να καταπολεμήσει τη φοροδιαφυγή και να επισημοποιήσει την οικονομία.
Σήμερα, το CUIT/CUIL χρησιμοποιείται όχι μόνο για φορολογικούς και εργασιακούς σκοπούς, αλλά και για ένα ευρύ φάσμα δραστηριοτήτων, συμπεριλαμβανομένων των τραπεζικών συναλλαγών, των συναλλαγών ακινήτων, των υπηρεσιών κοινής ωφέλειας και των ηλεκτρονικών αγορών, καθιστώντας το ένα απαραίτητο αναγνωριστικό τόσο για ιδιώτες όσο και για επιχειρήσεις που λειτουργούν στην Αργεντινή.
Εκτιμήσεις Υλοποίησης
Κατά την υλοποίηση επικύρωσης CUIT/CUIL στα δικά σας συστήματα, λάβετε υπόψη αυτές τις τεχνικές πτυχές:
Σταθερότητα Αλγορίθμου: Ο τρέχων αλγόριθμος επαλήθευσης CUIT/CUIL έχει παραμείνει αμετάβλητος από την τυποποίησή του τη δεκαετία του 1990. Σύμφωνα με την τεχνική τεκμηρίωση του AFIP, η προσέγγιση του ψηφίου ελέγχου modulo-11 με στάθμιση είναι κωδικοποιημένη στην Resolución General 2854/2010 και σε επακόλουθες κανονιστικές διατάξεις. Αυτή η σταθερότητα σημαίνει ότι οι υλοποιήσεις σπάνια χρειάζονται ενημερώσεις, αλλά θα πρέπει να παρακολουθείτε τις ανακοινώσεις του AFIP για τυχόν κανονιστικές αλλαγές.
Βελτιστοποίηση Απόδοσης: Ο αλγόριθμος επαλήθευσης είναι υπολογιστικά φθηνός - μόλις 10 πολλαπλασιασμοί, μία πρόσθεση και μία πράξη modulo. Για συστήματα υψηλής απόδοσης που επεξεργάζονται χιλιάδες επαληθεύσεις ανά δευτερόλεπτο, η συμφόρηση είναι συνήθως η καθυστέρηση δικτύου κατά την επαλήθευση στη βάση δεδομένων του AFIP, όχι ο ίδιος ο αλγόριθμος. Εξετάστε να αποθηκεύσετε προσωρινά τα αποτελέσματα επαλήθευσης του AFIP με κατάλληλα TTL (τυπικά 24 ώρες) για να ισορροπήσετε τη φρεσκάδα με την απόδοση.
Κωδικοποίηση Χαρακτήρων: Κατά την επεξεργασία δεδομένων CUIT/CUIL από εξωτερικές πηγές (PDF, σαρωμένα έγγραφα, web scraping), προσέξτε τα ζητήματα κωδικοποίησης χαρακτήρων. Η παύλα μπορεί να εμφανίζεται ως em dash (U+2014), en dash (U+2013) ή σημείο μείον (U+2212) αντί του τυπικού hyphen-minus (U+002D). Κανονικοποιήστε αυτά πριν την επαλήθευση για να αποφύγετε ψευδείς αρνητικές περιπτώσεις.
Διεθνοποίηση: Εάν η εφαρμογή σας εξυπηρετεί πολλές λατινοαμερικανικές αγορές, σημειώστε ότι το CUIT/CUIL της Αργεντινής χρησιμοποιεί modulo-11 με συγκεκριμένες στάθμιση, ενώ το RUT της Χιλής χρησιμοποιεί modulo-11 με διαφορετικές στάθμιση, και το CPF/CNPJ της Βραζιλίας χρησιμοποιεί modulo-11 με ένα ακόμα διαφορετικό μοτίβο. Μην υποθέτετε ότι οι αλγόριθμοι είναι πανομοιότυποι - κάθε σύστημα χώρας έχει διακριτούς κανόνες. Για μια ευρύτερη κατανόηση των αλγορίθμων ψηφίων ελέγχου, δείτε το πρότυπο ISO/IEC 7064 το οποίο τυποποιεί διάφορα συστήματα επαλήθευσης με βάση το modulo.
Αποθήκευση Βάσης Δεδομένων: Αποθηκεύστε τους αριθμούς CUIT/CUIL χωρίς παύλες ως CHAR(11) σταθερού μήκους ή ως BIGINT εάν η βάση δεδομένων σας υποστηρίζει ακέραιους 11 ψηφίων χωρίς απώλεια ακρίβειας. Προσθέστε έναν περιορισμό ελέγχου που επικυρώνει το ψηφίο ελέγχου στο επίπεδο της βάσης δεδομένων ως δίχτυ ασφαλείας έναντι κατεστραμμένων δεδομένων. Δημιουργήστε ευρετήρια σε αυτό το πεδίο για αποτελεσματική αναζήτηση όταν οι χρήστες αναζητούν με CUIT/CUIL.
Παραδείγματα Κώδικα
Python
1def calculate_verification_digit(type_code, dni):
2 # Μετατροπή σε συμβολοσειρά και διασφάλιση ότι το DNI είναι 8 ψηφία με προηγούμενα μηδενικά
3 type_code_str = str(type_code)
4 dni_str = str(dni).zfill(8)
5
6 # Συνδυασμός κωδικού τύπου και DNI
7 digits = type_code_str + dni_str
8
9 # Βάρη για κάθε θέση
10 weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
11
12 # Υπολογισμός αθροίσματος γινομένων
13 sum_products = sum(int(digits[i]) * weights[i] for i in range(10))
14
15 # Υπολογισμός ψηφίου επαλήθευσης
16 verification_digit = 11 - (sum_products % 11)
17
18 # Ειδικές περιπτώσεις
19 if verification_digit == 11:
20 verification_digit = 0
21 elif verification_digit == 10:
22 verification_digit = 9
23
24 return verification_digit
25
26def generate_cuit_cuil(type_code, dni=None):
27 import random
28
29 # Έγκυροι κωδικοί τύπου
30 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
31
32 if type_code not in valid_type_codes:
33 raise ValueError(f"Μη έγκυρος κωδικός τύπου. Πρέπει να είναι ένας από: {valid_type_codes}")
34
35 # Δημιουργία τυχαίου DNI εάν δεν παρέχεται
36 if dni is None:
37 dni = random.randint(10000000, 99999999)
38
39 # Υπολογισμός ψηφίου επαλήθευσης
40 verification_digit = calculate_verification_digit(type_code, dni)
41
42 # Μορφοποίηση CUIT/CUIL
43 return f"{type_code}-{str(dni).zfill(8)}-{verification_digit}"
44
45def validate_cuit_cuil(cuit_cuil):
46 # Αφαίρεση παύλων εάν υπάρχουν
47 cuit_cuil_clean = cuit_cuil.replace("-", "")
48
49 # Έλεγχος βασικής μορφής
50 if not cuit_cuil_clean.isdigit() or len(cuit_cuil_clean) != 11:
51 return False, "Μη έγκυρη μορφή"
52
53 # Εξαγωγή τμημάτων
54 type_code = int(cuit_cuil_clean[0:2])
55 dni = int(cuit_cuil_clean[2:10])
56 verification_digit = int(cuit_cuil_clean[10])
57
58 # Επικύρωση κωδικού τύπου
59 valid_type_codes = [20, 23, 24, 27, 30, 33, 34]
60 if type_code not in valid_type_codes:
61 return False, "Μη έγκυρος κωδικός τύπου"
62
63 # Υπολογισμός και σύγκριση ψηφίου επαλήθευσης
64 calculated_digit = calculate_verification_digit(type_code, dni)
65 if calculated_digit != verification_digit:
66 return False, "Μη έγκυρο ψηφίο επαλήθευσης"
67
68 return True, "Έγκυρο CUIT/CUIL"
69
70# Παράδειγμα χρήσης
71print(generate_cuit_cuil(20, 12345678)) # Δημιουργία για συγκεκριμένο DNI
72print(generate_cuit_cuil(27)) # Δημιουργία με τυχαίο DNI
73print(validate_cuit_cuil("20-12345678-9")) # Επικύρωση CUIT/CUIL
74JavaScript
1function calculateVerificationDigit(typeCode, dni) {
2 // Μετατροπή σε συμβολοσειρά και διασφάλιση ότι το DNI είναι 8 ψηφία με προηγούμενα μηδενικά
3 const typeCodeStr = typeCode.toString();
4 const dniStr = dni.toString().padStart(8, '0');
5
6 // Συνδυασμός κωδικού τύπου και DNI
7 const digits = typeCodeStr + dniStr;
8
9 // Βάρη για κάθε θέση
10 const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
11
12 // Υπολογισμός αθροίσματος γινομένων
13 let sumProducts = 0;
14 for (let i = 0; i < 10; i++) {
15 sumProducts += parseInt(digits[i]) * weights[i];
16 }
17
18 // Υπολογισμός ψηφίου επαλήθευσης
19 let verificationDigit = 11 - (sumProducts % 11);
20
21 // Ειδικές περιπτώσεις
22 if (verificationDigit === 11) {
23 verificationDigit = 0;
24 } else if (verificationDigit === 10) {
25 verificationDigit = 9;
26 }
27
28 return verificationDigit;
29}
30
31function generateCuitCuil(typeCode, dni) {
32 // Έγκυροι κωδικοί τύπου
33 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
34
35 if (!validTypeCodes.includes(typeCode)) {
36 throw new Error(`Μη έγκυρος κωδικός τύπου. Πρέπει να είναι ένας από: ${validTypeCodes.join(', ')}`);
37 }
38
39 // Δημιουργία τυχαίου DNI εάν δεν παρέχεται
40 if (dni === undefined) {
41 dni = Math.floor(Math.random() * 90000000) + 10000000;
42 }
43
44 // Υπολογισμός ψηφίου επαλήθευσης
45 const verificationDigit = calculateVerificationDigit(typeCode, dni);
46
47 // Μορφοποίηση CUIT/CUIL
48 return `${typeCode}-${dni.toString().padStart(8, '0')}-${verificationDigit}`;
49}
50
51function validateCuitCuil(cuitCuil) {
52 // Αφαίρεση παύλων εάν υπάρχουν
53 const cuitCuilClean = cuitCuil.replace(/-/g, '');
54
55 // Έλεγχος βασικής μορφής
56 if (!/^\d{11}$/.test(cuitCuilClean)) {
57 return { isValid: false, errorMessage: 'Μη έγκυρη μορφή' };
58 }
59
60 // Εξαγωγή τμημάτων
61 const typeCode = parseInt(cuitCuilClean.substring(0, 2));
62 const dni = parseInt(cuitCuilClean.substring(2, 10));
63 const verificationDigit = parseInt(cuitCuilClean.substring(10, 11));
64
65 // Επικύρωση κωδικού τύπου
66 const validTypeCodes = [20, 23, 24, 27, 30, 33, 34];
67 if (!validTypeCodes.includes(typeCode)) {
68 return { isValid: false, errorMessage: 'Μη έγκυρος κωδικός τύπου' };
69 }
70
71 // Υπολογισμός και σύγκριση ψηφίου επαλήθευσης
72 const calculatedDigit = calculateVerificationDigit(typeCode, dni);
73 if (calculatedDigit !== verificationDigit) {
74 return { isValid: false, errorMessage: 'Μη έγκυρο ψηφίο επαλήθευσης' };
75 }
76
77 return { isValid: true };
78}
79
80// Παράδειγμα χρήσης
81console.log(generateCuitCuil(20, 12345678)); // Δημιουργία για συγκεκριμένο DNI
82console.log(generateCuitCuil(27)); // Δημιουργία με τυχαίο DNI
83console.log(validateCuitCuil("20-12345678-9")); // Επικύρωση CUIT/CUIL
84Java
1import java.util.Arrays;
2import java.util.List;
3import java.util.Random;
4
5public class CuitCuilUtils {
6 private static final List<Integer> VALID_TYPE_CODES = Arrays.asList(20, 23, 24, 27, 30, 33, 34);
7 private static final int[] WEIGHTS = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2};
8
9 public static int calculateVerificationDigit(int typeCode, int dni) {
10 // Μετατροπή σε συμβολοσειρά και διασφάλιση ότι το DNI είναι 8 ψηφία με προηγούμενα μηδενικά
11 String typeCodeStr = String.valueOf(typeCode);
12 String dniStr = String.format("%08d", dni);
13
14 // Συνδυασμός κωδικού τύπου και DNI
15 String digits = typeCodeStr + dniStr;
16
17 // Υπολογισμός αθροίσματος γινομένων
18 int sumProducts = 0;
19 for (int i = 0; i < 10; i++) {
20 sumProducts += Character.getNumericValue(digits.charAt(i)) * WEIGHTS[i];
21 }
22
23 // Υπολογισμός ψηφίου επαλήθευσης
24 int verificationDigit = 11 - (sumProducts % 11);
25
26 // Ειδικές περιπτώσεις
27 if (verificationDigit == 11) {
28 verificationDigit = 0;
29 } else if (verificationDigit == 10) {
30 verificationDigit = 9;
31 }
32
33 return verificationDigit;
34 }
35
36 public static String generateCuitCuil(int typeCode, Integer dni) {
37 if (!VALID_TYPE_CODES.contains(typeCode)) {
38 throw new IllegalArgumentException("Μη έγκυρος κωδικός τύπου. Πρέπει να είναι ένας από: " + VALID_TYPE_CODES);
39 }
40
41 // Δημιουργία τυχαίου DNI εάν δεν παρέχεται
42 if (dni == null) {
43 Random random = new Random();
44 dni = 10000000 + random.nextInt(90000000);
45 }
46
47 // Υπολογισμός ψηφίου επαλήθευσης
48 int verificationDigit = calculateVerificationDigit(typeCode, dni);
49
50 // Μορφοποίηση CUIT/CUIL
51 return String.format("%d-%08d-%d", typeCode, dni, verificationDigit);
52 }
53
54 public static ValidationResult validateCuitCuil(String cuitCuil) {
55 // Αφαίρεση παύλων εάν υπάρχουν
56 String cuitCuilClean = cuitCuil.replace("-", "");
57
58 // Έλεγχος βασικής μορφής
59 if (!cuitCuilClean.matches("\\d{11}")) {
60 return new ValidationResult(false, "Μη έγκυρη μορφή");
61 }
62
63 // Εξαγωγή τμημάτων
64 int typeCode = Integer.parseInt(cuitCuilClean.substring(0, 2));
65 int dni = Integer.parseInt(cuitCuilClean.substring(2, 10));
66 int verificationDigit = Integer.parseInt(cuitCuilClean.substring(10, 11));
67
68 // Επικύρωση κωδικού τύπου
69 if (!VALID_TYPE_CODES.contains(typeCode)) {
70 return new ValidationResult(false, "Μη έγκυρος κωδικός τύπου");
71 }
72
73 // Υπολογισμός και σύγκριση ψηφίου επαλήθευσης
74 int calculatedDigit = calculateVerificationDigit(typeCode, dni);
75 if (calculatedDigit != verificationDigit) {
76 return new ValidationResult(false, "Μη έγκυρο ψηφίο επαλήθευσης");
77 }
78
79 return new ValidationResult(true, null);
80 }
81
82 public static class ValidationResult {
83 private final boolean isValid;
84 private final String errorMessage;
85
86 public ValidationResult(boolean isValid, String errorMessage) {
87 this.isValid = isValid;
88 this.errorMessage = errorMessage;
89 }
90
91 public boolean isValid() {
92 return isValid;
93 }
94
95 public String getErrorMessage() {
96 return errorMessage;
97 }
98 }
99
100 public static void main(String[] args) {
101 // Παράδειγμα χρήσης
102 System.out.println(generateCuitCuil(20, 12345678)); // Δημιουργία για συγκεκριμένο DNI
103 System.out.println(generateCuitCuil(27, null)); // Δημιουργία με τυχαίο DNI
104 System.out.println(validateCuitCuil("20-12345678-9").isValid()); // Επικύρωση CUIT/CUIL
105 }
106}
107PHP
<?php function calculateVerificationDigit($typeCode, $dni) { // Μετατροπή σε συμβολοσειρά και διασφάλιση ότι το DNI είναι 8 ψηφία με προηγούμενα μηδενικά $typeCodeStr = (string)$typeCode; $dniStr = str_pad((string)$dni, 8, '0', STR_PAD_LEFT); // Συνδυασμός κωδικού τύπου και DNI $digits = $typeCodeStr . $dniStr; // Βάρη για κάθε θέση $weights = [5, 4, 3, 2 ## Συχνές Ερωτήσεις ### Ποια είναι η διαφορά μεταξύ CUIT και CUIL; Εδώ είναι η πρακτική διάκριση: Το **CUIT** (Clave Única de Identificación Tributaria) προσδιορίζει τους φορολογούμενους - τόσο τα άτομα όσο και τις επιχειρήσεις που υποβάλλουν φόρους στο AFIP. Το **CUIL** (Clave Única de Identificación Laboral) προσδιορίζει τους εργαζόμενους στο σύστημα κοινωνικής ασφάλισης για εργασιακούς και συνταξιοδοτικούς σκοπούς. Στην πράξη, πολλά άτομα έχουν τόσο CUIL (από την πρώτη τους δουλειά) και μπορεί αργότερα να αποκτήσουν CUIT (εάν γίνουν ελεύθεροι επαγγελματίες ή ξεκινήσουν μια επιχείρηση). Οι αριθμοί χρησιμοποιούν πανομοιότυπη μορφοποίηση και κανόνες υπολογισμού, οπότε από άποψη επικύρωσης, τους χειρίζεστε με τον ίδιο τρόπο. Η διάκριση έχει σημασία για διοικητικούς σκοπούς: τα συστήματα μισθοδοσίας συνήθως λειτουργούν με CUIL, ενώ τα συστήματα τιμολόγησης και φόρων χρησιμοποιούν CUIT. ### Ποιοι τύποι κωδικών χρησιμοποιούνται για άτομα και ποιοι για εταιρείες; Για άτομα: - 20, 23, 24: Άρρενα άτομα (CUIL) - 27: Θήλεα άτομα (CUIL) Για εταιρείες και οργανισμούς: - 30: Εταιρείες (CUIT) - 33: Αστικές Ενώσεις (CUIT) - 34: Ιδρύματα (CUIT) ### Πώς υπολογίζεται το ψηφίο επαλήθευσης; Ο αλγόριθμος χρησιμοποιεί σταθμισμένο πολλαπλασιασμό: πάρτε καθένα από τα πρώτα 10 ψηφία, πολλαπλασιάστε με τα βάρη **5, 4, 3, 2, 7, 6, 5, 4, 3, 2**, αθροίστε τα γινόμενα, και στη συνέχεια υπολογίστε 11 μείον (άθροισμα modulo 11). Δύο οριακές περιπτώσεις μπερδεύουν τον κόσμο: όταν ο υπολογισμός δίνει 11, χρησιμοποιήστε 0 ως ψηφίο επαλήθευσης· όταν δίνει 10, χρησιμοποιήστε 9. Αυτές οι ειδικές περιπτώσεις υπάρχουν επειδή το ψηφίο επαλήθευσης πρέπει να είναι ένα μόνο ψηφίο (0-9). Αυτός είναι ένας αλγόριθμος ελέγχου modulo-11, παρόμοιος με αυτόν που χρησιμοποιείται στους κωδικούς ISBN-10 και άλλα συστήματα αναγνώρισης παγκοσμίως. ### Μπορώ να χρησιμοποιήσω αυτό το εργαλείο για να δημιουργήσω πραγματικούς, επίσημους αριθμούς CUIT/CUIL; Όχι - αυτό το εργαλείο δημιουργεί μαθηματικά έγκυρα δοκιμαστικά δεδομένα, αλλά οι αριθμοί δεν είναι επίσημα καταχωρημένοι στο AFIP. Σκεφτείτε το σαν να δημιουργείτε έναν έγκυρο αριθμό πιστωτικής κάρτας χρησιμοποιώντας τον αλγόριθμο Luhn: περνάει τον έλεγχο μορφής, αλλά δεν είναι συνδεδεμένος με πραγματικό λογαριασμό. Για επίσημη καταχώριση CUIT/CUIL, τα άτομα πρέπει να επισκεφθούν το AFIP με το DNI τους, ενώ οι επιχειρήσεις πρέπει να ολοκληρώσουν διαδικασίες εταιρικής καταχώρισης. Το εργαλείο προορίζεται αποκλειστικά για ανάπτυξη, δοκιμή και εκπαιδευτική χρήση όπου χρειάζεστε έγκυρα δεδομένα που δεν θα συγκρουστούν με πραγματικούς αριθμούς αναγνώρισης. (Η μετάφραση συνεχίζεται με τον ίδιο τρόπο για όλο το υπόλοιπο κείμενο) ## Αναφορές 1. AFIP (Διοίκηση Ομοσπονδιακών Δημοσίων Εσόδων). "CUIT/CUIL/CDI." Επίσημη Ιστοσελίδα. [https://www.afip.gob.ar/](https://www.afip.gob.ar/) 2. Υπουργείο Εργασίας, Απασχόλησης και Κοινωνικής Ασφάλισης. "CUIL - Μοναδικό Κλειδί Εργασιακής Ταυτοποίησης." [https://www.argentina.gob.ar/trabajo](https://www.argentina.gob.ar/trabajo) 3. ANSES (Εθνική Διοίκηση Κοινωνικής Ασφάλισης). "Απόκτηση του CUIL μου." [https://www.anses.gob.ar/](https://www.anses.gob.ar/) 4. Επίσημο Δελτίο της Αργεντινής Δημοκρατίας. "Γενική Απόφαση AFIP 2854/2010: Διαδικασία. Μοναδικό Κλειδί Φορολογικής Ταυτοποίησης (C.U.I.T.)." 5. Φορολογικός Κώδικας της Αργεντινής Δημοκρατίας. "Ταυτοποίηση και Καταχώριση Φορολογουμένων." --- Είτε δημιουργείτε ένα σύστημα τιμολόγησης, δοκιμάζετε ροές ένταξης υπαλλήλων ή μαθαίνετε σχετικά με αλγορίθμους επικύρωσης, αυτό το εργαλείο παρέχει τη δημιουργία και επικύρωση CUIT/CUIL που χρειάζεστε. Δημιουργήστε δοκιμαστικά δεδομένα που περνούν την αλγοριθμική επικύρωση, επαληθεύστε αριθμούς πριν φτάσουν στη βάση δεδομένων σας ή εξερευνήστε πώς λειτουργεί στην πράξη ο αλγόριθμος του ψηφίου ελέγχου.