How to enable Brazil CPF number validation without creating extra fields?
When customizing the Magento 2 checkout page due to Brazilian market, we should enable CPF/CNPJ fields. There is also a way to let users specify their identification numbers without creating extra fields. Let’s do it here.
We will apply a field mask and validation code during typing a code.
Note: learn more about field masks.
Now please follow the steps.
- Create a custom.js
- Put this js code in your custom.js file.
define([
'jquery',
'underscore',
'Swissup_Firecheckout/js/utils/form-field/mask',
'Swissup_Firecheckout/js/utils/form-field/validator'
], function ($, _, mask, validator) {
'use strict';
//define address form in which need to use the CPF/CNPJ code
var scopes = [
'.form-shipping-address',
'.billing-address-form'
];
_.each(scopes, function (scope) {
//set a field mask according to cpf/cnpj code
mask(scope + ' [name="vat_id"]', {
guide: false,
mask: function (raw) {
var mask = [/\d/, /\d/,'.',/\d/,/\d/,/\d/,'.',/\d/,/\d/,/\d/,'/',/\d/,/\d/,/\d/,/\d/,'-',/\d/,/\d/];
if (raw.length == 14) {
mask = [/\d/, /\d/, /\d/,'.',/\d/,/\d/,/\d/,'.',/\d/,/\d/,/\d/,'-',/\d/,/\d/];
}
return mask;
}
});
//validation cpf/cnpj code
validator(scope + ' [name="vat_id"]', {
'lazy': false,
'fc-custom-rule-vatid': {
handler: function (value) {
var strNumbers, splNumbers;
splNumbers = value.split(/[\/\.-]/);
strNumbers = splNumbers.join("");
if (value.length == 18) {
var cnpj = new RegExp(/^([0-9]{2}(.)[0-9]{3}(.)[0-9]{3}(\/)[0-9]{4}(-)[0-9]{2})$/).test(value);
// Checking for known cnpj invalid code
if ( cnpj && strNumbers == "00000000000000" ||
strNumbers == "11111111111111" ||
strNumbers == "22222222222222" ||
strNumbers == "33333333333333" ||
strNumbers == "44444444444444" ||
strNumbers == "55555555555555" ||
strNumbers == "66666666666666" ||
strNumbers == "77777777777777" ||
strNumbers == "88888888888888" ||
strNumbers == "99999999999999"
)
{ return false; }
var numSize, numbers, lastDigits, sum, pos, result;
numSize = strNumbers.length - 2
numbers = strNumbers.substring(0,numSize);
lastDigits = strNumbers.substring(numSize);
sum = 0;
pos = numSize - 7;
for (i = numSize; i >= 1; i--) {
sum += numbers.charAt(numSize - i) * pos--;
if (pos < 2) pos = 9;
}
result = sum % 11 < 2 ? 0 : 11 - sum % 11;
if (result != lastDigits.charAt(0)) return false;
numSize = numSize + 1;
numbers = strNumbers.substring(0,numSize);
sum = 0;
pos = numSize - 7;
for (i = numSize; i >= 1; i--) {
sum += numbers.charAt(numSize - i) * pos--;
if (pos < 2) pos = 9;
}
result = sum % 11 < 2 ? 0 : 11 - sum % 11;
if (result != lastDigits.charAt(1)) return false;
return cnpj;
}else {
var cpf, sum = 0,
firstCN, secondCN, checkResult;
cpf = new RegExp(/^([0-9]{3}(.)[0-9]{3}(.)[0-9]{3}(-)[0-9]{2})$/).test(value);
firstCN = parseInt(strNumbers.substring(9, 10), 10);
secondCN = parseInt(strNumbers.substring(10, 11), 10);
checkResult = function(sum, cn) {
var result = (sum * 10) % 11;
if ((result === 10) || (result === 11)) {result = 0;}
return (result === cn);
};
// Checking for known cpf invalid code
if (cpf && strNumbers == "00000000000" ||
strNumbers == "11111111111" ||
strNumbers == "22222222222" ||
strNumbers == "33333333333" ||
strNumbers == "44444444444" ||
strNumbers == "55555555555" ||
strNumbers == "66666666666" ||
strNumbers == "77777777777" ||
strNumbers == "88888888888" ||
strNumbers == "99999999999"
)
{ return false; }
// validate first Check Number:
for (var i = 1; i <= 9; i++ ) {
sum = sum + parseInt(strNumbers.substring(i - 1, i), 10) * (11 - i);
}
// validate second Check Number:
if ( checkResult(sum, firstCN) ) {
sum = 0;
for (var i = 1; i <= 10; i++ ) {
sum = sum + parseInt(strNumbers.substring(i - 1, i), 10) * (12 - i);
}
return checkResult(sum, secondCN);
}
return false;
}
},
message: $t('Invalid vat ID ')
}
});
});
});
- Save the file and run the following bash commands to deploy the script:
cd magento/root/folder
rm -rf var/view_preprocessed pub/static/frontend
bin/magento setup:static-content:deploy