UNPKG

br-validations

Version:

A library of validations applicable to several Brazilian data like I.E., CNPJ, CPF and others

669 lines (613 loc) 16.2 kB
/** * br-validations * A library of validations applicable to several Brazilian data like I.E., CNPJ, CPF and others * @version v0.3.0 * @link http://github.com/the-darc/br-validations * @license MIT */ (function (root, factory) { /* istanbul ignore next */ if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define([], factory); } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(); } else { // Browser globals (root is window) root.BrV = factory(); } }(this, function () { var CNPJ = {}; CNPJ.validate = function(c) { var b = [6,5,4,3,2,9,8,7,6,5,4,3,2]; c = c.replace(/[^\d]/g,''); var r = /^(0{14}|1{14}|2{14}|3{14}|4{14}|5{14}|6{14}|7{14}|8{14}|9{14})$/; if (!c || c.length !== 14 || r.test(c)) { return false; } c = c.split(''); for (var i = 0, n = 0; i < 12; i++) { n += c[i] * b[i+1]; } n = 11 - n%11; n = n >= 10 ? 0 : n; if (parseInt(c[12]) !== n) { return false; } for (i = 0, n = 0; i <= 12; i++) { n += c[i] * b[i]; } n = 11 - n%11; n = n >= 10 ? 0 : n; if (parseInt(c[13]) !== n) { return false; } return true; }; var CPF = {}; CPF.validate = function(cpf) { cpf = cpf.replace(/[^\d]+/g,''); var r = /^(0{11}|1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11})$/; if (!cpf || cpf.length !== 11 || r.test(cpf)) { return false; } function validateDigit(digit) { var add = 0; var init = digit - 9; for (var i = 0; i < 9; i ++) { add += parseInt(cpf.charAt(i + init)) * (i+1); } return (add%11)%10 === parseInt(cpf.charAt(digit)); } return validateDigit(9) && validateDigit(10); }; var IE = function(uf) { if (!(this instanceof IE)) { return new IE(uf); } this.rules = IErules[uf] || []; this.rule; IE.prototype._defineRule = function(value) { this.rule = undefined; for (var r = 0; r < this.rules.length && this.rule === undefined; r++) { var str = value.replace(/[^\d]/g,''); var ruleCandidate = this.rules[r]; if (str.length === ruleCandidate.chars && (!ruleCandidate.match || ruleCandidate.match.test(value))) { this.rule = ruleCandidate; } } return !!this.rule; }; IE.prototype.validate = function(value) { if (!value || !this._defineRule(value)) { return false; } return this.rule.validate(value); }; }; 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); } }]; var PIS = {}; PIS.validate = function(pis) { pis = pis.replace(/[^\d]+/g,''); var r = /^(0{11}|1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11})$/; if (!pis || pis.length !== 11 || r.test(pis)) { return false; } var pisi = pis.substring(0,10); var pisd = pis.substring(10); function calculateDigit(pis){ var p = [3,2,9,8,7,6,5,4,3,2]; var s = 0; for(var i = 0; i <= 9; i++){ s += parseInt(pis.charAt(i)) * p[i]; } var r = 11 - (s%11); return (r === 10 || r === 11) ? 0 : r; } return Number(pisd) === calculateDigit(pisi); }; return { ie: IE, cpf: CPF, cnpj: CNPJ, pis: PIS }; }));