npm package: @marketto/codice-fiscale-utils
Description: TS & JS utilities to handle Italian Codice Fiscale
Author: Marco Ricupero
Latest version: 3.1.3

# codice-fiscale-utils

**_The Final and definitive solution to handle the Italian Tax Code_**

[![NPM Version](https://img.shields.io/npm/v/@marketto/codice-fiscale-utils.svg)](https://www.npmjs.com/package/@marketto/codice-fiscale-utils)
[![NPM Downloads](https://img.shields.io/npm/dm/@marketto/codice-fiscale-utils.svg)](https://www.npmjs.com/package/@marketto/codice-fiscale-utils)
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FMarketto%2Fcodice-fiscale-utils.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2FMarketto%2Fcodice-fiscale-utils?ref=badge_shield)
[![LICENSE](https://img.shields.io/badge/licese-MIT-gold.svg)](https://github.com/Marketto/codice-fiscale-utils/blob/master/LICENSE)
[![Blog](https://img.shields.io/badge/blog-marketto-blue.svg)](http://blog.marketto.it)
[![Buy me a coffee](https://img.shields.io/badge/Ko--fi-donate-blueviolet)](https://ko-fi.com/marketto)

TS utilities to handle Italian Codice Fiscale

## 📗 FAQs?

1. **Why should I need a library? Can't I use just a RegExp?**
   _A RegExp would just check the form of a CodiceFiscale, not coherence between birth date and place, not validity of 16th check digit char_

2. **What about the omocodes (Omocodia/Omocodice) problem, does it work?**
   _Absolutely! There's a dedicated class to encode or decode such kind of CodiceFiscale and it's properly integrated in_ [**_Parser_**](#parser), [**_Validator_**](#validator) and [**_Pattern_**](#pattern) _methods_

3. **Can I use this library in a FE project with other frameworks?**
   _Sure, it's built to work both in node and browser environments! Give a look at the [Demo section](#demo)_

## 📙 [CHANGELOG](CHANGELOG.MD)

## 🚃 [ROADMAP](ROADMAP.MD)

## 🖇️ BELFIORE CONNECTOR

Please note that a **BelfioreConnector** is required, download one of the following:

- [**@marketto/belfiore-connector-embedded**](https://www.npmjs.com/package/@marketto/belfiore-connector-embedded): Belfiore Connector with embedded dataset (v2 behavior)
- [**@marketto/belfiore-connector-json**](https://www.npmjs.com/package/@marketto/belfiore-connector-json): Belfiore Connector which load a static place list or call an sync function to retrieve the place list

### 🖋️ WRITE YOUR OWN CONNECTOR

[**@marketto/belfiore-connector**](https://www.npmjs.com/package/@marketto/belfiore-connector): Abstract class & interfaces to write your own connector

## 🔌 INSTALLATION

### NPM

```{r, engine='bash', global_install}
npm i -s @marketto/codice-fiscale-utils
```

### Script

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://unpkg.com/@marketto/diacritic-remover/dist/diacritic-remover.bundle.min.js"></script>
<script src="https://unpkg.com/@marketto/codice-fiscale-utils/dist/codice-fiscale-utils.bundle.min.js"></script>
```

## 🔧 USAGE

### CJS

```javascript
const CodiceFiscaleUtils = require("@marketto/codice-fiscale-utils");
const codiceFiscaleUtils = new CodiceFiscaleUtils(belfioreConnector);
```

### MJS & TypeScript

```typescript
import { CodiceFiscaleUtils } from "@marketto/codice-fiscale-utils";
const codiceFiscaleUtils = new CodiceFiscaleUtils(belfioreConnector);
```

## 📖 [DOCUMENTATION](https://marketto.github.io/codice-fiscale-utils/)

### CodiceFiscaleUtils.parser

<details>
    <summary>Show code examples</summary>

#### CodiceFiscaleUtils.parser.cfDeomocode

```javascript
codiceFiscaleUtils.parser.cfDeomocode("KKALMNVMAPLB331Z"); //KKALMN91A30B331P
codiceFiscaleUtils.parser.cfDeomocode("kkalmnvmaplb331z"); //kkalmn91a30b331p
```

#### CodiceFiscaleUtils.parser.cfOmocodeId

```javascript
codiceFiscaleUtils.parser.cfOmocodeId("VRNGNYLtdsucprmt"); //127
codiceFiscaleUtils.parser.cfOmocodeId("kkalmn91as0b331z"); //16
codiceFiscaleUtils.parser.cfOmocodeId("kkalmn91a30b331z"); //0
```

#### CodiceFiscaleUtils.parser.cfOmocode

```javascript
codiceFiscaleUtils.parser.cfOmocode("VRNGNY07d68c351v", 0); //VRNGNY07d68c351v
codiceFiscaleUtils.parser.cfOmocode("VRNGNY07d68c351v", 1); //VRNGNY07d68c35Mn
codiceFiscaleUtils.parser.cfOmocode("VRNGNY07d68c351v", 2); //VRNGNY07d68c3R1h
codiceFiscaleUtils.parser.cfOmocode("VRNGNY07d68c351v", 3); //VRNGNY07d68c3RMz
codiceFiscaleUtils.parser.cfOmocode("VRNGNY07d68c351v", 8); //VRNGNY07d6Uc351s
codiceFiscaleUtils.parser.cfOmocode("VRNGNY07d68c351v", 32); //VRNGNY0Td68c351h
codiceFiscaleUtils.parser.cfOmocode("VRNGNY07d68c351v", 127); //VRNGNYLTdSUcPRMt
//Re-omocode
codiceFiscaleUtils.parser.cfOmocode("kkalmnvmaplb331z", 0); //kkalmn91a30b331p
codiceFiscaleUtils.parser.cfOmocode("kkalmnvmaplb331z", 1); //kkalmn91a30b33Mh
codiceFiscaleUtils.parser.cfOmocode("kkalmnvmaplb331z", 74); //kkalmnv1a3lb3P1t
codiceFiscaleUtils.parser.cfOmocode("kkalmnvmaplb331z", 127); //kkalmnvmaplbPPMe
```

#### CodiceFiscaleUtils.parser.cfToLastName

```javascript
codiceFiscaleUtils.parser.cfToLastName("WYZ"); //W*Y*Z*
```

#### CodiceFiscaleUtils.parser.cfToFirstName

```javascript
codiceFiscaleUtils.parser.cfToFirstName("ZZZWAE"); //WAE*
```

#### CodiceFiscaleUtils.parser.cfToGender

```javascript
codiceFiscaleUtils.parser.cfToGender("XXXYYY90B20"); //M
codiceFiscaleUtils.parser.cfToGender("XXXYYY90B63"); //F
```

#### Parser.cfToBirthDay

```javascript
codiceFiscaleUtils.parser.cfToBirthDay("XXXYYY90B71"); //31
```

#### CodiceFiscaleUtils.parser.cfToBirthMonth

```javascript
codiceFiscaleUtils.parser.cfToBirthMonth("XXXYYY92C"); //2
```

#### CodiceFiscaleUtils.parser.cfToBirthYear

Parser will consider dates that can be both _19xx_ and _20xx_ as **_20xx_** if they would be valid in the last 100 years range from now

```javascript
codiceFiscaleUtils.parser.cfToBirthYear("XXXYYY92"); //1992
codiceFiscaleUtils.parser.cfToBirthYear("XXXYYY12"); //2012
```

#### Parser.cfToBirthDate

```javascript
const dt = codiceFiscaleUtils.parser.cfToBirthDate("XXXYYY81A63"); //Date
dt.toJSON(); //1981-01-23T...
```

#### CodiceFiscaleUtils.parser.cfToBirthPlace

```javascript
const birthPlace = codiceFiscaleUtils.parser.cfToBirthPlace("XXXYYY92B20H501");
/*
{
    firstName: "ROMA",
    belfioreCode: "H501",
    creationDate: Date("1884-09-10T22:00:00.000Z"),
    expirationDate: Date("9999-12-31T22:59:59.999Z"),
    province: "RM",
    dataSource: {
        "name": "Ministero dell\'Interno",
        "url": "https://developers.italia.it/en/anpr",
        "license": "cc-by-4.0",
        "licenseUrl": "https://creativecommons.org/licenses/by/4.0/legalcode.it",
        "termsAndConditions": "https://github.com/italia/anpr/blob/master/src/archivi/ANPR_archivio_comuni_legenda.md",
        "authors": "https://github.com/italia/anpr/blob/master/AUTHORS"
    }
}
*/
```

#### Parser.cfDecode (async)

```javascript
await codiceFiscaleUtils.parser.cfDecode("VRNGNY07D68C351V");
/*
{
    lastName: 'V*R*N*',
    firstName: 'G*N*Y*',
    day: 28,
    month: 3,
    year: 2017,
    gender: 'F',
    place: {
		belfioreCode: 'C531',
		name: 'CATANIA',
		creationDate: Date('1861-03-17'),
		expirationDate: Date('9999-12-31'),
		province: 'CT',
		dataSource: {
			name: 'Ministero dell\'Interno',
			url: '...',
			authors: '...',
			license: 'cc-by-4.0',
			licenseUrl: '...',
			termsAndConditions: '...'
		}

	}
}
*/
```

#### Parser.lastNameToCf

```javascript
codiceFiscaleUtils.parser.lastNameToCf("Rossi"); //RSS
codiceFiscaleUtils.parser.lastNameToCf("Réno"); //RNE
codiceFiscaleUtils.parser.lastNameToCf("Aieie"); //AIE
```

#### Parser.firstNameToCf

```javascript
codiceFiscaleUtils.parser.firstNameToCf("Dòminique"); //DNQ
codiceFiscaleUtils.parser.firstNameToCf("Mark"); //MRK
codiceFiscaleUtils.parser.firstNameToCf("Tom"); //TMO
codiceFiscaleUtils.parser.firstNameToCf("Ania"); //NAI
```

#### Parser.yearToCf

```javascript
codiceFiscaleUtils.parser.yearToCf("1990"); //90
codiceFiscaleUtils.parser.yearToCf(2010); //10
codiceFiscaleUtils.parser.yearToCf("02"); //02
```

#### Parser.monthToCf

```javascript
codiceFiscaleUtils.parser.monthToCf(0); //A
codiceFiscaleUtils.parser.monthToCf(4); //E
codiceFiscaleUtils.parser.monthToCf(8); //P
```

#### Parser.monthToCf

```javascript
codiceFiscaleUtils.parser.monthToCf(0); //A
codiceFiscaleUtils.parser.monthToCf(4); //E
codiceFiscaleUtils.parser.monthToCf(8); //P
```

#### Parser.dayGenderToCf

```javascript
codiceFiscaleUtils.parser.dayGenderToCf(3, "M"); //03
codiceFiscaleUtils.parser.dayGenderToCf(7, "F"); //47
```

#### Parser.dateGenderToCf

```javascript
codiceFiscaleUtils.parser.dateGenderToCf([2016, 3, 23], "M"); //16D23
codiceFiscaleUtils.parser.dateGenderToCf("1987-09-22", "F"); //87P62
codiceFiscaleUtils.parser.dateGenderToCf(new Date(2016, 2, 23, 12), "M"); //16C23
codiceFiscaleUtils.parser.dateGenderToCf(moment(1988, 7, 3, 12), "F"); //88M43
```

#### Parser.placeToCf (async)

```javascript
await codiceFiscaleUtils.parser.placeToCf("Bologna");
/*
{
    belfioreCode: 'A944',
    name: 'BOLOGNA',
    creationDate: 1861-03-16T23:00:00.000Z,
    expirationDate: 9999-12-31T22:59:59.999Z,
    dataSource: {...},
    province: 'BO'
}
*/
await codiceFiscaleUtils.parser.placeToCf([1990], "Unione Sovietica");
/*
{
    belfioreCode: 'Z135',
    name: 'Unione Sovietica',
    creationDate: 1860-12-31T23:00:00.000Z,
    expirationDate: 1991-12-31T22:59:59.999Z,
    dataSource: {...},
    iso3166: 'SU'
}
*/
await codiceFiscaleUtils.parser.placeToCf([2000], "Unione Sovietica"); //null
```

#### Parser.encodeCf (async)

```javascript
await codiceFiscaleUtils.parser.encodeCf({
	lastName: "Veronesi",
	firstName: "Genny",
	year: 1907,
	month: 3,
	day: 28,
	gender: "F",
	place: "Catania",
}); //VRNGNY07D68C351V
```

```javascript
await codiceFiscaleUtils.parser.encodeCf({
	lastName: "Veronesi",
	firstName: "Genny",
	year: 1907,
	month: 3,
	day: 28,
	gender: "F",
	place: "C531",
}); //VRNGNY07D68C351V
```

</details>

### CodiceFiscaleUtils.pattern

<details>
    <summary>Show code examples</summary>

#### CodiceFiscaleUtils.pattern.cfLastName

```javascript
codiceFiscaleUtils.pattern.cfLastName().test("KST"); //true
codiceFiscaleUtils.pattern.cfLastName().test("AST"); //false
codiceFiscaleUtils.pattern.cfLastName("Alex").test("KST"); //false
codiceFiscaleUtils.pattern.cfLastName("Alex").test("LXA"); //true
```

#### CodiceFiscaleUtils.pattern.cfFirstName

```javascript
codiceFiscaleUtils.pattern.cfFirstName().test("NIX"); //true
codiceFiscaleUtils.pattern.cfFirstName().test("UIK"); //false
codiceFiscaleUtils.pattern.cfFirstName("Dominique").test("DMN"); //false
codiceFiscaleUtils.pattern.cfFirstName("Dominique").test("DNQ"); //true
```

#### CodiceFiscaleUtils.pattern.cfYear

```javascript
codiceFiscaleUtils.pattern.cfYear().test("07"); //true
codiceFiscaleUtils.pattern.cfYear().test("3"); //false
codiceFiscaleUtils.pattern.cfYear(1907).test("07"); //true
codiceFiscaleUtils.pattern.cfYear(1986).test("U6"); //true - omocode
codiceFiscaleUtils.pattern.cfYear(1986).test("87"); //false
```

#### CodiceFiscaleUtils.pattern.cfMonth

```javascript
codiceFiscaleUtils.pattern.cfMonth().test("C"); //true
codiceFiscaleUtils.pattern.cfMonth().test("Z"); //false
codiceFiscaleUtils.pattern.cfMonth(3).test("D"); //true
codiceFiscaleUtils.pattern.cfMonth(3).test("A"); //false
```

#### CodiceFiscaleUtils.pattern.cfDay

```javascript
codiceFiscaleUtils.pattern.cfDay().test("0M"); //true - omocode
codiceFiscaleUtils.pattern.cfDay().test("33"); //false
codiceFiscaleUtils.pattern.cfDay(12).test("12"); //true - male
codiceFiscaleUtils.pattern.cfDay(12).test("52"); //true - female
codiceFiscaleUtils.pattern.cfDay(12).test("MN"); //true - omocode
codiceFiscaleUtils.pattern.cfDay(12).test("22"); //false
```

#### CodiceFiscaleUtils.pattern.cfDayGender

```javascript
codiceFiscaleUtils.pattern.cfDayGender().test("0M"); //true
codiceFiscaleUtils.pattern.cfDayGender().test("73"); //false
codiceFiscaleUtils.pattern.cfDayGender(9, "F").test("RM"); //true
codiceFiscaleUtils.pattern.cfDayGender(1, "F").test("41"); //true
codiceFiscaleUtils.pattern.cfDayGender(1, "M").test("41"); //false
```

#### CodiceFiscaleUtils.pattern.cfDateGender

```javascript
codiceFiscaleUtils.pattern.cfDateGender().test("83D22"); //true
codiceFiscaleUtils.pattern.cfDateGender().test("83Z32"); //false
codiceFiscaleUtils.pattern.cfDateGender([1983, 3, 22], "M").test("U3D2N"); //true
codiceFiscaleUtils.pattern.cfDateGender("1995-05-01", "F").test("V5EQ1"); //true
codiceFiscaleUtils.pattern.cfDateGender([1983, 3, 22], "M").test("83D62"); //false
```

#### CodiceFiscaleUtils.pattern.cfPlace (async)

```javascript
const genericCfPlaceMatcher = await codiceFiscaleUtils.pattern.cfPlace();
genericCfPlaceMatcher.test("A662"); //true
genericCfPlaceMatcher.test("Z974"); //false

const cityCfPlaceMatcher = await codiceFiscaleUtils.pattern.cfPlace("Bari");
cityCfPlaceMatcher.test("H501"); //true

const year33CityCfPlaceMatcher = await codiceFiscaleUtils.pattern.cfPlace(
	[1933],
	"Fiume"
);
year33CityCfPlaceMatcher.test("D620"); //true
const year00CityCfPlaceMatcher = await codiceFiscaleUtils.pattern.cfPlace(
	[2000],
	"Fiume"
);
year00CityCfPlaceMatcher.test("D620"); //false - due to expiration date
```

#### CodiceFiscaleUtils.pattern.codiceFiscale (async)

```javascript
const cFMatcher = await codiceFiscaleUtils.pattern.codiceFiscale();
cFMatcher.test("VRNGNY07D68C351V"); //true
cFMatcher.codiceFiscale().test("MRNMIA02E45L2193"); //false

//Partial info
const cfPartialInfo = await codiceFiscaleUtils.pattern.codiceFiscale({
	lastName: "Veronesi",
	firstName: "Genny",
	gender: "F",
	place: "Catania",
});
cfPartialInfo.test("VRNGNY97A65C351V"); //true

//Full info
const cfFullInfo = await codiceFiscaleUtils.pattern.codiceFiscale({
	lastName: "Veronesi",
	firstName: "Genny",
	year: 1907,
	month: 3,
	day: 28,
	gender: "F",
	place: "Catania",
});
cfFullInfo.test("VRNGNY07D68C351V"); //true
```

#### CodiceFiscaleUtils.pattern.lastName

```javascript
codiceFiscaleUtils.pattern.lastName().test("Kristersen"); //true
codiceFiscaleUtils.pattern.lastName("VLD").test("Vàlidàtòr"); //true
codiceFiscaleUtils.pattern.lastName("AIX").test("Air"); //false
```

#### CodiceFiscaleUtils.pattern.firstName

```javascript
codiceFiscaleUtils.pattern.firstName().test("Rossi"); //true
codiceFiscaleUtils.pattern.firstName("XYZAIE").test("Aieie"); //true
codiceFiscaleUtils.pattern.firstName("XYZAIX").test("Air"); //false
```

#### CodiceFiscaleUtils.pattern.date

```javascript
codiceFiscaleUtils.pattern.date().test("1995"); //true
codiceFiscaleUtils.pattern.date().test("1985-01"); //true
codiceFiscaleUtils.pattern.date().test("1970-03-03"); //true
codiceFiscaleUtils.pattern.date().test("1970-03-"); //false
codiceFiscaleUtils.pattern.date("XYZXYZ88H61").test("1988-06-21"); //true
codiceFiscaleUtils.pattern.date("XYZXYZ92C16").test("1992-03-26"); //false
```

#### CodiceFiscaleUtils.pattern.gender

```javascript
codiceFiscaleUtils.pattern.gender().test("F"); //true
codiceFiscaleUtils.pattern.gender().test("X"); //false
codiceFiscaleUtils.pattern.gender("XYZXYZ88H61").test("F"); //true
codiceFiscaleUtils.pattern.gender("XYZXYZ88H61").test("M"); //false
```

#### CodiceFiscaleUtils.pattern.place (async)

```javascript
const genericPlaceMatcher = await codiceFiscaleUtils.pattern.place();
genericPlaceMatcher.test("Roma"); //true

const cityPlaceMatcher = await codiceFiscaleUtils.pattern.place(
	"XYZXYZ92C16A662"
);
cityPlaceMatcher.test("Bari"); //true
cityPlaceMatcher.test("Bologna"); //false
```

</details>

### CodiceFiscaleUtils.validator

<details>
    <summary>Show code examples</summary>

#### CodiceFiscaleUtils.validator.isLastNameValid

```javascript
codiceFiscaleUtils.validator.isLastNameValid("Test"); //true
codiceFiscaleUtils.validator.isLastNameValid("Tést N'àme"); //true
codiceFiscaleUtils.validator.isLastNameValid(""); //false
codiceFiscaleUtils.validator.isLastNameValid("@!#"); //false
```

#### CodiceFiscaleUtils.validator.isLastNameInvalid

```javascript
codiceFiscaleUtils.validator.isLastNameInvalid("Test"); //false
codiceFiscaleUtils.validator.isLastNameInvalid("Tést N'àme"); //false
codiceFiscaleUtils.validator.isLastNameInvalid(""); //false
codiceFiscaleUtils.validator.isLastNameInvalid("@!#"); //true
```

#### CodiceFiscaleUtils.validator.isFirstNameValid

```javascript
codiceFiscaleUtils.validator.isFirstNameValid("Test"); //true
codiceFiscaleUtils.validator.isFirstNameValid("Tést N'àme"); //true
codiceFiscaleUtils.validator.isFirstNameValid(""); //false
codiceFiscaleUtils.validator.isFirstNameValid("@!#"); //false
```

#### CodiceFiscaleUtils.validator.isFirstNameInvalid

```javascript
codiceFiscaleUtils.validator.isFirstNameInvalid("Test"); //false
codiceFiscaleUtils.validator.isFirstNameInvalid("Tést N'àme"); //false
codiceFiscaleUtils.validator.isFirstNameInvalid(""); //false
codiceFiscaleUtils.validator.isFirstNameInvalid("@!#"); //true
```

#### CodiceFiscaleUtils.validator.isBirthDateValid

```javascript
codiceFiscaleUtils.validator.isBirthDateValid("1999-01-01"); //true
codiceFiscaleUtils.validator.isBirthDateValid([1999, 0, 1]); //true
codiceFiscaleUtils.validator.isBirthDateValid(""); //false
codiceFiscaleUtils.validator.isBirthDateValid("2000-02-30"); //false
codiceFiscaleUtils.validator.isBirthDateValid("No date"); //false
codiceFiscaleUtils.validator.isBirthDateValid("@!#"); //false
```

#### CodiceFiscaleUtils.validator.isBirthDateInvalid

```javascript
codiceFiscaleUtils.validator.isBirthDateInvalid("1999-01-01"); //false
codiceFiscaleUtils.validator.isBirthDateInvalid([1999, 0, 1]); //false
codiceFiscaleUtils.validator.isBirthDateInvalid(""); //false
codiceFiscaleUtils.validator.isBirthDateInvalid("2000-02-30"); //true
codiceFiscaleUtils.validator.isBirthDateInvalid("No date"); //true
codiceFiscaleUtils.validator.isBirthDateInvalid("@!#"); //true
```

#### CodiceFiscaleUtils.validator.isBirthPlaceValid (async)

```javascript
await codiceFiscaleUtils.validator.isBirthPlaceValid("Roma"); //true
await codiceFiscaleUtils.validator.isBirthPlaceValid("H501"); //true
await codiceFiscaleUtils.validator.isBirthPlaceValid(""); //false
await codiceFiscaleUtils.validator.isBirthPlaceValid("Moon"); //false
```

#### CodiceFiscaleUtils.validator.isBirthPlaceInvalid (async)

```javascript
await codiceFiscaleUtils.validator.isBirthPlaceInvalid("Roma"); //false
await codiceFiscaleUtils.validator.isBirthPlaceInvalid("H501"); //false
await codiceFiscaleUtils.validator.isBirthPlaceInvalid(""); //false
await codiceFiscaleUtils.validator.isBirthPlaceInvalid("Moon"); //true
```

#### CodiceFiscaleUtils.validator.birthDatePlaceMatch

```javascript
await codiceFiscaleUtils.validator.birthDatePlaceMatch(
	"1990-05-21",
	"Repubblica Socialista Federale di Jugoslavia"
); //true
await codiceFiscaleUtils.validator.birthDatePlaceMatch(
	new Date(),
	"Repubblica Socialista Federale di Jugoslavia"
); //false
await codiceFiscaleUtils.validator.birthDatePlaceMatch("1988-03-11", "Roma"); //true
await codiceFiscaleUtils.validator.birthDatePlaceMatch(new Date(), "Roma"); //true
await codiceFiscaleUtils.validator.birthDatePlaceMatch(new Date(), ""); //false
await codiceFiscaleUtils.validator.birthDatePlaceMatch("", "Palermo"); //false
await codiceFiscaleUtils.validator.birthDatePlaceMatch("", ""); //false
```

#### CodiceFiscaleUtils.validator.birthDatePlaceMismatch

```javascript
await codiceFiscaleUtils.validator.birthDatePlaceMismatch(
	"1990-05-21",
	"Repubblica Socialista Federale di Jugoslavia"
); //false
await codiceFiscaleUtils.validator.birthDatePlaceMismatch(
	new Date(),
	"Repubblica Socialista Federale di Jugoslavia"
); //true
await codiceFiscaleUtils.validator.birthDatePlaceMismatch("1988-03-11", "Roma"); //false
await codiceFiscaleUtils.validator.birthDatePlaceMismatch(new Date(), "Roma"); //false
await codiceFiscaleUtils.validator.birthDatePlaceMismatch(new Date(), ""); //false
await codiceFiscaleUtils.validator.birthDatePlaceMismatch("", "Palermo"); //false
await codiceFiscaleUtils.validator.birthDatePlaceMismatch("", ""); //false
```

</details>

### CFMismatchValidator

_Class_ instance

```javascript
//CFMismatchValidator
const cfValidator = await codiceFiscaleUtils.validator.codiceFiscale(
	"VRNGNY07D68C351V"
);
```

<details>
    <summary>Show code examples</summary>

#### CFMismatchValidator.errors

```javascript
(await codiceFiscaleUtils.validator.codiceFiscale("GSTPPP99C06D620V")).errors;
/*
{
	place: "PLACE_EXPIRED_ON_NOT_YET_CREATED_ON_BIRTDATE",
	date: "BIRTHDATE_OUT_OF_BIRTH_PLACE_LIFE_RANGE",
}
*/
```

#### CFMismatchValidator.matchPersonalInfo

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchPersonalInfo({
	day: 28,
	firstName: "Génny",
	gender: "F",
	lastName: "Verònesi",
	month: 3,
	place: "Catania",
	year: 1907,
}); //true

(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchPersonalInfo({
	day: 28,
	firstName: "Génny",
	gender: "F",
	lastName: "Verònesi",
	month: 3,
	place: "Firenze",
	year: 1907,
}); //false
```

#### CFMismatchValidator.mismatchPersonalInfo

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchPersonalInfo({
	day: 28,
	firstName: "Génny",
	gender: "F",
	lastName: "Verònesi",
	month: 3,
	place: "Catania",
	year: 1907,
}); //false

(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchPersonalInfo({
	day: 28,
	firstName: "Génny",
}); //false
```

#### CFMismatchValidator.valid

```javascript
(await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")).valid; //true
(await codiceFiscaleUtils.validator.codiceFiscale("MRNMIA02E45L219X")).valid; //true
(await codiceFiscaleUtils.validator.codiceFiscale("GSTPPP31C06D620Z")).valid; //true
(await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351K")).valid; //false - invalid check digit
(await codiceFiscaleUtils.validator.codiceFiscale("GSTPPP99C06D620V")).valid; //false - invalid birth date/place
(await codiceFiscaleUtils.validator.codiceFiscale("")).valid; //false - empty cf
```

#### CFMismatchValidator.invalid

```javascript
(await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")).invalid; //false - OK
(await codiceFiscaleUtils.validator.codiceFiscale("MRNMIA02E45L219X")).invalid; //false - OK
(await codiceFiscaleUtils.validator.codiceFiscale("GSTPPP31C06D620Z")).invalid; //false - OK
(await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351K")).invalid; //true - invalid check digit
(await codiceFiscaleUtils.validator.codiceFiscale("GSTPPP99C06D620V")).invalid; //true - invalid birth date/place
(await codiceFiscaleUtils.validator.codiceFiscale("")).invalid; //false - empty cf is not invalid!
```

#### CFMismatchValidator.matchLastName

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchLastName("Vareni"); //true
(await codiceFiscaleUtils.validator.codiceFiscale("VRN")).matchLastName(
	"Vareni"
); //true
(await codiceFiscaleUtils.validator.codiceFiscale("")).matchLastName("Vareni"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchLastName("John"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchLastName("V"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchLastName(""); //false
```

#### CFMismatchValidator.mismatchLastName

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchLastName("Vareni"); //false
(await codiceFiscaleUtils.validator.codiceFiscale("VRN")).mismatchLastName(
	"Vareni"
); //false
(await codiceFiscaleUtils.validator.codiceFiscale("")).mismatchLastName(
	"Vareni"
); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchLastName("John"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchLastName("V"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchLastName(""); //false
```

#### CFMismatchValidator.matchFirstName

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchFirstName("Genny"); //true
(await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY")).matchFirstName(
	"Genny"
); //true
(await codiceFiscaleUtils.validator.codiceFiscale("")).matchFirstName("Genny"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchFirstName("John"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchFirstName("G"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchFirstName(""); //false
```

#### CFMismatchValidator.mismatchFirstName

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchFirstName("Genny"); //false
(await codiceFiscaleUtils.validator.codiceFiscale("VRN")).mismatchFirstName(
	"Genny"
); //false
(await codiceFiscaleUtils.validator.codiceFiscale("")).mismatchFirstName(
	"Genny"
); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchFirstName("John"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchFirstName("G"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchFirstName(""); //false
```

#### CFMismatchValidator.matchBirthDate

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchBirthDate("2007-04-28"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68")
).matchBirthDate("2007-04-28"); //true
(await codiceFiscaleUtils.validator.codiceFiscale("")).matchBirthDate(
	"2007-04-28"
); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchBirthDate("2008-02-16"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchBirthDate(""); //false
```

#### CFMismatchValidator.mismatchBirthDate

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchBirthDate("2007-04-28"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68")
).mismatchBirthDate("2007-04-28"); //false
(await codiceFiscaleUtils.validator.codiceFiscale("")).mismatchBirthDate(
	"2007-04-28"
); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchBirthDate("2008-02-16"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchBirthDate(""); //false
```

#### CFMismatchValidator.matchGender

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchGender("F"); //true
(await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68")).matchGender(
	"F"
); //true
(await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D6")).matchGender(
	"F"
); //true
(await codiceFiscaleUtils.validator.codiceFiscale("")).matchGender("F"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchGender("M"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchGender(""); //false
```

#### CFMismatchValidator.mismatchGender

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchGender("F"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68")
).mismatchGender("F"); //false
(await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D6")).mismatchGender(
	"F"
); //false
(await codiceFiscaleUtils.validator.codiceFiscale("")).mismatchGender("F"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchGender("M"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchGender(""); //false
```

#### CFMismatchValidator.matchBirthPlace

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchBirthPlace("CATANIA"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351")
).matchBirthPlace("CATANIA"); //true
(await codiceFiscaleUtils.validator.codiceFiscale("")).matchBirthPlace(
	"CATANIA"
); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchBirthPlace("ROMA"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).matchBirthPlace(""); //false
```

#### CFMismatchValidator.mismatchBirthPlace

```javascript
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchBirthPlace("CATANIA"); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351")
).mismatchBirthPlace("CATANIA"); //false
(await codiceFiscaleUtils.validator.codiceFiscale("")).mismatchBirthPlace(
	"CATANIA"
); //false
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchBirthPlace("ROMA"); //true
(
	await codiceFiscaleUtils.validator.codiceFiscale("VRNGNY07D68C351V")
).mismatchBirthPlace(""); //false
```

</details>

## 🔃 Compatibility

- [x] NodeJs
- [x] Chrome
- [x] Firefox
- [x] Edge

## ✋ DISCLAMER

All names, informations, and fiscal codes used in this README and all unit tests are fictitious.
No identification with actual persons (living or deceased) is intended or should be inferred

## 📜 [LICENSE: MIT](LICENSE)

## 📚 ASSETS LICENSES AND AUTHORS

- Cities List of Values: [CC BY 4.0](asset/MINISTERO_DELL_INTERNO.LICENSE) Ministero dell'interno
- Cities List of Values: [CC BY 4.0](asset/AGENZIA_DELLE_ENTRATE.LICENSE) Agenzia delle Entrate
- Countries List of Values: [CC BY 3.0](asset/ISTITUTO_NAZIONALE_DI_STATISTICA.LICENSE) Istituto nazionale di statistica

## 📝 AUTHOR

[Marco Ricupero](mailto:marco.ricupero@gmail.com)

## 📬 CONTRIBUTORS

- [Giacomo Gregoletto](https://github.com/greguz)
- [Julian Scheid](https://github.com/jscheid)