br-validations
Version:
A library of validations applicable to several Brazilian data like I.E., CNPJ, CPF and others
534 lines (496 loc) • 13.1 kB
JavaScript
var IErules = {};
var algorithmSteps = {
handleStr: {
onlyNumbers: function(str) {
return str.replace(/[^\d]/g,'').split('');
},
mgSpec: function(str) {
var s = str.replace(/[^\d]/g,'');
s = s.substr(0,3)+'0'+s.substr(3, s.length);
return s.split('');
}
},
sum: {
normalSum: function(handledStr, pesos) {
var nums = handledStr;
var sum = 0;
for (var i = 0; i < pesos.length; i++) {
sum += parseInt(nums[i]) * pesos[i];
}
return sum;
},
individualSum: function(handledStr, pesos) {
var nums = handledStr;
var sum = 0;
for (var i = 0; i < pesos.length; i++) {
var mult = parseInt(nums[i]) * pesos[i];
sum += mult%10 + parseInt(mult/10);
}
return sum;
},
apSpec: function(handledStr, pesos) {
var sum = this.normalSum(handledStr, pesos);
var ref = handledStr.join('');
if (ref >= '030000010' && ref <= '030170009') {
return sum + 5;
}
if (ref >= '030170010' && ref <= '030190229') {
return sum + 9;
}
return sum;
}
},
rest: {
mod11: function(sum) {
return sum%11;
},
mod10: function(sum) {
return sum%10;
},
mod9: function(sum) {
return sum%9;
}
},
expectedDV: {
minusRestOf11: function(rest) {
return rest < 2 ? 0 : 11 - rest;
},
minusRestOf11v2: function(rest) {
return rest < 2 ? 11 - rest - 10 : 11 - rest;
},
minusRestOf10: function(rest) {
return rest < 1 ? 0 : 10 - rest;
},
mod10: function(rest) {
return rest%10;
},
goSpec: function(rest, handledStr) {
var ref = handledStr.join('');
if (rest === 1) {
return ref >= '101031050' && ref <= '101199979' ? 1 : 0;
}
return rest === 0 ? 0 : 11 - rest;
},
apSpec: function(rest, handledStr) {
var ref = handledStr.join('');
if (rest === 0) {
return ref >= '030170010' && ref <= '030190229' ? 1 : 0;
}
return rest === 1 ? 0 : 11 - rest;
},
voidFn: function(rest) {
return rest;
}
}
};
/**
* options {
* pesos: Array of values used to operate in sum step
* dvPos: Position of the DV to validate considering the handledStr
* algorithmSteps: The four DV's validation algorithm steps names
* }
*/
function validateDV(value, options) {
var steps = options.algorithmSteps;
// Step 01: Handle String
var handledStr = algorithmSteps.handleStr[steps[0]](value);
// Step 02: Sum chars
var sum = algorithmSteps.sum[steps[1]](handledStr, options.pesos);
// Step 03: Rest calculation
var rest = algorithmSteps.rest[steps[2]](sum);
// Fixed Step: Get current DV
var currentDV = parseInt(handledStr[options.dvpos]);
// Step 04: Expected DV calculation
var expectedDV = algorithmSteps.expectedDV[steps[3]](rest, handledStr);
// Fixed step: DV verification
return currentDV === expectedDV;
}
function validateIE(value, rule) {
for (var i = 0; i < rule.dvs.length; i++) {
// console.log('>> >> dv'+i);
if (!validateDV(value, rule.dvs[i])) {
return false;
}
}
return true;
}
IErules.PE = [{
//mask: new StringMask('0000000-00'),
chars: 9,
dvs: [{
dvpos: 7,
pesos: [8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
},{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
},{
// mask: new StringMask('00.0.000.0000000-0'),
chars: 14,
pesos: [[1,2,3,4,5,9,8,7,6,5,4,3,2]],
dvs: [{
dvpos: 13,
pesos: [5,4,3,2,1,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11v2']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.RS = [{
// mask: new StringMask('000/0000000'),
chars: 10,
dvs: [{
dvpos: 9,
pesos: [2,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.AC = [{
// mask: new StringMask('00.000.000/000-00'),
chars: 13,
match: /^01/,
dvs: [{
dvpos: 11,
pesos: [4,3,2,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
},{
dvpos: 12,
pesos: [5,4,3,2,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.MG = [{
// mask: new StringMask('000.000.000/0000'),
chars: 13,
dvs: [{
dvpos: 12,
pesos: [1,2,1,2,1,2,1,2,1,2,1,2],
algorithmSteps: ['mgSpec', 'individualSum', 'mod10', 'minusRestOf10']
},{
dvpos: 12,
pesos: [3,2,11,10,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.SP = [{
// mask: new StringMask('000.000.000.000'),
chars: 12,
match: /^[0-9]/,
dvs: [{
dvpos: 8,
pesos: [1,3,4,5,6,7,8,10],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'mod10']
},{
dvpos: 11,
pesos: [3,2,10,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'mod10']
}],
validate: function(value) { return validateIE(value, this); }
},{
// mask: new StringMask('P-00000000.0/000')
chars: 12,
match: /^P/i,
dvs: [{
dvpos: 8,
pesos: [1,3,4,5,6,7,8,10],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'mod10']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.DF = [{
// mask: new StringMask('00000000000-00'),
chars: 13,
dvs: [{
dvpos: 11,
pesos: [4,3,2,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
},{
dvpos: 12,
pesos: [5,4,3,2,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.ES = [{
// mask: new StringMask('000.000.00-0')
chars: 9,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.BA = [{
// mask: new StringMask('000000-00')
chars: 8,
match: /^[0123458]/,
dvs: [{
dvpos: 7,
pesos: [7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod10', 'minusRestOf10']
},{
dvpos: 6,
pesos: [8,7,6,5,4,3,0,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod10', 'minusRestOf10']
}],
validate: function(value) { return validateIE(value, this); }
},{
chars: 8,
match: /^[679]/,
dvs: [{
dvpos: 7,
pesos: [7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
},{
dvpos: 6,
pesos: [8,7,6,5,4,3,0,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
},{
// mask: new StringMask('0000000-00')
chars: 9,
match: /^[0-9][0123458]/,
dvs: [{
dvpos: 8,
pesos: [8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod10', 'minusRestOf10']
},{
dvpos: 7,
pesos: [9,8,7,6,5,4,3,0,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod10', 'minusRestOf10']
}],
validate: function(value) { return validateIE(value, this); }
},{
chars: 9,
match: /^[0-9][679]/,
dvs: [{
dvpos: 8,
pesos: [8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
},{
dvpos: 7,
pesos: [9,8,7,6,5,4,3,0,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.AM = [{
//mask: new StringMask('00.000.000-0')
chars: 9,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.RN = [{
// {mask: new StringMask('00.000.000-0')
chars: 9,
match: /^20/,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
},{
// {mask: new StringMask('00.0.000.000-0'), chars: 10}
chars: 10,
match: /^20/,
dvs: [{
dvpos: 8,
pesos: [10,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.RO = [{
// mask: new StringMask('0000000000000-0')
chars: 14,
dvs: [{
dvpos: 13,
pesos: [6,5,4,3,2,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11v2']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.PR = [{
// mask: new StringMask('00000000-00')
chars: 10,
dvs: [{
dvpos: 8,
pesos: [3,2,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
},{
dvpos: 9,
pesos: [4,3,2,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.SC = [{
// {mask: new StringMask('000.000.000'), uf: 'SANTA CATARINA'}
chars: 9,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.RJ = [{
// {mask: new StringMask('00.000.00-0'), uf: 'RIO DE JANEIRO'}
chars: 8,
dvs: [{
dvpos: 7,
pesos: [2,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.PA = [{
// {mask: new StringMask('00-000000-0')
chars: 9,
match: /^15/,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.SE = [{
// {mask: new StringMask('00000000-0')
chars: 9,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.PB = [{
// {mask: new StringMask('00000000-0')
chars: 9,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.CE = [{
// {mask: new StringMask('00000000-0')
chars: 9,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.PI = [{
// {mask: new StringMask('000000000')
chars: 9,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.MA = [{
// {mask: new StringMask('000000000')
chars: 9,
match: /^12/,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.MT = [{
// {mask: new StringMask('0000000000-0')
chars: 11,
dvs: [{
dvpos: 10,
pesos: [3,2,9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.MS = [{
// {mask: new StringMask('000000000')
chars: 9,
match: /^28/,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.TO = [{
// {mask: new StringMask('00000000000'),
chars: 11,
match: /^[0-9]{2}((0[123])|(99))/,
dvs: [{
dvpos: 10,
pesos: [9,8,0,0,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.AL = [{
// {mask: new StringMask('000000000')
chars: 9,
match: /^24[03578]/,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'minusRestOf11']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.RR = [{
// {mask: new StringMask('00000000-0')
chars: 9,
match: /^24/,
dvs: [{
dvpos: 8,
pesos: [1,2,3,4,5,6,7,8],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod9', 'voidFn']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.GO = [{
// {mask: new StringMask('00.000.000-0')
chars: 9,
match: /^1[015]/,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'normalSum', 'mod11', 'goSpec']
}],
validate: function(value) { return validateIE(value, this); }
}];
IErules.AP = [{
// {mask: new StringMask('000000000')
chars: 9,
match: /^03/,
dvs: [{
dvpos: 8,
pesos: [9,8,7,6,5,4,3,2],
algorithmSteps: ['onlyNumbers', 'apSpec', 'mod11', 'apSpec']
}],
validate: function(value) { return validateIE(value, this); }
}];