Neste post irei demonstrar como validar CNPJ, CPF e PIS em FLEX utilizando a classe Validator. Aproveitando o embalo segue também como colocar mascara nos campos. O componente utilizado para máscara foi retirado desse link
Os arquivos ".as" devem ser criados na pasta componentes.
CpfValidator.as
package componentes
{
import mx.validators.Validator;
import mx.validators.ValidationResult;
public class CpfValidator extends Validator
{
public function CpfValidator()
{
super();
}
override protected function doValidation(value:Object):Array {
var results:Array = super.doValidation(value.text);
var digito:Array = new Array(); // array para os dígitos do CPF.
var aux:Number= 0;
var posicao:Number;
var i:Number;
var soma:Number;
var dv:Number;
var dvInformado:Number;
var CPF:String = value.text;
// Retira os dígitos formatadores de CPF '.' e '-', caso existam.
CPF.replace(".", "");
CPF.replace("-", "");
//verifica CPFs manjados
switch (CPF) {
case '0':
case '00':
case '000':
case '0000':
case '00000':
case '000000':
case '0000000':
case '00000000':
case '000000000':
case '0000000000':
case '00000000000':
case '11111111111':
case '22222222222':
case '33333333333':
case '44444444444':
case '55555555555':
case '66666666666':
case '77777777777':
case '88888888888':
case '99999999999':
results.push(new ValidationResult(true, null, "Erro",
"Número do CPF inválido!"));
return results;
}
// Início da validação do CPF.
/* Retira do número informado os dois últimos dígitos */
dvInformado = parseInt(CPF.substr(9,2));
/* Desmembra o número do CPF no array digito */
for (i=0; i< = 8; i++)
{
digito[i] = CPF.substr(i,1);
}
/* Calcula o valor do 10o. digito de verificação */
posicao = 10;
soma = 0;
for (i=0; i <= 8; i++)
{
soma = soma + digito[i] * posicao;
posicao--;
}
digito[9] = soma % 11;
if (digito[9] < 2)
{
digito[9] = 0;
}
else
{
digito[9] = 11 - digito[9];
}
/* Calcula o valor do 11o. digito de verificação */
posicao = 11;
soma = 0;
for (i=0; i <= 9; i++)
{
soma = soma + digito[i] * posicao;
posicao--;
}
digito[10] = soma % 11;
if (digito[10] < 2)
{
digito[10] = 0;
}
else
{
digito[10] = 11 - digito[10];
}
dv = digito[9] * 10 + digito[10];
/* Verifica se o DV calculado é igual ao informado */
if(dv != dvInformado)
{
results.push(new ValidationResult(true, null, "Erro",
"Número do CPF inválido!"));
}
return results;
}
override protected function getValueFromSource():Object
{
var value:Object = {};
value.text = super.getValueFromSource();
return value;
}
}
}
CnpjValidator.as
package componentes
{
import mx.validators.ValidationResult;
import mx.validators.Validator;
public class CnpjValidator extends Validator
{
public function CnpjValidator()
{
super();
}
override protected function doValidation(value:Object):Array {
var results:Array = super.doValidation(value.text);
var a:Array = new Array();
var b:Number = new Number;
var i:Number;
var x:Number;
var y:Number;
var c:Array = [6,5,4,3,2,9,8,7,6,5,4,3,2];
var CNPJ:String = value.text;
// Retira os dígitos formatadores de CNPJ '.' e '-', caso existam.
CNPJ.replace(".", "");
CNPJ.replace("-", "");
CNPJ.replace("/", "");
//verifica CNPJs manjados
switch (CNPJ) {
case '0':
case '00':
case '000':
case '0000':
case '00000':
case '000000':
case '0000000':
case '00000000':
case '000000000':
case '0000000000':
case '00000000000':
case '11111111111':
case '22222222222':
case '33333333333':
case '44444444444':
case '55555555555':
case '66666666666':
case '77777777777':
case '88888888888':
case '99999999999':
results.push(new ValidationResult(true, null, "Erro",
"Número do CNPJ inválido!"));
return results;
}
for (i=0; i < 12; i++){
a[i] = CNPJ.charAt(i);
b += a[i] * c[i+1];
}
if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
b = 0;
for (y=0; y < 13; y++) {
b += (a[y] * c[y]);
}
if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13]))
{
results.push(new ValidationResult(true, null, "Erro",
"Número do CNPJ inválido!"));
}
return results;
}
override protected function getValueFromSource():Object
{
var value:Object = {};
value.text = super.getValueFromSource();
return value;
}
}
}
PisValidator.as
package componentes
{
import mx.validators.ValidationResult;
import mx.validators.Validator;
public class PisValidator extends Validator
{
public function PisValidator()
{
super();
}
// Define the doValidation() method.
override protected function doValidation(value:Object):Array {
var results:Array = super.doValidation(value.text);
if (value.text != "") {
//Testa se o número do pis é válido ou não
var PIS:String = value.text;
var i:Number;
var digito:Number=0;
var total:Number=0;
var resto:Number=0;
var pesos:Array = new Array;
var erro:Boolean = false;
// Retira os dígitos formatadores de PIS '.' e '-', caso existam.
PIS.replace(".", "");
PIS.replace("-", "");
//verifica PIS manjados
switch (PIS) {
case '0':
case '00':
case '000':
case '0000':
case '00000':
case '000000':
case '0000000':
case '00000000':
case '000000000':
case '0000000000':
case '00000000000':
case '11111111111':
case '22222222222':
case '33333333333':
case '44444444444':
case '55555555555':
case '66666666666':
case '77777777777':
case '88888888888':
case '99999999999':
results.push(new ValidationResult(true, null, "Erro",
"Número do PIS inválido!"));
return results;
}
pesos[0] = 3;
pesos[1] = 2;
pesos[2] = 9;
pesos[3] = 8;
pesos[4] = 7;
pesos[5] = 6;
pesos[6] = 5;
pesos[7] = 4;
pesos[8] = 3;
pesos[9] = 2;
for (i=0; i<10; i++)
{
total = total + pesos[i] * parseInt(PIS.substr(i,1));
}
resto = total % 11;
if((11-resto)>9)
digito =0;
else
digito = (11 - resto);
if(digito != parseInt(PIS.substr(10,1)))
{
erro = true;
}else{
erro = false;
}
if(erro){
results.push(new ValidationResult(true, null, "Erro",
"Número do PIS inválido!"));
}
}
return results;
}
override protected function getValueFromSource():Object
{
var value:Object = {};
value.text = super.getValueFromSource();
return value;
}
}
}
main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:componentes="componentes.*"
>
<!-- Criando componentes utilizando o MaskedTextInput -->
<mx:Form>
<mx:FormItem label="CPF">
<componentes:MaskedTextInput id="txiCPF" inputMask="###.###.###-##" width="200" restrict="0-9" />
</mx:FormItem>
<mx:FormItem label="CNPJ">
<componentes:MaskedTextInput id="txiCNPJ" width="200" inputMask="##.###.###//####-##" maxChars="10" restrict="0-9"/>
</mx:FormItem>
<mx:FormItem label="PIS">
<componentes:MaskedTextInput id="txiPIS" width="200" inputMask="###.#####.##-#" maxChars="10" restrict="0-9"/>
</mx:FormItem>
</mx:Form>
<!-- Validator para CPF -->
<componentes:CpfValidator required="true"
source="{txiCPF}"
property="text"
requiredFieldError="Campo Obrigatório"
/>
<!-- Validator para CNPJ -->
<componentes:CnpjValidator required="true"
source="{txiCNPJ}"
property="text"
requiredFieldError="Campo Obrigatório"
/>
<!-- Validator para PIS -->
<componentes:PisValidator required="true"
source="{txiPIS}"
property="text"
requiredFieldError="Campo Obrigatório"
/>
</mx:Application>