Python library for validating Italian Codice Fiscale and Partita IVA
Project description
Italian Tax Validators
A comprehensive Python library for validating Italian fiscal identification documents:
- Codice Fiscale (CF): Italian personal tax identification code
- Partita IVA (P.IVA): Italian VAT registration number
Features
✅ Codice Fiscale Validation
- Format validation
- Omocodia handling (substitution of digits with letters)
- Check digit verification
- Birthdate extraction from CF
- Age calculation
- Minimum age verification (18+ by default)
✅ Partita IVA Validation
- Format validation
- Check digit verification using Italian Luhn algorithm variant
- Flexible input handling (spaces, prefixes)
✅ Easy to Use
- Simple, intuitive API
- Detailed validation results with error codes
- Type hints for better IDE support
- Zero external dependencies
Installation
pip install italian-tax-validators
Quick Start
Validating Codice Fiscale
from italian_tax_validators import validate_codice_fiscale
# Basic validation
result = validate_codice_fiscale("RSSMRA85M01H501Q")
print(result.is_valid) # True
print(result.birthdate) # 1985-08-01
print(result.age) # 39 (or current age)
# With age verification
result = validate_codice_fiscale("RSSMRA85M01H501Q", check_adult=True)
print(result.is_valid) # True (person is 18+)
# With custom minimum age
result = validate_codice_fiscale("RSSMRA85M01H501Q", check_adult=True, minimum_age=21)
print(result.is_valid) # True (person is 21+)
Validating Partita IVA
from italian_tax_validators import validate_partita_iva
# Basic validation
result = validate_partita_iva("12345678903")
print(result.is_valid) # True
print(result.formatted_value) # "12345678903"
# Flexible input handling
result = validate_partita_iva("123 456 78903") # Works with spaces
result = validate_partita_iva("IT12345678903") # Works with IT prefix
API Reference
Codice Fiscale
Function: validate_codice_fiscale()
def validate_codice_fiscale(
value: str,
check_adult: bool = False,
minimum_age: int = 18,
) -> CodiceFiscaleValidationResult
Parameters:
value(str): The CF string to validatecheck_adult(bool): Whether to verify minimum age requirement (default: False)minimum_age(int): Minimum age required in years (default: 18)
Returns: CodiceFiscaleValidationResult with:
is_valid(bool): Whether the CF is validerror_code(str | None): Error code if invalidformatted_value(str): Cleaned/formatted CF valuebirthdate(date | None): Extracted birthdateage(int | None): Calculated age in years
Error Codes:
tax_id_cf_invalid_format: Invalid format or check digittax_id_cf_cannot_decode_birthdate: Cannot extract birthdatetax_id_cf_underage: Person is younger than minimum age requirement
Class: CodiceFiscaleValidator
For advanced usage, create a validator instance:
from italian_tax_validators import CodiceFiscaleValidator
validator = CodiceFiscaleValidator()
result = validator.validate("RSSMRA85M01H501Q")
Partita IVA
Function: validate_partita_iva()
def validate_partita_iva(value: str) -> PartitaIvaValidationResult
Parameters:
value(str): The P.IVA string to validate
Returns: PartitaIvaValidationResult with:
is_valid(bool): Whether the P.IVA is validerror_code(str | None): Error code if invalidformatted_value(str): Cleaned/formatted P.IVA value
Error Codes:
tax_id_piva_invalid_length: Not exactly 11 digitstax_id_piva_invalid_check_digit: Check digit verification failed
Class: PartitaIvaValidator
For advanced usage:
from italian_tax_validators import PartitaIvaValidator
validator = PartitaIvaValidator()
result = validator.validate("12345678903")
Codice Fiscale Structure
The Italian Codice Fiscale is a 16-character alphanumeric code:
RSSMRA85M01H501Q
├─ RSS → Surname (first 3 consonants)
├─ MRA → Name (first 3 consonants)
├─ 85 → Birth year (1985)
├─ M → Birth month (M = August)
├─ 01 → Birth day (01), or +40 for females
├─ H501 → Birth place code
└─ Q → Check digit
Month Codes
- A=January, B=February, C=March, D=April, E=May, H=June
- L=July, M=August, P=September, R=October, S=November, T=December
Omocodia
When multiple people share the same CF, digits can be replaced with letters:
- L=0, M=1, N=2, P=3, Q=4, R=5, S=6, T=7, U=8, V=9
The validator automatically handles these substitutions.
Partita IVA Structure
The Italian Partita IVA is an 11-digit number:
12345678903
├─ 1234567 → Company registration number
├─ 890 → Provincial office code
└─ 3 → Check digit (Luhn algorithm variant)
Testing
Run tests with pytest:
pytest tests/
Or with unittest:
python -m unittest discover tests/
Examples
Example 1: Processing a list of tax IDs
from italian_tax_validators import validate_codice_fiscale, validate_partita_iva
# Validate multiple CFs
cfs = [
"RSSMRA85M01H501Q",
"BNCRSU90A01H501A",
"invalid_cf_code"
]
for cf in cfs:
result = validate_codice_fiscale(cf)
if result.is_valid:
print(f"✓ {cf} - Born: {result.birthdate}, Age: {result.age}")
else:
print(f"✗ {cf} - Error: {result.error_code}")
# Validate P.IVA numbers
pivas = ["12345678903", "IT12345678903", "invalid"]
for piva in pivas:
result = validate_partita_iva(piva)
print(f"{'✓' if result.is_valid else '✗'} {piva}")
Example 2: Django integration
from django.db import models
from italian_tax_validators import validate_codice_fiscale
class Person(models.Model):
codice_fiscale = models.CharField(
max_length=16,
validators=[
lambda x: validate_codice_fiscale(x, check_adult=True) or None
]
)
Example 3: Form validation with Pydantic
from pydantic import BaseModel, field_validator
from italian_tax_validators import validate_codice_fiscale
class PersonForm(BaseModel):
codice_fiscale: str
@field_validator('codice_fiscale')
@classmethod
def validate_cf(cls, v):
result = validate_codice_fiscale(v, check_adult=True)
if not result.is_valid:
raise ValueError(f"Invalid Codice Fiscale: {result.error_code}")
return v
License
MIT License - See LICENSE file for details
Contributing
Contributions are welcome! Please feel free to submit pull requests or open issues on GitHub.
Disclaimer
This library provides validation utilities for Italian tax identification documents. Always verify the results with official sources and compliance requirements.
Resources
- Agenzia delle Entrate - Official Italian Tax Agency
- Codice Fiscale Format - Wikipedia
- Partita IVA Format - Wikipedia
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file italian_tax_validators-1.0.1.tar.gz.
File metadata
- Download URL: italian_tax_validators-1.0.1.tar.gz
- Upload date:
- Size: 12.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5224cb211f273f57ac889cf1fd61ab9e50fca86e87829a25466cd2a189770a0e
|
|
| MD5 |
31db0fdf71add5654099f6caf5672028
|
|
| BLAKE2b-256 |
d1eea2742c7f2e227fbc9c7d1cc9cee2ef9ea6a0317797353faf1eee5e4cfd24
|
Provenance
The following attestation bundles were made for italian_tax_validators-1.0.1.tar.gz:
Publisher:
publish-to-pypi.yml on thesmokinator/italian-tax-validators
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
italian_tax_validators-1.0.1.tar.gz -
Subject digest:
5224cb211f273f57ac889cf1fd61ab9e50fca86e87829a25466cd2a189770a0e - Sigstore transparency entry: 757821814
- Sigstore integration time:
-
Permalink:
thesmokinator/italian-tax-validators@bfcc08210b7295c51cd603ada2a021ac8f469567 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/thesmokinator
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@bfcc08210b7295c51cd603ada2a021ac8f469567 -
Trigger Event:
push
-
Statement type:
File details
Details for the file italian_tax_validators-1.0.1-py3-none-any.whl.
File metadata
- Download URL: italian_tax_validators-1.0.1-py3-none-any.whl
- Upload date:
- Size: 9.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25388b0b40350c4d672e520a849bd241e186252a5c7620a903285ca4338edb07
|
|
| MD5 |
6ddf889d2e2f300862ecd179c6b8e2d1
|
|
| BLAKE2b-256 |
bc3595983c52b69364cc02d6adf7bdecd28e5f6c3d07431292d784c815abdfb8
|
Provenance
The following attestation bundles were made for italian_tax_validators-1.0.1-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on thesmokinator/italian-tax-validators
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
italian_tax_validators-1.0.1-py3-none-any.whl -
Subject digest:
25388b0b40350c4d672e520a849bd241e186252a5c7620a903285ca4338edb07 - Sigstore transparency entry: 757821823
- Sigstore integration time:
-
Permalink:
thesmokinator/italian-tax-validators@bfcc08210b7295c51cd603ada2a021ac8f469567 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/thesmokinator
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@bfcc08210b7295c51cd603ada2a021ac8f469567 -
Trigger Event:
push
-
Statement type: