validation-br 0.8.3 → 1.0.0-b
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/.eslintignore +2 -0
- package/.eslintrc.js +76 -11
- package/.github/workflows/test.yml +39 -0
- package/.prettierignore +1 -0
- package/.prettierrc.js +7 -0
- package/dist/cnh.js +123 -0
- package/dist/cnh.js.map +1 -0
- package/dist/cnh.test.js +117 -0
- package/dist/cnh.test.js.map +1 -0
- package/dist/cnpj.js +112 -0
- package/dist/cnpj.js.map +1 -0
- package/dist/cnpj.test.js +141 -0
- package/dist/cnpj.test.js.map +1 -0
- package/dist/cpf.js +134 -0
- package/dist/cpf.js.map +1 -0
- package/dist/cpf.test.js +130 -0
- package/dist/cpf.test.js.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.js +33 -0
- package/dist/index.test.js.map +1 -0
- package/dist/judicialProcess.js +153 -0
- package/dist/judicialProcess.js.map +1 -0
- package/dist/judicialProcess.test.js +123 -0
- package/dist/judicialProcess.test.js.map +1 -0
- package/dist/pisPasep.js +113 -0
- package/dist/pisPasep.js.map +1 -0
- package/dist/pisPasep.test.js +129 -0
- package/dist/pisPasep.test.js.map +1 -0
- package/dist/postalCode.js +150 -0
- package/dist/postalCode.js.map +1 -0
- package/dist/postalCode.test.js +135 -0
- package/dist/postalCode.test.js.map +1 -0
- package/dist/renavam.js +108 -0
- package/dist/renavam.js.map +1 -0
- package/dist/renavam.test.js +113 -0
- package/dist/renavam.test.js.map +1 -0
- package/dist/tituloEleitor.js +130 -0
- package/dist/tituloEleitor.js.map +1 -0
- package/dist/tituloEleitor.test.js +132 -0
- package/dist/tituloEleitor.test.js.map +1 -0
- package/dist/utils-applyMask.test.js +17 -0
- package/dist/utils-applyMask.test.js.map +1 -0
- package/dist/utils-clearValue.test.js +50 -0
- package/dist/utils-clearValue.test.js.map +1 -0
- package/dist/utils-fakeNumber.test.js +17 -0
- package/dist/utils-fakeNumber.test.js.map +1 -0
- package/dist/utils-insertAtPosition.test.js +16 -0
- package/dist/utils-insertAtPosition.test.js.map +1 -0
- package/dist/utils-invalidListGenerator.test.js +23 -0
- package/dist/utils-invalidListGenerator.test.js.map +1 -0
- package/dist/utils-removeFromPosition.test.js +16 -0
- package/dist/utils-removeFromPosition.test.js.map +1 -0
- package/dist/utils-sumElementsByMultipliers.test.js +32 -0
- package/dist/utils-sumElementsByMultipliers.test.js.map +1 -0
- package/dist/utils-sumToDV.test.js +16 -0
- package/dist/utils-sumToDV.test.js.map +1 -0
- package/dist/utils.js +167 -0
- package/dist/utils.js.map +1 -0
- package/jest.config.js +14 -0
- package/package.json +40 -48
- package/readme.md +243 -88
- package/src/cnh.test.ts +114 -0
- package/src/cnh.ts +140 -0
- package/src/cnpj.test.ts +136 -0
- package/{dist/documents/cnpj.js → src/cnpj.ts} +74 -21
- package/src/cpf.test.ts +125 -0
- package/src/cpf.ts +150 -0
- package/src/index.test.ts +35 -0
- package/src/index.ts +19 -0
- package/src/judicialProcess.test.ts +118 -0
- package/src/judicialProcess.ts +167 -0
- package/src/pisPasep.test.ts +124 -0
- package/src/pisPasep.ts +128 -0
- package/src/postalCode.test.ts +132 -0
- package/src/postalCode.ts +164 -0
- package/src/renavam.test.ts +110 -0
- package/src/renavam.ts +122 -0
- package/src/tituloEleitor.test.ts +129 -0
- package/src/tituloEleitor.ts +146 -0
- package/src/utils-applyMask.test.ts +17 -0
- package/src/utils-clearValue.test.ts +55 -0
- package/src/utils-fakeNumber.test.ts +19 -0
- package/src/utils-insertAtPosition.test.ts +15 -0
- package/src/utils-invalidListGenerator.test.ts +27 -0
- package/src/utils-removeFromPosition.test.ts +15 -0
- package/src/utils-sumElementsByMultipliers.test.ts +34 -0
- package/src/utils-sumToDV.test.ts +16 -0
- package/src/utils.ts +172 -0
- package/tsconfig.json +23 -0
- package/.babelrc +0 -15
- package/.prettierrc +0 -9
- package/dist/documents/cnh.js +0 -77
- package/dist/documents/cnh.js.map +0 -1
- package/dist/documents/cnpj.js.map +0 -1
- package/dist/documents/cpf.js +0 -83
- package/dist/documents/cpf.js.map +0 -1
- package/dist/documents/index.js +0 -23
- package/dist/documents/index.js.map +0 -1
- package/dist/documents/pis-pasep.js +0 -71
- package/dist/documents/pis-pasep.js.map +0 -1
- package/dist/documents/postal-code.js +0 -72
- package/dist/documents/postal-code.js.map +0 -1
- package/dist/documents/titulo-eleitor.js +0 -74
- package/dist/documents/titulo-eleitor.js.map +0 -1
- package/dist/lib/utils.js +0 -60
- package/dist/lib/utils.js.map +0 -1
- package/docs.md +0 -0
- package/index.js +0 -3
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import isRenavam, { dv, fake, mask, validate, validateOrFail } from './renavam'
|
|
2
|
+
|
|
3
|
+
describe('Renavam', () => {
|
|
4
|
+
test('isRenavam() - Números válidos', () => {
|
|
5
|
+
const list = [
|
|
6
|
+
// valores com máscara
|
|
7
|
+
'1952519770-3',
|
|
8
|
+
'3394038959-9',
|
|
9
|
+
// valores como inteiros
|
|
10
|
+
3607626105,
|
|
11
|
+
64090416160,
|
|
12
|
+
// valores como string sem máscara
|
|
13
|
+
'80499688374',
|
|
14
|
+
'40650543741',
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
list.forEach((renavam) => {
|
|
18
|
+
expect(isRenavam(renavam)).toBeTruthy()
|
|
19
|
+
})
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
test('validate() - Números válidos', () => {
|
|
23
|
+
const list = [
|
|
24
|
+
// valores com máscara
|
|
25
|
+
'1952519770-3',
|
|
26
|
+
'3394038959-9',
|
|
27
|
+
// valores como inteiros
|
|
28
|
+
3607626105,
|
|
29
|
+
64090416160,
|
|
30
|
+
// valores como string sem máscara
|
|
31
|
+
'80499688374',
|
|
32
|
+
'40650543741',
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
list.forEach((renavam) => {
|
|
36
|
+
expect(validate(renavam)).toBeTruthy()
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
test('validate() - Números inválidos', () => {
|
|
41
|
+
const list = ['19525227703', '33940229599', '03607226105', '64090226160', '80499228374']
|
|
42
|
+
|
|
43
|
+
list.forEach((renavam) => {
|
|
44
|
+
expect(validate(renavam)).toBeFalsy()
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test('validateOrFail() - Números inválidos', () => {
|
|
49
|
+
const list = ['19525227703', '33940229599', '03607226105', '64090226160', '80499228374']
|
|
50
|
+
|
|
51
|
+
list.forEach((renavam) => {
|
|
52
|
+
expect(() => validateOrFail(renavam)).toThrow()
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test('Parâmetro não informado', () => {
|
|
57
|
+
expect(isRenavam('')).toBeFalsy()
|
|
58
|
+
expect(validate('')).toBeFalsy()
|
|
59
|
+
expect(() => validateOrFail('')).toThrow()
|
|
60
|
+
expect(() => dv('')).toThrow()
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
test('fake() - Gera fakes sem máscara', () => {
|
|
64
|
+
for (let i = 0; i < 5; i += 1) {
|
|
65
|
+
const renavam = fake()
|
|
66
|
+
|
|
67
|
+
expect(validate(renavam)).toBeTruthy()
|
|
68
|
+
expect(renavam).toHaveLength(11)
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
test('fake() - Gera fakes com máscara', () => {
|
|
73
|
+
for (let i = 0; i < 5; i += 1) {
|
|
74
|
+
const renavam = fake(true)
|
|
75
|
+
|
|
76
|
+
expect(validate(renavam)).toBeTruthy()
|
|
77
|
+
expect(renavam).toHaveLength(12)
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
test('dv() - Verificando se o DV gerado está correto', () => {
|
|
82
|
+
const list = [
|
|
83
|
+
{ num: '1952519770', expected: '3' },
|
|
84
|
+
{ num: 952519770, expected: '6' },
|
|
85
|
+
{ num: 52519770, expected: '2' },
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
list.forEach((item) => {
|
|
89
|
+
const calcDv = dv(item.num)
|
|
90
|
+
|
|
91
|
+
expect(calcDv).toBe(item.expected)
|
|
92
|
+
expect(typeof calcDv).toBe('string')
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
test('mask() - Testando se a máscara foi gerada corretamente', () => {
|
|
97
|
+
const list = [
|
|
98
|
+
{ num: '19525197703', expected: '1952519770-3' },
|
|
99
|
+
{ num: 9525197703, expected: '0952519770-3' },
|
|
100
|
+
{ num: 525197703, expected: '0052519770-3' },
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
list.forEach((item) => {
|
|
104
|
+
const masked = mask(item.num)
|
|
105
|
+
|
|
106
|
+
expect(masked).toBe(item.expected)
|
|
107
|
+
expect(masked).toHaveLength(12)
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
})
|
package/src/renavam.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RENAVAM
|
|
3
|
+
* Funções auxiliares para cálculo de máscaras, validação, dígito verificador e criaçãode
|
|
4
|
+
* números fake.
|
|
5
|
+
*
|
|
6
|
+
* @doc
|
|
7
|
+
* - O número de RENAVAM deve possuir 11 caracteres
|
|
8
|
+
*
|
|
9
|
+
* - Os caracteres de 1 a 10 são a numeração documento
|
|
10
|
+
*
|
|
11
|
+
* - O caractere 11 é o dígito verificador.
|
|
12
|
+
*
|
|
13
|
+
* 1) Partes do número
|
|
14
|
+
* _______________________________________________
|
|
15
|
+
* | Número | D V |
|
|
16
|
+
* | 2 6 8 2 7 6 4 9 9 6 - 0 |
|
|
17
|
+
* |_________________________________________|_____|
|
|
18
|
+
*
|
|
19
|
+
* 2) Cálculo do DV.
|
|
20
|
+
*
|
|
21
|
+
* - Soma-se o produto das algarismos 3 a 10 pelos números 3, 2, 9, 8, 7, 6, 5, 4, 3, 2
|
|
22
|
+
*
|
|
23
|
+
* 2 6 8 2 7 6 4 9 9 6
|
|
24
|
+
* x x x x x x x x x x
|
|
25
|
+
* 3 2 9 8 7 6 5 4 3 2
|
|
26
|
+
* = 6 +12 +72 +16 +49 +12 +20 +36 +27 +12 = 234
|
|
27
|
+
*
|
|
28
|
+
* - O somatório encontrado é multiplicado por 10 e ao resultado
|
|
29
|
+
* é aplicado o cálculo do MOD 11.
|
|
30
|
+
*
|
|
31
|
+
* ( 234 * 10 ) / 11 tem resto 8. DV = 8. Caso o resto seja maior ou igual a
|
|
32
|
+
* 10, DV será 0.
|
|
33
|
+
*
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import {
|
|
38
|
+
sumElementsByMultipliers,
|
|
39
|
+
clearValue,
|
|
40
|
+
fakeNumber,
|
|
41
|
+
applyMask,
|
|
42
|
+
invalidListGenerator,
|
|
43
|
+
} from './utils'
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* dv()
|
|
47
|
+
* Calcula o dígito verificador
|
|
48
|
+
*
|
|
49
|
+
* @param {Number|String} value
|
|
50
|
+
* @returns {String}
|
|
51
|
+
*/
|
|
52
|
+
export const dv = (value: string | number): string => {
|
|
53
|
+
if (!value) throw new Error('Renavam não informado')
|
|
54
|
+
|
|
55
|
+
const renavam = clearValue(value, 10) // só 10 para remover o DV
|
|
56
|
+
|
|
57
|
+
const invalidList = invalidListGenerator(10)
|
|
58
|
+
if (invalidList.includes(renavam)) {
|
|
59
|
+
throw new Error('RENAVAM não pode ser uma sequência de números iguais')
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const sum1 = sumElementsByMultipliers(renavam, [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]) * 10
|
|
63
|
+
const dv1 = sum1 % 11 >= 10 ? 0 : sum1 % 11
|
|
64
|
+
return `${dv1}`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Aplica uma máscara ao número informado
|
|
69
|
+
*
|
|
70
|
+
* @param {String} value Número de Processo
|
|
71
|
+
* @returns {String} Valor com a máscara
|
|
72
|
+
*/
|
|
73
|
+
export const mask = (value: string | number): string => applyMask(value, '0000000000-0')
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* fake()
|
|
77
|
+
* Gera um número válido
|
|
78
|
+
*
|
|
79
|
+
* @returns {String}
|
|
80
|
+
*/
|
|
81
|
+
export const fake = (withMask: boolean = false): string => {
|
|
82
|
+
const value = fakeNumber(10, true)
|
|
83
|
+
|
|
84
|
+
const renavam = `${value}${dv(value)}`
|
|
85
|
+
|
|
86
|
+
if (withMask) return mask(renavam)
|
|
87
|
+
|
|
88
|
+
return renavam
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* validateOrFail()
|
|
93
|
+
* Valida se um número de processo está correto e
|
|
94
|
+
* retorna uma exceção se não estiver
|
|
95
|
+
*
|
|
96
|
+
* @returns {Boolean}
|
|
97
|
+
*/
|
|
98
|
+
export const validateOrFail = (value: string | number): boolean => {
|
|
99
|
+
const renavam = clearValue(value, 11)
|
|
100
|
+
|
|
101
|
+
if (dv(renavam) !== renavam.substring(10, 11)) {
|
|
102
|
+
throw new Error('Dígito verificador inválido')
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return true
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* validate()
|
|
110
|
+
* Valida se um número de processo está correto
|
|
111
|
+
*
|
|
112
|
+
* @returns {Boolean}
|
|
113
|
+
*/
|
|
114
|
+
export const validate = (value: string | number): boolean => {
|
|
115
|
+
try {
|
|
116
|
+
return validateOrFail(value)
|
|
117
|
+
} catch (error) {
|
|
118
|
+
return false
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export default validate
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import isTituloEleitor, { dv, fake, mask, validate, validateOrFail } from './tituloEleitor'
|
|
2
|
+
|
|
3
|
+
describe('TituloEleitor', () => {
|
|
4
|
+
test('isTituloEleitor() - Números válidos', () => {
|
|
5
|
+
const list = [
|
|
6
|
+
// masked
|
|
7
|
+
'1023.8501.0671',
|
|
8
|
+
'8365.7137.1619',
|
|
9
|
+
// string
|
|
10
|
+
'153036161686',
|
|
11
|
+
'525028881694',
|
|
12
|
+
// integer
|
|
13
|
+
11122223360,
|
|
14
|
+
1122223336,
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
list.forEach((tituloEleitor) => {
|
|
18
|
+
expect(isTituloEleitor(tituloEleitor)).toBeTruthy()
|
|
19
|
+
})
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
test('validate() - Números válidos', () => {
|
|
23
|
+
const list = [
|
|
24
|
+
// masked
|
|
25
|
+
'1023.8501.0671',
|
|
26
|
+
'8365.7137.1619',
|
|
27
|
+
// string
|
|
28
|
+
'153036161686',
|
|
29
|
+
'525028881694',
|
|
30
|
+
// integer
|
|
31
|
+
11122223360,
|
|
32
|
+
1122223336,
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
list.forEach((tituloEleitor) => {
|
|
36
|
+
expect(validate(tituloEleitor)).toBeTruthy()
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
test('validate() - Números inválidos', () => {
|
|
41
|
+
const list = [
|
|
42
|
+
'836531371619',
|
|
43
|
+
'743620641660',
|
|
44
|
+
'153016161686',
|
|
45
|
+
'525078881694',
|
|
46
|
+
'026367681660',
|
|
47
|
+
'558647441635',
|
|
48
|
+
'222222222222',
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
list.forEach((tituloEleitor) => {
|
|
52
|
+
expect(validate(tituloEleitor)).toBeFalsy()
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test('validateOrFail() - Números inválidos', () => {
|
|
57
|
+
const list = [
|
|
58
|
+
'836531371619',
|
|
59
|
+
'743620641660',
|
|
60
|
+
'153016161686',
|
|
61
|
+
'525078881694',
|
|
62
|
+
'026367681660',
|
|
63
|
+
'558647441635',
|
|
64
|
+
'222222222222',
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
list.forEach((tituloEleitor) => {
|
|
68
|
+
expect(() => validateOrFail(tituloEleitor)).toThrow()
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
test('Parâmetro não informado', () => {
|
|
73
|
+
expect(isTituloEleitor('')).toBeFalsy()
|
|
74
|
+
expect(validate('')).toBeFalsy()
|
|
75
|
+
expect(() => validateOrFail('')).toThrow()
|
|
76
|
+
expect(() => dv('')).toThrow()
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
test('fake() - Gera fakes sem máscara', () => {
|
|
80
|
+
for (let i = 0; i < 5; i += 1) {
|
|
81
|
+
const tituloEleitor = fake()
|
|
82
|
+
|
|
83
|
+
expect(validate(tituloEleitor)).toBeTruthy()
|
|
84
|
+
expect(tituloEleitor).toHaveLength(12)
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
test('fake() - Gera fakes com máscara', () => {
|
|
89
|
+
for (let i = 0; i < 5; i += 1) {
|
|
90
|
+
const tituloEleitor = fake(true)
|
|
91
|
+
|
|
92
|
+
expect(validate(tituloEleitor)).toBeTruthy()
|
|
93
|
+
expect(tituloEleitor).toHaveLength(14)
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
test('dv() - Verificando se o DV gerado está correto', () => {
|
|
98
|
+
const list = [
|
|
99
|
+
{ num: '1023850106', expected: '71' },
|
|
100
|
+
{ num: '8365713716', expected: '19' },
|
|
101
|
+
{ num: '7436506416', expected: '60' },
|
|
102
|
+
{ num: 11222233, expected: '36' },
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
list.forEach((item) => {
|
|
106
|
+
const calcDv = dv(item.num)
|
|
107
|
+
|
|
108
|
+
expect(calcDv).toBe(item.expected)
|
|
109
|
+
expect(typeof calcDv).toBe('string')
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
test('mask() - Testando se a máscara foi gerada corretamente', () => {
|
|
114
|
+
const list = [
|
|
115
|
+
{ num: '102385010671', expected: '1023.8501.0671' },
|
|
116
|
+
{ num: '836571371619', expected: '8365.7137.1619' },
|
|
117
|
+
{ num: '743650641660', expected: '7436.5064.1660' },
|
|
118
|
+
{ num: 11122223360, expected: '0111.2222.3360' },
|
|
119
|
+
{ num: 1122223336, expected: '0011.2222.3336' },
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
list.forEach((item) => {
|
|
123
|
+
const masked = mask(item.num)
|
|
124
|
+
|
|
125
|
+
expect(masked).toBe(item.expected)
|
|
126
|
+
expect(masked).toHaveLength(14)
|
|
127
|
+
})
|
|
128
|
+
})
|
|
129
|
+
})
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* isTitulo()
|
|
3
|
+
* Calcula se um título eleitoral é válido
|
|
4
|
+
*
|
|
5
|
+
* @doc
|
|
6
|
+
* Título de eleitor deve possuir 12 dígitos.
|
|
7
|
+
*
|
|
8
|
+
* - Os caracteres 1 a 8 são números sequenciais.
|
|
9
|
+
*
|
|
10
|
+
* - Os caracteres 9 e 10 representam os estados da federação onde o título
|
|
11
|
+
* foi emitido (01 = SP, 02 = MG, 03 = RJ, 04 = RS, 05 = BA, 06 = PR, 07 = CE, 08 = PE,
|
|
12
|
+
* 09 = SC, 10 = GO, 11 = MA12 = PB, 13 = PA, 14 = ES, 15 = PI, 16 = RN, 17 = AL,
|
|
13
|
+
* 18 = MT, 19 = MS, 20 = DF, 21 = SE, 22 = AM, 23 = RO, 24 = AC, 25 = AP, 26 = RR,
|
|
14
|
+
* 27 = TO, 28 = Exterior(ZZ).
|
|
15
|
+
*
|
|
16
|
+
* - Os caracteres 11 e 12 são dígitos verificadores.
|
|
17
|
+
*
|
|
18
|
+
* 1) Partes do número
|
|
19
|
+
* ------------------------------------------------
|
|
20
|
+
* | Número Sequencial | UF | DV |
|
|
21
|
+
* 1 0 2 3 8 5 0 1 0 6 7 1
|
|
22
|
+
*
|
|
23
|
+
* 2) Cálculo do primeiro DV.
|
|
24
|
+
*
|
|
25
|
+
* - Soma-se o produto das algarismos 1 a 8 pelos números 2, 3, 4, 5, 6, 7, 8 e 9.
|
|
26
|
+
*
|
|
27
|
+
* 1 0 2 3 8 5 0 1
|
|
28
|
+
* x x x x x x x x
|
|
29
|
+
* 2 3 4 5 6 7 8 9
|
|
30
|
+
* = 2 + 0 + 8 +15 +48 +35 + 0 + 9 = 117
|
|
31
|
+
*
|
|
32
|
+
* - O somatório encontrado é dividido por 11. O DV1 é o resto da divisão. Se o
|
|
33
|
+
* resto for 10, o DV1 é 0.
|
|
34
|
+
*
|
|
35
|
+
* 2.1) 117 / 11 tem resto igual a 7.
|
|
36
|
+
*
|
|
37
|
+
* 3) Cálculo do segundo DV
|
|
38
|
+
*
|
|
39
|
+
* - Soma-se o produto dos algarismos 9 a 11 (relativos aos 2 dígitos da UF e o novo
|
|
40
|
+
* DV1 que acabou de ser calculado) e os multiplicam pelos números 7, 8 e 9. Se o
|
|
41
|
+
* resto for 10, DV2 será 0.
|
|
42
|
+
* 0 6 7
|
|
43
|
+
* x x x
|
|
44
|
+
* 7 8 9
|
|
45
|
+
* = 0 +48 +63 = 111
|
|
46
|
+
*
|
|
47
|
+
* 3.1) 111 / 11 tem resto igual a 1.
|
|
48
|
+
*
|
|
49
|
+
* Fonte: http://clubes.obmep.org.br/blog/a-matematica-nos-documentos-titulo-de-eleitor/
|
|
50
|
+
*
|
|
51
|
+
* @param {String} value Título eleitoral
|
|
52
|
+
* @returns {Boolean}
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
import {
|
|
56
|
+
sumElementsByMultipliers,
|
|
57
|
+
clearValue,
|
|
58
|
+
fakeNumber,
|
|
59
|
+
applyMask,
|
|
60
|
+
invalidListGenerator,
|
|
61
|
+
} from './utils'
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* dv()
|
|
65
|
+
* Calcula o dígito verificador
|
|
66
|
+
*
|
|
67
|
+
* @param {Number|String} value
|
|
68
|
+
* @returns {String}
|
|
69
|
+
*/
|
|
70
|
+
export const dv = (value: string | number): string => {
|
|
71
|
+
if (!value) throw new Error('CPF não informado')
|
|
72
|
+
|
|
73
|
+
const titulo = clearValue(value, 10)
|
|
74
|
+
|
|
75
|
+
const invalidList = invalidListGenerator(10)
|
|
76
|
+
if (invalidList.includes(titulo)) {
|
|
77
|
+
throw new Error('Título não pode ser uma sequência de números iguais')
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const sum1 = sumElementsByMultipliers(titulo.substring(0, 8), [2, 3, 4, 5, 6, 7, 8, 9])
|
|
81
|
+
const dv1 = sum1 % 11 >= 10 ? 0 : sum1 % 11
|
|
82
|
+
|
|
83
|
+
const sum2 = sumElementsByMultipliers(titulo.substring(8, 10) + dv1, [7, 8, 9])
|
|
84
|
+
const dv2 = sum2 % 11 >= 10 ? 0 : sum2 % 11
|
|
85
|
+
|
|
86
|
+
return `${dv1}${dv2}`
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Aplica uma máscara ao número informado
|
|
91
|
+
*
|
|
92
|
+
* @param {String} value Número de Processo
|
|
93
|
+
* @returns {String} Valor com a máscara
|
|
94
|
+
*/
|
|
95
|
+
export const mask = (value: string | number): string => applyMask(value, '0000.0000.0000')
|
|
96
|
+
// const mask = (value) => applyMask(value, '0000.0000.0000');
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* fake()
|
|
100
|
+
* Gera um número válido
|
|
101
|
+
*
|
|
102
|
+
* @returns {String}
|
|
103
|
+
*/
|
|
104
|
+
export const fake = (withMask: boolean = false): string => {
|
|
105
|
+
const num = fakeNumber(8, true)
|
|
106
|
+
|
|
107
|
+
const uf = (Math.random() * 27 + 1).toFixed(0).padStart(2, '0')
|
|
108
|
+
|
|
109
|
+
const titulo = `${num}${uf}${dv(num + uf)}`
|
|
110
|
+
|
|
111
|
+
if (withMask) return mask(titulo)
|
|
112
|
+
return titulo
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* validateOrFail()
|
|
117
|
+
* Valida se um número de processo está correto e
|
|
118
|
+
* retorna uma exceção se não estiver
|
|
119
|
+
*
|
|
120
|
+
* @returns {Boolean}
|
|
121
|
+
*/
|
|
122
|
+
export const validateOrFail = (value: string | number): boolean => {
|
|
123
|
+
const titulo = clearValue(value, 12)
|
|
124
|
+
|
|
125
|
+
if (dv(titulo) !== titulo.substring(10, 12)) {
|
|
126
|
+
throw new Error('Dígito verificador inválido')
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return true
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* validate()
|
|
134
|
+
* Valida se um número de processo está correto
|
|
135
|
+
*
|
|
136
|
+
* @returns {Boolean}
|
|
137
|
+
*/
|
|
138
|
+
export const validate = (value: string | number): boolean => {
|
|
139
|
+
try {
|
|
140
|
+
return validateOrFail(value)
|
|
141
|
+
} catch (error) {
|
|
142
|
+
return false
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export default validate
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const { applyMask } = require('./utils')
|
|
2
|
+
|
|
3
|
+
describe('applyMask()', () => {
|
|
4
|
+
const items = [
|
|
5
|
+
{ value: '123456', mask: '00000-0', expected: '12345-6' },
|
|
6
|
+
{ value: '12345', mask: '00000-0', expected: '01234-5' },
|
|
7
|
+
{ value: '123456789', mask: '00000-0', expected: '12345-6' },
|
|
8
|
+
{ value: 123456789, mask: '00000-0', expected: '12345-6' },
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
test('Máscara deve ser aplicada com o valor e tamanho correto', () => {
|
|
12
|
+
items.forEach((item) => {
|
|
13
|
+
expect(item.expected.length).toBe(item.mask.length)
|
|
14
|
+
expect(applyMask(item.value, item.mask)).toBe(item.expected)
|
|
15
|
+
})
|
|
16
|
+
})
|
|
17
|
+
})
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { clearValue } from './utils'
|
|
2
|
+
|
|
3
|
+
describe('clearValue()', () => {
|
|
4
|
+
test('Deve limpar o valor - Strings do Mesmo tamanho', () => {
|
|
5
|
+
//
|
|
6
|
+
const valid = [
|
|
7
|
+
{ value: 1234567890, size: 10, expected: '1234567890' },
|
|
8
|
+
{ value: '1234567890', size: 10, expected: '1234567890' },
|
|
9
|
+
{ value: '12.345.678-90', size: 10, expected: '1234567890' },
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
valid.forEach((item) => {
|
|
13
|
+
expect(clearValue(item.value, item.size)).toBe(item.expected)
|
|
14
|
+
})
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
test('Deve limpar os caracteres não numéricos sem verificar o tamanho da string', () => {
|
|
18
|
+
//
|
|
19
|
+
const valid = [
|
|
20
|
+
{ value: 1234567890123, size: null, expected: '1234567890123' },
|
|
21
|
+
{ value: '4567890', size: null, expected: '4567890' },
|
|
22
|
+
{ value: '345.678-90', size: null, expected: '34567890' },
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
valid.forEach((item) => {
|
|
26
|
+
expect(clearValue(item.value, item.size)).toBe(item.expected)
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('Deve limpar o valor os caracteres não numéricos e completar com zeros à esquerda', () => {
|
|
31
|
+
//
|
|
32
|
+
const valid = [
|
|
33
|
+
{ value: 1234, size: 10, expected: '0000001234' },
|
|
34
|
+
{ value: '1234', size: 10, expected: '0000001234' },
|
|
35
|
+
{ value: '123-4', size: 10, expected: '0000001234' },
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
valid.forEach((item) => {
|
|
39
|
+
expect(clearValue(item.value, item.size)).toBe(item.expected)
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('Deve limpar o valor os caracteres não numéricos e remover os caracteres que passarem de size', () => {
|
|
44
|
+
//
|
|
45
|
+
const valid = [
|
|
46
|
+
{ value: 123456789, size: 4, expected: '1234' },
|
|
47
|
+
{ value: '1234567890', size: 4, expected: '1234' },
|
|
48
|
+
{ value: '12.345.678-90', size: 4, expected: '1234' },
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
valid.forEach((item) => {
|
|
52
|
+
expect(clearValue(item.value, item.size)).toBe(item.expected)
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const { fakeNumber } = require('./utils')
|
|
2
|
+
|
|
3
|
+
describe('fakeNumber()', () => {
|
|
4
|
+
test('forceLength = true', () => {
|
|
5
|
+
const num = fakeNumber(4, true)
|
|
6
|
+
|
|
7
|
+
expect(num).toHaveLength(4)
|
|
8
|
+
expect(typeof num).toBe('string')
|
|
9
|
+
expect(num).toMatch(/^[\d]+$/)
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
test('forceLength = false', () => {
|
|
13
|
+
const num = fakeNumber(4)
|
|
14
|
+
|
|
15
|
+
expect(num).toBeLessThanOrEqual(9999)
|
|
16
|
+
expect(num).toBeGreaterThanOrEqual(0)
|
|
17
|
+
expect(typeof num).toBe('number')
|
|
18
|
+
})
|
|
19
|
+
})
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { insertAtPosition } from './utils'
|
|
2
|
+
|
|
3
|
+
describe('insertAtPosition()', () => {
|
|
4
|
+
test('Deve inserir um caractere em uma determinada posição da string', () => {
|
|
5
|
+
//
|
|
6
|
+
const list = [
|
|
7
|
+
{ value: 'AAABBB', insert: 'C', position: 3, expected: 'AAACBBB' },
|
|
8
|
+
{ value: 'J Med', insert: 'Cl ', position: 2, expected: 'J Cl Med' },
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
list.forEach((item) => {
|
|
12
|
+
expect(insertAtPosition(item.value, item.insert, item.position)).toBe(item.expected)
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
})
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const { invalidListGenerator } = require('./utils')
|
|
2
|
+
|
|
3
|
+
describe('invalidListGenerator()', () => {
|
|
4
|
+
test('invalidListGenerator - Número de itens', () => {
|
|
5
|
+
const list = invalidListGenerator(4)
|
|
6
|
+
|
|
7
|
+
expect(1).toBe(1)
|
|
8
|
+
expect(Array.isArray(list)).toBeTruthy()
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
test('invalidListGenerator - Tamanho dos itens', () => {
|
|
12
|
+
const valid = [
|
|
13
|
+
{ length: 10, size: 8 },
|
|
14
|
+
{ length: 10, size: 4 },
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
valid.forEach((item) => {
|
|
18
|
+
const list = invalidListGenerator(item.size)
|
|
19
|
+
|
|
20
|
+
expect(list).toHaveLength(10)
|
|
21
|
+
|
|
22
|
+
list.forEach((num: string) => {
|
|
23
|
+
expect(num).toHaveLength(item.size)
|
|
24
|
+
})
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
})
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { removeFromPosition } from './utils'
|
|
2
|
+
|
|
3
|
+
describe('removeFromPosition()', () => {
|
|
4
|
+
test('', () => {
|
|
5
|
+
//
|
|
6
|
+
const list = [
|
|
7
|
+
{ value: 'Jossé', start: 2, end: 3, expected: 'José' },
|
|
8
|
+
{ value: 'Cláuudio', start: 4, end: 5, expected: 'Cláudio' },
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
list.forEach((item) => {
|
|
12
|
+
expect(removeFromPosition(item.value, item.start, item.end)).toBe(item.expected)
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
})
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const { sumElementsByMultipliers } = require('./utils')
|
|
2
|
+
|
|
3
|
+
describe('sumElementsByMultipliers()', () => {
|
|
4
|
+
test('Tipo do retorno', () => {
|
|
5
|
+
const sum = sumElementsByMultipliers('1234', '9876')
|
|
6
|
+
|
|
7
|
+
expect(typeof sum).toBe('number')
|
|
8
|
+
expect(sum).toBe(70)
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
test('Valores retornados', () => {
|
|
12
|
+
;[
|
|
13
|
+
{ input: '1234', multipliers: '9876', expected: 70 },
|
|
14
|
+
{ input: '1234', multipliers: [9, 8, 7, 6], expected: 70 },
|
|
15
|
+
// cnpj
|
|
16
|
+
{ input: '112223330001', multipliers: [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2], expected: 102 },
|
|
17
|
+
{ input: '1122233300018', multipliers: '6543298765432', expected: 120 },
|
|
18
|
+
// cpf
|
|
19
|
+
{ input: '280012389', multipliers: [10, 9, 8, 7, 6, 5, 4, 3, 2], expected: 162 },
|
|
20
|
+
{ input: '2800123893', multipliers: [11, 10, 9, 8, 7, 6, 5, 4, 3, 2], expected: 201 },
|
|
21
|
+
// titulo
|
|
22
|
+
{ input: '10238501', multipliers: '23456789', expected: 117 },
|
|
23
|
+
{ input: '067', multipliers: '789', expected: 111 },
|
|
24
|
+
].forEach((item) => {
|
|
25
|
+
const sum = sumElementsByMultipliers(item.input, item.multipliers)
|
|
26
|
+
expect(sum).toBe(item.expected)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const sum = sumElementsByMultipliers('1234', '9876')
|
|
30
|
+
|
|
31
|
+
expect(typeof sum).toBe('number')
|
|
32
|
+
expect(sum).toBe(70)
|
|
33
|
+
})
|
|
34
|
+
})
|