UNPKG

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
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); } }];