@xsolla/payment-client-core 0.2.75 → 0.2.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/core/payment/form/converters/cpf-number/cpf-number.converter.mjs +5 -1
- package/esm2022/lib/core/payment/form/validators/cpf-formula-validator/cpf-formula.validator.mjs +55 -0
- package/fesm2022/xsolla-payment-client-core.mjs +55 -0
- package/fesm2022/xsolla-payment-client-core.mjs.map +1 -1
- package/lib/core/payment/form/converters/cpf-number/cpf-number.converter.d.ts +2 -0
- package/lib/core/payment/form/validators/cpf-formula-validator/cpf-formula.validator.d.ts +6 -0
- package/package.json +1 -1
- package/xsolla-payment-client-core-0.2.76.tgz +0 -0
- package/xsolla-payment-client-core-0.2.75.tgz +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { TextControlConfig } from '../../controls/text-control.config';
|
|
3
|
+
import { cpfFormulaValidator } from '../../validators/cpf-formula-validator/cpf-formula.validator';
|
|
3
4
|
import { Converter } from '../converter.abstract';
|
|
4
5
|
import { TranslateHelper } from '../../../../../shared/translate/translate.helper';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
@@ -8,6 +9,9 @@ export class CpfNumberConverter extends Converter {
|
|
|
8
9
|
constructor(syncService) {
|
|
9
10
|
super(syncService);
|
|
10
11
|
}
|
|
12
|
+
getValidators(field) {
|
|
13
|
+
return super.getValidators(field).concat([cpfFormulaValidator]);
|
|
14
|
+
}
|
|
11
15
|
createControlConfig(field) {
|
|
12
16
|
const config = this.createDefaultControlConfig(TextControlConfig, field);
|
|
13
17
|
config.maskConfig = {
|
|
@@ -29,4 +33,4 @@ export class CpfNumberConverter extends Converter {
|
|
|
29
33
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CpfNumberConverter, decorators: [{
|
|
30
34
|
type: Injectable
|
|
31
35
|
}], ctorParameters: () => [{ type: i1.SyncService }] });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BmLW51bWJlci5jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wYXltZW50LWNsaWVudC1jb3JlL3NyYy9saWIvY29yZS9wYXltZW50L2Zvcm0vY29udmVydGVycy9jcGYtbnVtYmVyL2NwZi1udW1iZXIuY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDbkcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7O0FBR25GLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTO0lBQy9DLFlBQW1CLFdBQXdCO1FBQ3pDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRU0sYUFBYSxDQUFDLEtBQVk7UUFDL0IsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBWTtRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFekUsTUFBTSxDQUFDLFVBQVUsR0FBRztZQUNsQixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBRUYsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFN0IsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUNwQyxrQ0FBa0MsRUFDbEMsZ0JBQWdCLENBQ2pCLENBQUM7UUFFRixNQUFNLENBQUMsT0FBTyxHQUFHO1lBQ2YsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQ3JCLG1DQUFtQyxFQUNuQyx3Q0FBd0MsQ0FDekM7WUFDRCxLQUFLLEVBQUUsWUFBWTtTQUNwQixDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs4R0FsQ1Usa0JBQWtCO2tIQUFsQixrQkFBa0I7OzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vZmllbGQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vcmVxdWVzdHMvc3luYy9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dENvbnRyb2xDb25maWcgfSBmcm9tICcuLi8uLi9jb250cm9scy90ZXh0LWNvbnRyb2wuY29uZmlnJztcbmltcG9ydCB7IGNwZkZvcm11bGFWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL2NwZi1mb3JtdWxhLXZhbGlkYXRvci9jcGYtZm9ybXVsYS52YWxpZGF0b3InO1xuaW1wb3J0IHsgQ29udmVydGVyIH0gZnJvbSAnLi4vY29udmVydGVyLmFic3RyYWN0JztcbmltcG9ydCB7IFRyYW5zbGF0ZUhlbHBlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlZC90cmFuc2xhdGUvdHJhbnNsYXRlLmhlbHBlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDcGZOdW1iZXJDb252ZXJ0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc3luY1NlcnZpY2U6IFN5bmNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoc3luY1NlcnZpY2UpO1xuICB9XG5cbiAgcHVibGljIGdldFZhbGlkYXRvcnMoZmllbGQ6IEZpZWxkKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFZhbGlkYXRvcnMoZmllbGQpLmNvbmNhdChbY3BmRm9ybXVsYVZhbGlkYXRvcl0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbnRyb2xDb25maWcoZmllbGQ6IEZpZWxkKTogVGV4dENvbnRyb2xDb25maWcge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY3JlYXRlRGVmYXVsdENvbnRyb2xDb25maWcoVGV4dENvbnRyb2xDb25maWcsIGZpZWxkKTtcblxuICAgIGNvbmZpZy5tYXNrQ29uZmlnID0ge1xuICAgICAgbWFzazogJzk5OS45OTkuOTk5LTk5JyxcbiAgICAgIHVubWFza01vZGVsVmFsdWU6IHRydWUsXG4gICAgICBndWlkZTogZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbmZpZy5pbnB1dE1vZGUgPSAnbnVtZXJpYyc7XG5cbiAgICBjb25maWcucGxhY2Vob2xkZXIgPSBUcmFuc2xhdGVIZWxwZXIudChcbiAgICAgICdjcGYtbnVtYmVyLmNvbnZlcnRlci5wbGFjZWhvbGRlcicsXG4gICAgICAnMDAwLjAwMC4wMDAtMDAnXG4gICAgKTtcblxuICAgIGNvbmZpZy50b29sdGlwID0ge1xuICAgICAgdGV4dDogVHJhbnNsYXRlSGVscGVyLnQoXG4gICAgICAgICdjcGYtbnVtYmVyLmNvbnZlcnRlci50b29sdGlwLnRleHQnLFxuICAgICAgICAnV2hlcmUgdG8gZmluZCB5b3VyIHJlZ2lzdHJhdGlvbiBudW1iZXInXG4gICAgICApLFxuICAgICAgaW1hZ2U6ICdjcGYtbnVtYmVyJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuIl19
|
package/esm2022/lib/core/payment/form/validators/cpf-formula-validator/cpf-formula.validator.mjs
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { isEmptyInputValue } from '../is-empty-input-value.function';
|
|
2
|
+
import { isString } from '../../../../type-guards/is-string.function';
|
|
3
|
+
import { TranslateHelper } from '../../../../../shared/translate/translate.helper';
|
|
4
|
+
const cpfLength = 11;
|
|
5
|
+
const firstCheckDigitPosition = 9;
|
|
6
|
+
const secondCheckDigitPosition = 10;
|
|
7
|
+
const maxCheckDigit = 10;
|
|
8
|
+
const repeatedDigitsRegex = /^(\d)\1+$/;
|
|
9
|
+
const allowedCharactersRegex = /[^0-9 .-]+/;
|
|
10
|
+
const moduloDivisor = 11;
|
|
11
|
+
/**
|
|
12
|
+
* Checks number match CPF validation algorithm.
|
|
13
|
+
* Based on https://en.wikipedia.org/wiki/CPF_number
|
|
14
|
+
*/
|
|
15
|
+
export const cpfFormulaValidator = ({ value }) => {
|
|
16
|
+
if (isEmptyInputValue(value) || !isString(value)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const error = {
|
|
20
|
+
rewritableError: {
|
|
21
|
+
message: TranslateHelper.t('cpf-number.converter.validation.pattern', 'Enter a valid CPF number'),
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
if (allowedCharactersRegex.test(value)) {
|
|
25
|
+
// accept only spaces, digits, dots and dashes
|
|
26
|
+
return error;
|
|
27
|
+
}
|
|
28
|
+
// Remove non-numeric characters from CPF
|
|
29
|
+
const cpf = value.replace(/\D/g, '');
|
|
30
|
+
// Check if CPF has 11 digits
|
|
31
|
+
if (cpf.length !== cpfLength) {
|
|
32
|
+
return error;
|
|
33
|
+
}
|
|
34
|
+
// Disallow CPFs with all same digits (e.g., "11111111111")
|
|
35
|
+
if (repeatedDigitsRegex.test(cpf)) {
|
|
36
|
+
return error;
|
|
37
|
+
}
|
|
38
|
+
function calculateCheckDigit(cpfNumber, checkDigitPosition) {
|
|
39
|
+
let sum = 0;
|
|
40
|
+
for (let i = 0; i < checkDigitPosition; i++) {
|
|
41
|
+
sum += parseInt(cpfNumber.charAt(i)) * (checkDigitPosition + 1 - i);
|
|
42
|
+
}
|
|
43
|
+
const checkDigit = (sum * maxCheckDigit) % moduloDivisor;
|
|
44
|
+
return checkDigit >= maxCheckDigit ? 0 : checkDigit;
|
|
45
|
+
}
|
|
46
|
+
// Validate the check digits
|
|
47
|
+
for (const position of [firstCheckDigitPosition, secondCheckDigitPosition]) {
|
|
48
|
+
const checkDigit = calculateCheckDigit(cpf, position);
|
|
49
|
+
if (checkDigit !== parseInt(cpf.charAt(position))) {
|
|
50
|
+
return error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BmLWZvcm11bGEudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGF5bWVudC1jbGllbnQtY29yZS9zcmMvbGliL2NvcmUvcGF5bWVudC9mb3JtL3ZhbGlkYXRvcnMvY3BmLWZvcm11bGEtdmFsaWRhdG9yL2NwZi1mb3JtdWxhLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUdyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRW5GLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNyQixNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUNwQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUM7QUFDeEMsTUFBTSxzQkFBc0IsR0FBRyxZQUFZLENBQUM7QUFDNUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3pCOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUM1RCxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQXFCO1FBQzlCLGVBQWUsRUFBRTtZQUNmLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUN4Qix5Q0FBeUMsRUFDekMsMEJBQTBCLENBQzNCO1NBQ0Y7S0FDRixDQUFDO0lBRUYsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2Qyw4Q0FBOEM7UUFDOUMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXJDLDZCQUE2QjtJQUM3QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsU0FBaUIsRUFDakIsa0JBQTBCO1FBRTFCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLEdBQUcsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDekQsT0FBTyxVQUFVLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLEtBQUssTUFBTSxRQUFRLElBQUksQ0FBQyx1QkFBdUIsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7UUFDM0UsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELElBQUksVUFBVSxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0VtcHR5SW5wdXRWYWx1ZSB9IGZyb20gJy4uL2lzLWVtcHR5LWlucHV0LXZhbHVlLmZ1bmN0aW9uJztcbmltcG9ydCB7IFZhbGlkYXRvckZuIH0gZnJvbSAnLi4vdmFsaWRhdG9yLWZuLnR5cGUnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJy4uL3ZhbGlkYXRpb24tZXJyb3JzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uLy4uLy4uLy4uL3R5cGUtZ3VhcmRzL2lzLXN0cmluZy5mdW5jdGlvbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQvdHJhbnNsYXRlL3RyYW5zbGF0ZS5oZWxwZXInO1xuXG5jb25zdCBjcGZMZW5ndGggPSAxMTtcbmNvbnN0IGZpcnN0Q2hlY2tEaWdpdFBvc2l0aW9uID0gOTtcbmNvbnN0IHNlY29uZENoZWNrRGlnaXRQb3NpdGlvbiA9IDEwO1xuY29uc3QgbWF4Q2hlY2tEaWdpdCA9IDEwO1xuY29uc3QgcmVwZWF0ZWREaWdpdHNSZWdleCA9IC9eKFxcZClcXDErJC87XG5jb25zdCBhbGxvd2VkQ2hhcmFjdGVyc1JlZ2V4ID0gL1teMC05IC4tXSsvO1xuY29uc3QgbW9kdWxvRGl2aXNvciA9IDExO1xuLyoqXG4gKiBDaGVja3MgbnVtYmVyIG1hdGNoIENQRiB2YWxpZGF0aW9uIGFsZ29yaXRobS5cbiAqIEJhc2VkIG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NQRl9udW1iZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGNwZkZvcm11bGFWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKHsgdmFsdWUgfSkgPT4ge1xuICBpZiAoaXNFbXB0eUlucHV0VmFsdWUodmFsdWUpIHx8ICFpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGVycm9yOiBWYWxpZGF0aW9uRXJyb3JzID0ge1xuICAgIHJld3JpdGFibGVFcnJvcjoge1xuICAgICAgbWVzc2FnZTogVHJhbnNsYXRlSGVscGVyLnQoXG4gICAgICAgICdjcGYtbnVtYmVyLmNvbnZlcnRlci52YWxpZGF0aW9uLnBhdHRlcm4nLFxuICAgICAgICAnRW50ZXIgYSB2YWxpZCBDUEYgbnVtYmVyJ1xuICAgICAgKSxcbiAgICB9LFxuICB9O1xuXG4gIGlmIChhbGxvd2VkQ2hhcmFjdGVyc1JlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgLy8gYWNjZXB0IG9ubHkgc3BhY2VzLCBkaWdpdHMsIGRvdHMgYW5kIGRhc2hlc1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIC8vIFJlbW92ZSBub24tbnVtZXJpYyBjaGFyYWN0ZXJzIGZyb20gQ1BGXG4gIGNvbnN0IGNwZiA9IHZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG5cbiAgLy8gQ2hlY2sgaWYgQ1BGIGhhcyAxMSBkaWdpdHNcbiAgaWYgKGNwZi5sZW5ndGggIT09IGNwZkxlbmd0aCkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIC8vIERpc2FsbG93IENQRnMgd2l0aCBhbGwgc2FtZSBkaWdpdHMgKGUuZy4sIFwiMTExMTExMTExMTFcIilcbiAgaWYgKHJlcGVhdGVkRGlnaXRzUmVnZXgudGVzdChjcGYpKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlQ2hlY2tEaWdpdChcbiAgICBjcGZOdW1iZXI6IHN0cmluZyxcbiAgICBjaGVja0RpZ2l0UG9zaXRpb246IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hlY2tEaWdpdFBvc2l0aW9uOyBpKyspIHtcbiAgICAgIHN1bSArPSBwYXJzZUludChjcGZOdW1iZXIuY2hhckF0KGkpKSAqIChjaGVja0RpZ2l0UG9zaXRpb24gKyAxIC0gaSk7XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrRGlnaXQgPSAoc3VtICogbWF4Q2hlY2tEaWdpdCkgJSBtb2R1bG9EaXZpc29yO1xuICAgIHJldHVybiBjaGVja0RpZ2l0ID49IG1heENoZWNrRGlnaXQgPyAwIDogY2hlY2tEaWdpdDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRoZSBjaGVjayBkaWdpdHNcbiAgZm9yIChjb25zdCBwb3NpdGlvbiBvZiBbZmlyc3RDaGVja0RpZ2l0UG9zaXRpb24sIHNlY29uZENoZWNrRGlnaXRQb3NpdGlvbl0pIHtcbiAgICBjb25zdCBjaGVja0RpZ2l0ID0gY2FsY3VsYXRlQ2hlY2tEaWdpdChjcGYsIHBvc2l0aW9uKTtcbiAgICBpZiAoY2hlY2tEaWdpdCAhPT0gcGFyc2VJbnQoY3BmLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIl19
|
|
@@ -4047,10 +4047,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
|
|
|
4047
4047
|
type: Injectable
|
|
4048
4048
|
}], ctorParameters: () => [{ type: SyncService }] });
|
|
4049
4049
|
|
|
4050
|
+
const cpfLength = 11;
|
|
4051
|
+
const firstCheckDigitPosition = 9;
|
|
4052
|
+
const secondCheckDigitPosition = 10;
|
|
4053
|
+
const maxCheckDigit = 10;
|
|
4054
|
+
const repeatedDigitsRegex = /^(\d)\1+$/;
|
|
4055
|
+
const allowedCharactersRegex = /[^0-9 .-]+/;
|
|
4056
|
+
const moduloDivisor = 11;
|
|
4057
|
+
/**
|
|
4058
|
+
* Checks number match CPF validation algorithm.
|
|
4059
|
+
* Based on https://en.wikipedia.org/wiki/CPF_number
|
|
4060
|
+
*/
|
|
4061
|
+
const cpfFormulaValidator = ({ value }) => {
|
|
4062
|
+
if (isEmptyInputValue(value) || !isString(value)) {
|
|
4063
|
+
return null;
|
|
4064
|
+
}
|
|
4065
|
+
const error = {
|
|
4066
|
+
rewritableError: {
|
|
4067
|
+
message: TranslateHelper.t('cpf-number.converter.validation.pattern', 'Enter a valid CPF number'),
|
|
4068
|
+
},
|
|
4069
|
+
};
|
|
4070
|
+
if (allowedCharactersRegex.test(value)) {
|
|
4071
|
+
// accept only spaces, digits, dots and dashes
|
|
4072
|
+
return error;
|
|
4073
|
+
}
|
|
4074
|
+
// Remove non-numeric characters from CPF
|
|
4075
|
+
const cpf = value.replace(/\D/g, '');
|
|
4076
|
+
// Check if CPF has 11 digits
|
|
4077
|
+
if (cpf.length !== cpfLength) {
|
|
4078
|
+
return error;
|
|
4079
|
+
}
|
|
4080
|
+
// Disallow CPFs with all same digits (e.g., "11111111111")
|
|
4081
|
+
if (repeatedDigitsRegex.test(cpf)) {
|
|
4082
|
+
return error;
|
|
4083
|
+
}
|
|
4084
|
+
function calculateCheckDigit(cpfNumber, checkDigitPosition) {
|
|
4085
|
+
let sum = 0;
|
|
4086
|
+
for (let i = 0; i < checkDigitPosition; i++) {
|
|
4087
|
+
sum += parseInt(cpfNumber.charAt(i)) * (checkDigitPosition + 1 - i);
|
|
4088
|
+
}
|
|
4089
|
+
const checkDigit = (sum * maxCheckDigit) % moduloDivisor;
|
|
4090
|
+
return checkDigit >= maxCheckDigit ? 0 : checkDigit;
|
|
4091
|
+
}
|
|
4092
|
+
// Validate the check digits
|
|
4093
|
+
for (const position of [firstCheckDigitPosition, secondCheckDigitPosition]) {
|
|
4094
|
+
const checkDigit = calculateCheckDigit(cpf, position);
|
|
4095
|
+
if (checkDigit !== parseInt(cpf.charAt(position))) {
|
|
4096
|
+
return error;
|
|
4097
|
+
}
|
|
4098
|
+
}
|
|
4099
|
+
return null;
|
|
4100
|
+
};
|
|
4101
|
+
|
|
4050
4102
|
class CpfNumberConverter extends Converter {
|
|
4051
4103
|
constructor(syncService) {
|
|
4052
4104
|
super(syncService);
|
|
4053
4105
|
}
|
|
4106
|
+
getValidators(field) {
|
|
4107
|
+
return super.getValidators(field).concat([cpfFormulaValidator]);
|
|
4108
|
+
}
|
|
4054
4109
|
createControlConfig(field) {
|
|
4055
4110
|
const config = this.createDefaultControlConfig(TextControlConfig, field);
|
|
4056
4111
|
config.maskConfig = {
|