-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplaca-mercosul-brasil.js
139 lines (123 loc) · 4.35 KB
/
placa-mercosul-brasil.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/**
* Converte a placa atual Brasileira para o novo formato Mercosul, inclui também um validador e máscara
* @author Henrique Deodato <[email protected]>
* @see http://www.denatran.gov.br/download/Resolucoes/Resolucao5902016.pdf
* @see http://www.denatran.gov.br/images/Resolucoes/Resolucao7412018.pdf
* @see https://pt.wikipedia.org/wiki/Placas_de_identifica%C3%A7%C3%A3o_de_ve%C3%ADculos_no_Mercosul#cite_note-Res741-22
*/
"use strict";
var ClassPlacaMercosul = class PlacaMerosul {
constructor(altura, largura) {
// define as regexes usadas
this.REGEX_PLACA_GENERICA = /^([a-zA-Z]{3})([0-9]([a-zA-Z]|[0-9])[0-9]{2})$/;
this.REGEX_PLACA_ANTIGA = /^([a-zA-Z]{3})([0-9])([0-9])([0-9]{2})$/;
this.REGEX_PLACA_NOVA = /^([a-zA-Z]{3})([0-9])([a-zA-Z])([0-9]{2})$/;
this.REGEX_REPLACE = /[^0-9A-Za-z]/g;
}
/**
* Gera um numero aleatorio entre 0 a 9
* @return {integer} um numero aleatorio
*/
_createRandonNumber (){
let n = 9;
return Math.round(Math.random()*n);
}
/**
* gera um string entre A e Z
* @return {string} uma string aleatoria
*/
_createRandonString (){
let n = 25; // intervalo de valorees
let i = 65 // menor valor possivel
// gera um numero estre 65 e 90 e retorna a string correspondente ao codigo ASCII
return String.fromCharCode( Math.round( Math.random() * n ) + i );
}
/**
* Gera uma placa válida e aleatória
* @return {string} a placa gerada
*/
_generate (){
let n1 = this._createRandonString(),
n2 = this._createRandonString(),
n3 = this._createRandonString(),
n4 = this._createRandonNumber(),
n5 = this._createRandonString(),
n6 = this._createRandonNumber(),
n7 = this._createRandonNumber();
let placa = ""+n1+n2+n3+n4+n5+n6+n7;
return placa;
}
/**
* Retorna o a letra correspondente para alterar a placa antiga
*/
_conversionTable(number){
let table = ["A","B","C","D","E","F","G","H","I","J"];
if( typeof number == "number" && number >= 0 && number <= 9 ){
return table[number];
}
else{
console.log(`${number} fora do range, deve ser de 0 até 9`);
return number;
}
}
/**
* Valida se a placa informada eh valida ou nao, tanto formato antigo quanto novo
* @param {string} placa valor a ser validado
* @return {boolean} true se valida, false se não...
*/
_validate(placa){
let placaTemp = placa.replace(this.REGEX_REPLACE,"");
return this.REGEX_PLACA_GENERICA.test(placaTemp);
}
/**
* Converte uma placa do formato antigo para o formato novo
* @param {string} placa
* @return {string} placa formatada ou a string informada caso nao seja no formato necessario
*/
_convert(placa){
// eh uma placa antiga?
if( this.REGEX_PLACA_ANTIGA.test(placa) ){
let _t = this;
return placa.replace( this.REGEX_PLACA_ANTIGA, function(st, m1, m2, m3, m4) {
return "" + m1 + m2 + _t._conversionTable(parseInt(m3)) + m4;
});
}
else{
console.log(`${placa} não está no formato antigo, conversão não realizada`);
return placa;
}
}
// metodo para a geracao
get generate(){
return this._generate;
}
// metodo para a validacao
validate(placa){
return this._validate(placa);
}
// metodo para a conversao
convert(placa){
return this._convert(placa);
}
// aplica a mascara para a placa informada
mask(placa){
if( this._validate(placa) ){
return placa.replace(this.REGEX_PLACA_GENERICA, '$1 $2');
}
else{
console.log(`${placa} não é uma placa válida, máscara não aplicada`);
return placa;
}
}
// remove everything that is not a number
unmask(placa){
if( typeof placa == "string" ){
return placa.replace(this.REGEX_REPLACE,"");
}
else{
console.log(`${placa} não é válido para esta operção [unmask], por favor informe uma string nos seguintes formatos AAA-9999, AAA 9999, AAA9999 ou AAA9A99 `);
return placa;
}
}
};
module.exports = ClassPlacaMercosul;