Italian Codes Extension

italian_codes is a PostgreSQL extension containing validation domains for Italian fiscal codes.

It can currently validate Codice Fiscale (Italian Fiscal Code) for both physical person (16 characters) and juridical person (11 digits) and Partita IVA (Italian VAT Number).

The extension contains only data type and functions to validate the codes and it doesn't contain algorithms to generate the codes from the person's data: the practice of generating a Fiscal Code is fundamentally flawed as it doesn't account for omocodia (people whose Fiscal Code would match). In such case, the Agenzia delle Entrate (Revenue Service) provides an alternative code for either person. The only valid Fiscal Code is the one provided from the Revenue Service, and each program trying to calculate it, or worse, enforce it after its calculation, is doing wrong.

All the error messages generated by the validation functions are in Italian.

Domains

The domains are based on the text data type and ensure only valid codes are stored. Provided domains are:

  • codice_fiscale: a valid Italian Fiscal Code, either 16 or 11 characters long;
  • partita_iva: a valid Italian VAT Number.

Functions

Available functions are:

codice_fiscale(s text) -> codice_fiscale

Normalize the input string s and return it cast to a Codice Fiscale. If the string is not a valid code, raise a check_violation error.

Example:

=# select codice_fiscale('mss trs 53b19 h892p'::text);
MSSTRS53B19H892P

Note that the function doesn't work as expected on a "naked" literal, as the parser prefers to interpret the expression codice_fiscale('X') as the typed literal 'X'::codice_fiscale, bypassing the normalization. If the function argument is an expression, such as the name of the field or a typed string as above, the function works as expected.

codice_fiscale_normalize(s text) -> text
Return a normalized version of the input string s. The normalized output is uppercase and has all the whitespaces stripped. No check is performed on the content of the string.
codice_fiscale_error(s text) -> text
Return NULL if the input string s contains a valid Codice Fiscale, otherwise return a string with an informative error message. s must be already normalized.
partita_iva(s text) -> partita_iva

Normalize the input string s and return it cast to a Partita IVA. If the string is not a valid code, raise a check_violation error.

Example:

=# select partita_iva('0575346 048 3'::text);
05753460483

Note that the function doesn't work as expected on a "naked" literal, see the codice_fiscale() function.

partita_iva_normalize(s text) -> text
Returns a normalized version of the input string s. The normalized output has all the whitespaces stripped. No check is performed on the content of the string.
partita_iva_error(s text) -> text
Return NULL if the input string s contains a valid Partita IVA; otherwise return a string with an informative error message. s must be already normalized.