sexta-feira, 21 de agosto de 2009

Como validar CNPJ, CPF e PIS em FLEX

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>

3 comentários:

  1. sou iniciante em flex, inseri o componente MaskedTestInput, e esses arquivos e dá em erro pq o arquivo quando cria fica <ns1:MaskedTextInput

    fiz a referência em cima, mas deu errado...vc sabe como corrijo? outra coisa esse componente tem que digitar o ponto?

    Att.

    Wilso Paes

    ResponderExcluir
  2. could not resolve, como faz para ajeitar isso?

    ResponderExcluir
  3. No meu deu
    Type was not found or was not a compile-time constant: MaskedTextInput

    ResponderExcluir