mirror of
https://github.com/danog/CodiceFiscaleJS.git
synced 2024-11-30 04:29:11 +01:00
commit
63ba60765b
1
dist/codice.fiscale.amd.js
vendored
Normal file
1
dist/codice.fiscale.amd.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/codice.fiscale.commonjs2.js
vendored
Normal file
1
dist/codice.fiscale.commonjs2.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/codice.fiscale.js
vendored
1
dist/codice.fiscale.js
vendored
File diff suppressed because one or more lines are too long
1
dist/codice.fiscale.umd.js
vendored
Normal file
1
dist/codice.fiscale.umd.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/codice.fiscale.var.js
vendored
Normal file
1
dist/codice.fiscale.var.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -1,70 +0,0 @@
|
||||
// Karma configuration
|
||||
// Generated on Wed Mar 16 2016 15:24:23 GMT+0100 (CET)
|
||||
|
||||
module.exports = function(config) {
|
||||
config.set({
|
||||
|
||||
// base path that will be used to resolve all patterns (eg. files, exclude)
|
||||
basePath: '',
|
||||
|
||||
|
||||
// frameworks to use
|
||||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
||||
frameworks: ['jasmine'],
|
||||
|
||||
|
||||
// list of files / patterns to load in the browser
|
||||
files: [
|
||||
'dist/codice.fiscale.js',
|
||||
'tests/specs.js',
|
||||
],
|
||||
|
||||
|
||||
// list of files to exclude
|
||||
exclude: [
|
||||
],
|
||||
|
||||
|
||||
// preprocess matching files before serving them to the browser
|
||||
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
|
||||
preprocessors: {
|
||||
},
|
||||
|
||||
|
||||
// test results reporter to use
|
||||
// possible values: 'dots', 'progress'
|
||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
||||
reporters: ['progress'],
|
||||
|
||||
|
||||
// web server port
|
||||
port: 9876,
|
||||
|
||||
|
||||
// enable / disable colors in the output (reporters and logs)
|
||||
colors: true,
|
||||
|
||||
|
||||
// level of logging
|
||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
||||
logLevel: config.LOG_INFO,
|
||||
|
||||
|
||||
// enable / disable watching file and executing tests whenever any file changes
|
||||
autoWatch: true,
|
||||
|
||||
|
||||
// start these browsers
|
||||
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
|
||||
browsers: ['Chrome'],
|
||||
|
||||
|
||||
// Continuous Integration mode
|
||||
// if true, Karma captures browsers, runs the tests and exits
|
||||
singleRun: false,
|
||||
|
||||
// Concurrency level
|
||||
// how many browser should be started simultaneous
|
||||
concurrency: Infinity
|
||||
})
|
||||
}
|
5836
package-lock.json
generated
5836
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
47
package.json
47
package.json
@ -1,36 +1,45 @@
|
||||
{
|
||||
"name": "codice-fiscale-js",
|
||||
"version": "1.1.1",
|
||||
"description": "Calcolo del codice fiscale",
|
||||
"main": "lib/codice.fiscale.js",
|
||||
"version": "1.2.0",
|
||||
"description": "ES6 implementation of codice-fiscale-js",
|
||||
"main": "dist/codice.fiscale.umd.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/lucavandro/CodiceFiscaleJS.git"
|
||||
"url": "git://github.com/marcopesani/CodiceFiscaleJS.git"
|
||||
},
|
||||
"directories": {
|
||||
"test": "tests"
|
||||
},
|
||||
"dependencies": {},
|
||||
"dependencies": {
|
||||
"lodash.deburr": "^4.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jasmine-core": "^2.4.1",
|
||||
"karma": "^0.13.22",
|
||||
"karma-chrome-launcher": "^0.2.2",
|
||||
"karma-jasmine": "^0.3.7",
|
||||
"karma-phantomjs-launcher": "^1.0.0",
|
||||
"phantomjs-prebuilt": "^2.1.5",
|
||||
"typescript": "^2.5.2",
|
||||
"uglify-js": "^2.8.11",
|
||||
"uglifyjs-webpack-plugin": "^0.3.0",
|
||||
"webpack": "^2.2.1"
|
||||
"babel-core": "^6.26.0",
|
||||
"babel-jest": "^22.0.1",
|
||||
"babel-loader": "^7.1.2",
|
||||
"babel-preset-env": "^1.6.1",
|
||||
"eslint": "^3.0.0",
|
||||
"jest": "^22.0.1",
|
||||
"parallel-webpack": "^2.2.0",
|
||||
"regenerator-runtime": "^0.11.1",
|
||||
"request": "^2.83.0",
|
||||
"standard": "^10.0.3",
|
||||
"webpack": "^2.7.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "webpack",
|
||||
"pretest": "npm run build",
|
||||
"test": "npm run build && karma start"
|
||||
"test": "standard && jest"
|
||||
},
|
||||
"author": "Luca Vandro <lucavandro@gmail.com>",
|
||||
"contributors": [
|
||||
"Walter Barbagallo <brb.walter@gmail.com>"
|
||||
"Walter Barbagallo <brb.walter@gmail.com>",
|
||||
"Marco Pesani <marco.pesani@gmail.com>"
|
||||
],
|
||||
"license": "MIT"
|
||||
}
|
||||
"license": "MIT",
|
||||
"standard": {
|
||||
"ignore": [
|
||||
"dist/"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
12
readme.md
12
readme.md
@ -23,11 +23,6 @@ Compute a codice fiscale given:
|
||||
- Place of birth (String)
|
||||
- Province of birth (String)
|
||||
|
||||
```js
|
||||
var cf = CodiceFiscale.compute("Enzo","Righi","M",24,7,1957,"Napoli", "NA");
|
||||
```
|
||||
or
|
||||
|
||||
```js
|
||||
var cf = CodiceFiscale.compute({
|
||||
name: "Enzo",
|
||||
@ -43,11 +38,6 @@ var cf = CodiceFiscale.compute({
|
||||
===
|
||||
Use the italian name of the foreign country (e.g. Francia, for France) as birthplace
|
||||
and "EE" as birthplace_provincia
|
||||
```js
|
||||
var cf = CodiceFiscale.compute("Enzo","Righi","M",24,7,1957,"Francia", "EE");
|
||||
```
|
||||
or
|
||||
|
||||
```js
|
||||
var cf = CodiceFiscale.compute({
|
||||
name: "Enzo",
|
||||
@ -112,4 +102,4 @@ var omocodie = CodiceFiscale.getOmocodie("VNDLDL10A01G410Z");
|
||||
## Available npm scripts:
|
||||
|
||||
- `npm run build`: build the bundle into `dist` directory.
|
||||
- `npm run test`: launch the karma tests.
|
||||
- `npm run test`: launch the jest tests.
|
32859
src/catastal-codes.json
32859
src/catastal-codes.json
File diff suppressed because it is too large
Load Diff
@ -1,201 +0,0 @@
|
||||
const catastalCodes = require('./catastal-codes.json')
|
||||
|
||||
var CodiceFiscale={}
|
||||
|
||||
CodiceFiscale.compute=function(name,surname,gender,day,month,year,birthplace, birthplace_provincia){
|
||||
|
||||
// Pass an object as parameter
|
||||
|
||||
if(
|
||||
typeof name == 'object'
|
||||
){
|
||||
var params = name;
|
||||
name = params['name'],
|
||||
surname = params['surname'],
|
||||
gender = params['gender'],
|
||||
day = params['day'],
|
||||
month = params['month'],
|
||||
year = params['year'],
|
||||
birthplace = params['birthplace'],
|
||||
birthplace_provincia = params['birthplace_provincia'];
|
||||
}
|
||||
|
||||
var code=
|
||||
this.surnameCode(surname)+
|
||||
this.nameCode(name)+
|
||||
this.dateCode(day,month,year,gender)+
|
||||
this.findComuneCode(birthplace, birthplace_provincia);
|
||||
|
||||
code+=this.getCheckCode(code);
|
||||
|
||||
return code;
|
||||
|
||||
}
|
||||
CodiceFiscale.check = function(codiceFiscale){
|
||||
if(typeof codiceFiscale !== 'string') return false;
|
||||
codiceFiscale = codiceFiscale.toUpperCase();
|
||||
if(codiceFiscale.length !== 16) return false;
|
||||
var expectedCheckCode = codiceFiscale.charAt(15);
|
||||
var cf = codiceFiscale.slice(0,15);
|
||||
|
||||
return CodiceFiscale.getCheckCode(cf) == expectedCheckCode;
|
||||
|
||||
}
|
||||
CodiceFiscale.getCheckCode=function(codiceFiscale){
|
||||
var val=0;
|
||||
for(var i=0; i<15 ;i++){
|
||||
var c=codiceFiscale[i];
|
||||
val+= i%2 ? this.CHECK_CODE_EVEN[c] : this.CHECK_CODE_ODD[c];
|
||||
}
|
||||
val=val%26;
|
||||
return this.CHECK_CODE_CHARS.charAt(val);
|
||||
}
|
||||
|
||||
CodiceFiscale.estraiConsonanti=function(str){
|
||||
return str.replace(/[^BCDFGHJKLMNPQRSTVWXYZ]/gi,'');
|
||||
}
|
||||
|
||||
CodiceFiscale.estraiVocali=function(str){
|
||||
return str.replace(/[^AEIOU]/gi,'');
|
||||
}
|
||||
|
||||
CodiceFiscale.surnameCode=function(surname){
|
||||
var code_surname = this.estraiConsonanti(surname) + this.estraiVocali(surname) + 'XXX';
|
||||
return code_surname.substr(0,3).toUpperCase();
|
||||
}
|
||||
|
||||
CodiceFiscale.nameCode=function(name){
|
||||
var codNome = this.estraiConsonanti(name);
|
||||
if(codNome.length>=4){
|
||||
codNome= codNome.charAt(0) + codNome.charAt(2) + codNome.charAt(3);
|
||||
}else{
|
||||
codNome+= this.estraiVocali(name) + 'XXX';
|
||||
codNome=codNome.substr(0,3);
|
||||
}
|
||||
return codNome.toUpperCase();
|
||||
}
|
||||
|
||||
CodiceFiscale.dateCode=function(gg,mm,aa,gender){
|
||||
var date=new Date();
|
||||
date.setYear(aa);
|
||||
date.setMonth(mm-1);
|
||||
date.setDate(gg);
|
||||
// Padding year
|
||||
var year="0"+date.getFullYear();
|
||||
year=year.substr(year.length-2,2);
|
||||
|
||||
var month=this.MONTH_CODES[date.getMonth()];
|
||||
var day=date.getDate();
|
||||
if(gender.toUpperCase()=='F') day+=40;
|
||||
|
||||
// Padding day
|
||||
day="0"+day;
|
||||
day=day.substr(day.length-2,2);
|
||||
return String(year+month+day);
|
||||
}
|
||||
|
||||
|
||||
CodiceFiscale.findComuneCode=function(birthplace, birthplace_provincia){
|
||||
for (var i = this.CODICI_CATASTALI[birthplace_provincia].length - 1; i >= 0; i--) {
|
||||
var comune = this.CODICI_CATASTALI[birthplace_provincia][i];
|
||||
if(comune[0] == birthplace.trim().toUpperCase()) return comune[1];
|
||||
}
|
||||
throw Error("Comune not found");
|
||||
}
|
||||
|
||||
CodiceFiscale.getOmocodie = function(code){
|
||||
var results = [];
|
||||
var lastOmocode = code = code.slice(0,15);
|
||||
for (var i = code.length - 1; i >= 0; i--) {
|
||||
var char = code[i];
|
||||
if(char.match(/\d/)){
|
||||
lastOmocode = lastOmocode.substr(0,i) + this.OMOCODIA_TABLE[char] + lastOmocode.substr(i+1);
|
||||
results.push(lastOmocode + this.getCheckCode(lastOmocode));
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
CodiceFiscale.computeInverse = function(codiceFiscale) {
|
||||
var isValid = this.check(codiceFiscale);
|
||||
|
||||
if (isValid) {
|
||||
codiceFiscale = codiceFiscale.toUpperCase();
|
||||
} else {
|
||||
throw new TypeError('\'' + codiceFiscale + '\' is not a valid Codice Fiscale');
|
||||
}
|
||||
|
||||
var name = codiceFiscale.substr(3, 3);
|
||||
var surname = codiceFiscale.substr(0, 3);
|
||||
|
||||
var year = codiceFiscale.substr(6, 2);
|
||||
var yearList = [];
|
||||
var year19XX = parseInt('19' + year);
|
||||
var year20XX = parseInt('20' + year);
|
||||
var currentYear20XX = (new Date()).getFullYear();
|
||||
yearList.push(year19XX);
|
||||
if (currentYear20XX - year20XX >= 0) {
|
||||
yearList.push(year20XX);
|
||||
}
|
||||
|
||||
var monthChar = codiceFiscale.substr(8, 1);
|
||||
var month = this.MONTH_CODES.indexOf(monthChar) + 1;
|
||||
|
||||
var gender = 'M';
|
||||
var day = parseInt(codiceFiscale.substr(9, 2));
|
||||
if (day > 31) {
|
||||
gender = 'F';
|
||||
day = day - 40;
|
||||
}
|
||||
|
||||
var birthplace = '';
|
||||
var birthplace_provincia = '';
|
||||
for (var province in this.CODICI_CATASTALI) {
|
||||
birthplace = this.CODICI_CATASTALI[province].find(function(code) {
|
||||
return code[1] === codiceFiscale.substr(11, 4);
|
||||
})
|
||||
if (!!birthplace) {
|
||||
birthplace = birthplace[0];
|
||||
birthplace_provincia = province;
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
name: name,
|
||||
surname: surname,
|
||||
gender: gender,
|
||||
day: day,
|
||||
month: month,
|
||||
year: yearList,
|
||||
birthplace: birthplace,
|
||||
birthplace_provincia: birthplace_provincia
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CodiceFiscale.MONTH_CODES = ['A','B','C','D','E','H','L','M','P','R','S','T'];
|
||||
|
||||
CodiceFiscale.CHECK_CODE_ODD = {
|
||||
0:1, 1:0, 2:5, 3:7, 4:9, 5:13, 6:15, 7:17, 8:19,
|
||||
9:21, A:1, B:0, C:5, D:7, E:9, F:13, G:15, H:17,
|
||||
I:19, J:21, K:2, L:4, M:18, N:20, O:11, P:3, Q:6,
|
||||
R:8, S:12, T:14, U:16, V:10, W:22, X:25, Y:24, Z:23
|
||||
};
|
||||
|
||||
CodiceFiscale.CHECK_CODE_EVEN = {
|
||||
0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8,
|
||||
9:9, A:0, B:1, C:2, D:3, E:4, F:5, G:6, H:7,
|
||||
I:8, J:9, K:10, L:11, M:12, N:13, O:14, P:15, Q:16,
|
||||
R:17, S:18, T:19, U:20, V:21, W:22, X:23, Y:24, Z:25
|
||||
};
|
||||
|
||||
CodiceFiscale.OMOCODIA_TABLE = {
|
||||
"0":"L", "1":"M", "2":"N", "3":"P", "4":"Q",
|
||||
"5":"R", "6":"S", "7":"T", "8":"U", "9":"V"}
|
||||
|
||||
CodiceFiscale.CHECK_CODE_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
|
||||
CodiceFiscale.CODICI_CATASTALI = catastalCodes
|
||||
|
||||
module.exports = CodiceFiscale;
|
8664
src/constants.js
Normal file
8664
src/constants.js
Normal file
File diff suppressed because it is too large
Load Diff
192
src/index.js
Normal file
192
src/index.js
Normal file
@ -0,0 +1,192 @@
|
||||
import {
|
||||
MONTH_CODES,
|
||||
CHECK_CODE_ODD,
|
||||
CHECK_CODE_EVEN,
|
||||
OMOCODIA_TABLE,
|
||||
CHECK_CODE_CHARS,
|
||||
CODICI_CATASTALI
|
||||
} from './constants'
|
||||
|
||||
import deburr from 'lodash.deburr'
|
||||
|
||||
class CodiceFiscale {
|
||||
static compute (codiceFiscaleObject) {
|
||||
let code = this.surnameCode(codiceFiscaleObject.surname)
|
||||
code += this.nameCode(codiceFiscaleObject.name)
|
||||
code += this.dateCode(codiceFiscaleObject.day, codiceFiscaleObject.month, codiceFiscaleObject.year, codiceFiscaleObject.gender)
|
||||
code += this.findLocationCode(codiceFiscaleObject.birthplace, codiceFiscaleObject.birthplaceProvincia)
|
||||
code += this.getCheckCode(code)
|
||||
|
||||
return code
|
||||
}
|
||||
|
||||
static check (codiceFiscale) {
|
||||
if (typeof codiceFiscale !== 'string') return false
|
||||
codiceFiscale = codiceFiscale.toUpperCase()
|
||||
if (codiceFiscale.length !== 16) return false
|
||||
var expectedCheckCode = codiceFiscale.charAt(15)
|
||||
var cf = codiceFiscale.slice(0, 15)
|
||||
|
||||
return CodiceFiscale.getCheckCode(cf) === expectedCheckCode
|
||||
}
|
||||
|
||||
static estraiConsonanti (str) {
|
||||
return str.replace(/[^BCDFGHJKLMNPQRSTVWXYZ]/gi, '')
|
||||
}
|
||||
|
||||
static getCheckCode (codiceFiscale) {
|
||||
let val = 0
|
||||
for (let i = 0; i < 15; i++) {
|
||||
const c = codiceFiscale[i]
|
||||
val += i % 2 ? this.CHECK_CODE_EVEN[c] : this.CHECK_CODE_ODD[c]
|
||||
}
|
||||
val = val % 26
|
||||
return this.CHECK_CODE_CHARS.charAt(val)
|
||||
}
|
||||
|
||||
static estraiVocali (str) {
|
||||
return str.replace(/[^AEIOU]/gi, '')
|
||||
}
|
||||
|
||||
static surnameCode (surname) {
|
||||
let codeSurname = this.estraiConsonanti(surname) + this.estraiVocali(surname) + 'XXX'
|
||||
return codeSurname.substr(0, 3).toUpperCase()
|
||||
}
|
||||
|
||||
static nameCode (name) {
|
||||
let codNome = this.estraiConsonanti(name)
|
||||
if (codNome.length >= 4) {
|
||||
codNome = codNome.charAt(0) + codNome.charAt(2) + codNome.charAt(3)
|
||||
} else {
|
||||
codNome += this.estraiVocali(name) + 'XXX'
|
||||
codNome = codNome.substr(0, 3)
|
||||
}
|
||||
return codNome.toUpperCase()
|
||||
}
|
||||
|
||||
static dateCode (gg, mm, aa, gender) {
|
||||
const date = new Date()
|
||||
date.setYear(aa)
|
||||
date.setMonth(mm - 1)
|
||||
date.setDate(gg)
|
||||
// Padding year
|
||||
let year = '0' + date.getFullYear()
|
||||
year = year.substr(year.length - 2, 2)
|
||||
|
||||
let month = this.MONTH_CODES[date.getMonth()]
|
||||
let day = date.getDate()
|
||||
if (gender.toUpperCase() === 'F') day += 40
|
||||
|
||||
// Padding day
|
||||
day = '0' + day
|
||||
day = day.substr(day.length - 2, 2)
|
||||
return String(year + month + day)
|
||||
}
|
||||
|
||||
static findLocationCode (location, areaCode) {
|
||||
if (!this.CODICI_CATASTALI[this.normalizeString(areaCode)]) {
|
||||
throw new Error('Area code not found')
|
||||
}
|
||||
const locationCode = this.CODICI_CATASTALI[this.normalizeString(areaCode)]
|
||||
.reduce((code, locationTuple) => {
|
||||
return this.normalizeString(locationTuple[0]) === this.normalizeString(location)
|
||||
? locationTuple[1]
|
||||
: code
|
||||
}, undefined)
|
||||
if (locationCode == null) {
|
||||
throw new Error('Location not found')
|
||||
}
|
||||
return locationCode
|
||||
}
|
||||
|
||||
static normalizeString (str) {
|
||||
return deburr(str)
|
||||
.trim()
|
||||
.toUpperCase()
|
||||
.replace(/('|\s)/ig, '')
|
||||
}
|
||||
|
||||
static getOmocodie (code) {
|
||||
var results = []
|
||||
var lastOmocode = (code = code.slice(0, 15))
|
||||
for (var i = code.length - 1; i >= 0; i--) {
|
||||
var char = code[i]
|
||||
if (char.match(/\d/)) {
|
||||
lastOmocode =
|
||||
lastOmocode.substr(0, i) +
|
||||
this.OMOCODIA_TABLE[char] +
|
||||
lastOmocode.substr(i + 1)
|
||||
results.push(lastOmocode + this.getCheckCode(lastOmocode))
|
||||
}
|
||||
}
|
||||
return results
|
||||
}
|
||||
|
||||
static computeInverse (codiceFiscale) {
|
||||
var isValid = this.check(codiceFiscale)
|
||||
|
||||
if (isValid) {
|
||||
codiceFiscale = codiceFiscale.toUpperCase()
|
||||
} else {
|
||||
throw new Error(
|
||||
'Provided input is not a valid Codice Fiscale'
|
||||
)
|
||||
}
|
||||
|
||||
var name = codiceFiscale.substr(3, 3)
|
||||
var surname = codiceFiscale.substr(0, 3)
|
||||
|
||||
var year = codiceFiscale.substr(6, 2)
|
||||
var yearList = []
|
||||
var year19XX = parseInt('19' + year)
|
||||
var year20XX = parseInt('20' + year)
|
||||
var currentYear20XX = new Date().getFullYear()
|
||||
yearList.push(year19XX)
|
||||
if (currentYear20XX - year20XX >= 0) {
|
||||
yearList.push(year20XX)
|
||||
}
|
||||
|
||||
var monthChar = codiceFiscale.substr(8, 1)
|
||||
var month = MONTH_CODES.indexOf(monthChar) + 1
|
||||
|
||||
var gender = 'M'
|
||||
var day = parseInt(codiceFiscale.substr(9, 2))
|
||||
if (day > 31) {
|
||||
gender = 'F'
|
||||
day = day - 40
|
||||
}
|
||||
|
||||
var birthplace = ''
|
||||
var birthplaceProvincia = ''
|
||||
for (var province in this.CODICI_CATASTALI) {
|
||||
birthplace = this.CODICI_CATASTALI[province].find(function (code) {
|
||||
return code[1] === codiceFiscale.substr(11, 4)
|
||||
})
|
||||
if (birthplace) {
|
||||
birthplace = birthplace[0]
|
||||
birthplaceProvincia = province
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
name,
|
||||
surname,
|
||||
gender,
|
||||
day,
|
||||
month,
|
||||
year,
|
||||
birthplace,
|
||||
birthplaceProvincia
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CodiceFiscale.MONTH_CODES = MONTH_CODES
|
||||
CodiceFiscale.CHECK_CODE_ODD = CHECK_CODE_ODD
|
||||
CodiceFiscale.CHECK_CODE_EVEN = CHECK_CODE_EVEN
|
||||
CodiceFiscale.OMOCODIA_TABLE = OMOCODIA_TABLE
|
||||
CodiceFiscale.CHECK_CODE_CHARS = CHECK_CODE_CHARS
|
||||
CodiceFiscale.CODICI_CATASTALI = CODICI_CATASTALI
|
||||
|
||||
module.exports = CodiceFiscale
|
212
tests/index.spec.js
Normal file
212
tests/index.spec.js
Normal file
@ -0,0 +1,212 @@
|
||||
import CodiceFiscale from '../src/index'
|
||||
let { describe, test, expect } = global
|
||||
|
||||
describe('Codice Fiscale', () => {
|
||||
test('esiste un oggetto chiamato CodiceFiscale', () => {
|
||||
expect(CodiceFiscale).not.toBe(undefined)
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodiceFiscale.surnameCode', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.surnameCode).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test('restituisce il corretto risultato in caso di sufficienti consonanti', () => {
|
||||
expect(CodiceFiscale.surnameCode('Moreno')).toBe('MRN')
|
||||
})
|
||||
|
||||
test('restituisce il corretto risultato in caso di insufficienti consonanti', () => {
|
||||
expect(CodiceFiscale.surnameCode('Julea')).toBe('JLU')
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodiceFiscale.nameCode', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.nameCode).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test('restituisce il corretto risultato in caso di sufficienti consonanti', () => {
|
||||
expect(CodiceFiscale.nameCode('Marco')).toBe('MRC')
|
||||
})
|
||||
|
||||
test('restituisce il corretto risultato in caso di insufficienti consonanti', () => {
|
||||
expect(CodiceFiscale.nameCode('Luca')).toBe('LCU')
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodiceFiscale.dateCode', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.dateCode).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test('restituisce il corretto risultato', () => {
|
||||
expect(CodiceFiscale.dateCode(1, 1, 2000, 'M')).toBe('00A01')
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodiceFiscale.getCheckCode', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.getCheckCode).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test('restituisce il corretto risultato', () => {
|
||||
expect(CodiceFiscale.getCheckCode('MRNLCU00A01H501')).toBe('J')
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodiceFiscale.compute', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.compute).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test('calcola il codice fiscale', () => {
|
||||
expect(CodiceFiscale.compute({
|
||||
name: 'Luca',
|
||||
surname: 'Moreno',
|
||||
gender: 'M',
|
||||
day: 1,
|
||||
month: 1,
|
||||
year: 2000,
|
||||
birthplace: 'Roma',
|
||||
birthplaceProvincia: 'RM'
|
||||
}))
|
||||
.toBe('MRNLCU00A01H501J')
|
||||
})
|
||||
|
||||
test("calcola il codice fiscale di persone nate all'estero", () => {
|
||||
expect(CodiceFiscale.compute({
|
||||
name: 'Luca',
|
||||
surname: 'Moreno',
|
||||
gender: 'M',
|
||||
day: 1,
|
||||
month: 1,
|
||||
year: 2000,
|
||||
birthplace: 'Albania',
|
||||
birthplaceProvincia: 'EE'
|
||||
}))
|
||||
.toBe('MRNLCU00A01Z100P')
|
||||
})
|
||||
|
||||
test('se il comune non esiste lancia un eccezione', () => {
|
||||
var comuneInventato = function () {
|
||||
CodiceFiscale.compute({
|
||||
name: 'Luca',
|
||||
surname: 'Moreno',
|
||||
gender: 'M',
|
||||
day: 1,
|
||||
month: 1,
|
||||
year: 2000,
|
||||
birthplace: 'Foo',
|
||||
birthplaceProvincia: 'EE'
|
||||
})
|
||||
}
|
||||
expect(comuneInventato).toThrowError('Location not found')
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodiceFiscale.findLocationCode', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.findLocationCode).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test('trova il codice del comune', () => {
|
||||
expect(CodiceFiscale.findLocationCode('Roma', 'RM')).toBe('H501')
|
||||
})
|
||||
|
||||
test('trova il codice di un comune che contiene apostrofi', () => {
|
||||
expect(CodiceFiscale.findLocationCode("Sant'Angelo Romano", 'RM')).toBe('I284')
|
||||
})
|
||||
|
||||
test('trova il codice di un comune che contiene lettere accentate', () => {
|
||||
expect(CodiceFiscale.findLocationCode('Riccò del Golfo di Spezia', 'SP')).toBe('H275')
|
||||
})
|
||||
|
||||
test('se la provincia non esiste lancia un eccezione', () => {
|
||||
var comuneInventato = function () {
|
||||
CodiceFiscale.findLocationCode('Foo', 'Bar')
|
||||
}
|
||||
expect(comuneInventato).toThrowError('Area code not found')
|
||||
})
|
||||
|
||||
test('se il comune non esiste lancia un eccezione', () => {
|
||||
var comuneInventato = function () {
|
||||
CodiceFiscale.findLocationCode('Foo', 'RM')
|
||||
}
|
||||
expect(comuneInventato).toThrowError('Location not found')
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodiceFiscale.check', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.check).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test('controlla se il codice fiscale è valido', () => {
|
||||
expect(CodiceFiscale.check('MRNLCU00A01H501J')).toBe(true)
|
||||
})
|
||||
|
||||
test('controlla che sia composto dal non più 16 valori alfanumerici', () => {
|
||||
expect(CodiceFiscale.check('MRNLCU00A01H501JK')).toBe(false)
|
||||
})
|
||||
|
||||
test('controlla che sia composto dal almeno 16 valori alfanumerici', () => {
|
||||
expect(CodiceFiscale.check('MRNLCU00A01H501J3')).toBe(false)
|
||||
})
|
||||
|
||||
test('controlla che il carattere di controllo sia esatto', () => {
|
||||
expect(CodiceFiscale.check('VNDLDL87D07B963G')).toBe(false)
|
||||
})
|
||||
|
||||
test('funziona anche in caso di omocodie', () => {
|
||||
expect(CodiceFiscale.check('BNZVCN32S10E57PV')).toBe(true)
|
||||
expect(CodiceFiscale.check('BNZVCNPNSMLERTPX')).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
describe('CodiceFiscale.getOmocodie', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.getOmocodie).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test('calcola le omocodie dato un codice fiscale', () => {
|
||||
expect(CodiceFiscale.getOmocodie('BNZVCN32S10E573Z'))
|
||||
.toEqual(expect.arrayContaining(['BNZVCN32S10E57PV', 'BNZVCNPNSMLERTPX']))
|
||||
})
|
||||
})
|
||||
|
||||
describe('Calcolo codice fiscale inverso -> metodo .computeInverse', () => {
|
||||
test('è definito', () => {
|
||||
expect(CodiceFiscale.computeInverse).not.toBe(undefined)
|
||||
})
|
||||
|
||||
test("se l'input non è una stringa lancia un eccezione", () => {
|
||||
var notAString = function () {
|
||||
CodiceFiscale.computeInverse(0)
|
||||
}
|
||||
expect(notAString).toThrowError('Provided input is not a valid Codice Fiscale')
|
||||
})
|
||||
|
||||
test("restituisce falso se l'input è stringa formattata male", () => {
|
||||
var notValid = function () {
|
||||
CodiceFiscale.computeInverse('BNZVCN32SC0E573Z')
|
||||
}
|
||||
expect(notValid).toThrowError('Provided input is not a valid Codice Fiscale')
|
||||
})
|
||||
|
||||
test('restituisce il genere corretto', () => {
|
||||
expect(CodiceFiscale.computeInverse('MRNLCU00A01H501J').gender).toEqual('M')
|
||||
})
|
||||
|
||||
test('restituisce la città natale corretta', () => {
|
||||
expect(CodiceFiscale.computeInverse('MRNLCU00A01H501J').birthplace).toEqual('ROMA')
|
||||
})
|
||||
|
||||
test('restituisce la provincia della città natale corretta', () => {
|
||||
expect(CodiceFiscale.computeInverse('MRNLCU00A01H501J').birthplaceProvincia).toEqual('RM')
|
||||
})
|
||||
|
||||
test('restituisce il giorno di nascita come numero compreso tra 1 e 31', () => {
|
||||
expect(CodiceFiscale.computeInverse('MRNLCU00A01H501J').day >= 1 && CodiceFiscale.computeInverse('MRNLCU00A01H501J').day <= 31).toBe(true)
|
||||
})
|
||||
})
|
144
tests/specs.js
144
tests/specs.js
@ -1,144 +0,0 @@
|
||||
describe("Codice Fiscale", function() {
|
||||
it("esiste un oggetto chiamato CodiceFiscale", function() {
|
||||
expect(CodiceFiscale).not.toBe(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe("CodiceFiscale.compute", function() {
|
||||
it("è definito", function() {
|
||||
expect(CodiceFiscale.compute).not.toBe(undefined);
|
||||
});
|
||||
|
||||
it("calcola il codice fiscale", function() {
|
||||
expect(CodiceFiscale.compute("Luca", "Moreno",'M', 1, 1, 2000, "Roma", "RM")).toBe("MRNLCU00A01H501J");
|
||||
});
|
||||
|
||||
it("calcola il codice fiscale da un oggetto JSON", function() {
|
||||
expect(CodiceFiscale.compute({
|
||||
name: "Luca",
|
||||
surname: "Moreno",
|
||||
gender: 'M',
|
||||
day: 1,
|
||||
month: 1,
|
||||
year: 2000,
|
||||
birthplace: "Roma",
|
||||
birthplace_provincia:"RM"
|
||||
})).toBe("MRNLCU00A01H501J");
|
||||
});
|
||||
|
||||
|
||||
it("calcola il codice fiscale di persone nate all'estero", function() {
|
||||
expect(CodiceFiscale.compute("Luca", "Moreno",'M', 1, 1, 2000, "Albania", "EE")).toBe("MRNLCU00A01Z100P");
|
||||
});
|
||||
|
||||
it("calcola il codice fiscale all'estero da un oggetto JSON", function() {
|
||||
expect(CodiceFiscale.compute({
|
||||
name: "Luca",
|
||||
surname: "Moreno",
|
||||
gender: 'M',
|
||||
day: 1,
|
||||
month: 1,
|
||||
year: 2000,
|
||||
birthplace: "Albania",
|
||||
birthplace_provincia:"EE"
|
||||
})).toBe("MRNLCU00A01Z100P");
|
||||
});
|
||||
|
||||
it("se il comune non esiste lancia un eccezione", function() {
|
||||
var comuneInventato = function(){
|
||||
CodiceFiscale.compute("Luca", "Moreno",'M', 1, 1, 2000, "Pufflandia", "CE");
|
||||
}
|
||||
expect(comuneInventato).toThrowError("Comune not found");
|
||||
});
|
||||
});
|
||||
|
||||
describe("CodiceFiscale.findComuneCode", function() {
|
||||
it("è definito", function() {
|
||||
expect(CodiceFiscale.findComuneCode).not.toBe(undefined);
|
||||
});
|
||||
|
||||
it("trova il codice del comune", function() {
|
||||
expect(CodiceFiscale.findComuneCode("Roma", "RM")).toBe("H501");
|
||||
});
|
||||
|
||||
it("se il comune non esiste lancia un eccezione", function() {
|
||||
var comuneInventato = function(){
|
||||
CodiceFiscale.findComuneCode("Pufflandia", "RM");
|
||||
}
|
||||
expect(comuneInventato).toThrowError("Comune not found");
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
describe("CodiceFiscale.check", function() {
|
||||
it("è definito", function() {
|
||||
expect(CodiceFiscale.check).not.toBe(undefined);
|
||||
});
|
||||
|
||||
it("controlla se il codice fiscale è valido", function() {
|
||||
expect(CodiceFiscale.check("MRNLCU00A01H501J")).toBe(true);
|
||||
});
|
||||
|
||||
it("controlla che sia composto dal non più 16 valori alfanumerici", function() {
|
||||
expect(CodiceFiscale.check("MRNLCU00A01H501JK")).toBe(false);
|
||||
});
|
||||
|
||||
it("controlla che sia composto dal almeno 16 valori alfanumerici", function() {
|
||||
expect(CodiceFiscale.check("MRNLCU00A01H501J3")).toBe(false);
|
||||
});
|
||||
|
||||
it("controlla che il carattere di controllo sia esatto", function() {
|
||||
expect(CodiceFiscale.check("VNDLDL87D07B963G")).toBe(false);
|
||||
});
|
||||
|
||||
it("funziona anche in caso di omocodie", function() {
|
||||
expect(CodiceFiscale.check("BNZVCN32S10E57PV")).toBe(true);
|
||||
expect(CodiceFiscale.check("BNZVCNPNSMLERTPX")).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe("CodiceFiscale.getOmocodie", function() {
|
||||
it("è definito", function() {
|
||||
expect(CodiceFiscale.getOmocodie).not.toBe(undefined);
|
||||
});
|
||||
|
||||
it("calcola le omocodie dato un codice fiscale", function() {
|
||||
expect(CodiceFiscale.getOmocodie("BNZVCN32S10E573Z"))
|
||||
.toEqual(jasmine.arrayContaining(["BNZVCN32S10E57PV", "BNZVCNPNSMLERTPX"]));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
describe("Calcolo codice fiscale inverso -> metodo .computeInverse", function() {
|
||||
it("è definito", function() {
|
||||
expect(CodiceFiscale.computeInverse).not.toBe(undefined);
|
||||
});
|
||||
|
||||
it("restituisce falso se l'input non è stringa", function() {
|
||||
expect(CodiceFiscale.computeInverse(null)).toEqual(false);
|
||||
});
|
||||
|
||||
it("restituisce falso se l'input è stringa formattata male", function() {
|
||||
expect(CodiceFiscale.computeInverse("BNZVCN32SC0E573Z")).toEqual(false);
|
||||
});
|
||||
|
||||
it("restituisce il genere corretto", function() {
|
||||
expect(CodiceFiscale.computeInverse("MRNLCU00A01H501J").gender).toEqual(jasmine.arrayContaining(["M", "MASCHIO"]));
|
||||
});
|
||||
|
||||
it("restituisce la città natale corretta", function() {
|
||||
expect(CodiceFiscale.computeInverse("MRNLCU00A01H501J").birthplace).toEqual('ROMA');
|
||||
});
|
||||
|
||||
it("restituisce la provincia della città natale corretta", function() {
|
||||
expect(CodiceFiscale.computeInverse("MRNLCU00A01H501J").birthplace_provincia).toEqual('RM');
|
||||
});
|
||||
|
||||
it("restituisce il giorno di nascita come numero compreso tra 1 e 31", function() {
|
||||
expect(CodiceFiscale.computeInverse("MRNLCU00A01H501J").day >= 1 && CodiceFiscale.computeInverse("MRNLCU00A01H501J").day <= 31).toBe(true);
|
||||
});
|
||||
});
|
@ -1,19 +1,48 @@
|
||||
const path = require('path'),
|
||||
UglifyJSPlugin = require('uglifyjs-webpack-plugin');
|
||||
const path = require('path')
|
||||
const webpack = require('webpack')
|
||||
const createVariants = require('parallel-webpack').createVariants
|
||||
|
||||
function createConfig (options) {
|
||||
return {
|
||||
entry: {
|
||||
'codice.fiscale': './src/index.js'
|
||||
},
|
||||
output: {
|
||||
path: path.resolve(__dirname, 'dist'),
|
||||
filename: 'codice.fiscale.' + options.target + '.js',
|
||||
library: 'CodiceFiscale',
|
||||
libraryTarget: options.target
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.json$/,
|
||||
loader: 'json-loader'
|
||||
}, {
|
||||
test: /\.js$/,
|
||||
exclude: /(node_modules|bower_components)/,
|
||||
use: {
|
||||
loader: 'babel-loader',
|
||||
options: {
|
||||
presets: ['babel-preset-env']
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
plugins: [
|
||||
new webpack
|
||||
.optimize
|
||||
.UglifyJsPlugin()
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
entry: {
|
||||
'codice.fiscale': './src/codice.fiscale.js'
|
||||
},
|
||||
output: {
|
||||
// this will publish the module on the window object in order to support the karma tests
|
||||
library: 'CodiceFiscale',
|
||||
libraryTarget: 'window',
|
||||
filename: '[name].js',
|
||||
path: path.resolve(__dirname, 'dist')
|
||||
},
|
||||
plugins: [
|
||||
new UglifyJSPlugin()
|
||||
module.exports = createVariants({
|
||||
target: [
|
||||
'var',
|
||||
'commonjs2',
|
||||
'umd',
|
||||
'amd'
|
||||
]
|
||||
};
|
||||
}, createConfig)
|
||||
|
Loading…
Reference in New Issue
Block a user