2Respostas


O Lumis tem um controle de validação via expressão regular que permite incluir validações client side e server side em vários controles do tipo input. Por exemplo se eu quiser validar se um CEP tem 5 posições separadas por um traço e com mais 3 digitos a direita posso realizar a seguinte validação.

<control:lum_inputText id="CEP" dataId="CEP" style="width:40px;">
	<control:lum_regularExpressionValidator expression="^\d{5}-\d{3}$" enableClientSideValidation="true" errorMessage="formato errado" />
</control:lum_inputText>


Agora gostaria de saber se existe a possibilidade de realizar uma validação completa de CPF e RG sem apelar para javascripts apenas utilizando esse recurso de validação via expressão regular.

 

Em 30/05/2009 20:56

2 Respostas

 Oi Ricardo,

a expressão regular irá validar apenas o formato do CPF (se contém números, hífens etc...)

Exemplo: d{3}.?d{3}.?d{3}-?d{2}

Agora, para verificar se o CPF é válido, não tem como fugir da matemática dos javascripts (a não ser que o Lumis encapsule isso de alguma forma para você)

Abraços,

Aman

Em 31/05/2009 12:47
Responder

Como o Aman disse, para fazer a validação do dígito verificador, é necessário fazer uma implementação.

Como se trata de uma validação, recomenda-se o uso tanto de validação client-side, quanto server-side. A primeira serve para melhorar a experiência do usuário, uma vez que ele não precisa esperar um round-trip ao servidor para ter o resultado da validação. Já a segunda é usada por segurança, uma vez que o cliente pode não estar com o Javascript habilitado.

Para cenários como esse, uma maneira interessante é criar um controle de validação específico, de modo que possa ser reutilizado em vários projetos. Como há uma validação de regular expression envolvida, pode-se estender o controle lumis.doui.control.validator.RegularExpressionValidatorControl para acrescentar a validação de dígito verificador client e server side.

Abaixo segue um exemplo de como fazer:

Arquivo def/lumis/sample/testecpfvalidator/servicedefinition.xml:

<?xml version="1.0" encoding="UTF-8"?>
<serviceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/servicedefinition.xsd">
	<service id="lumis.sample.testecpfvalidator" name="Teste de controle de valida??o de CPF" type="lum_doui" />
	<interfaces>
		<interface id="Teste" name="Teste" type="lum_doui" />
	</interfaces>
</serviceDefinition>

Arquivo def/lumis/sample/testecpfvalidator/douidefinition.xml:

<?xml version="1.0" encoding="UTF-8"?>
<douiDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.lumis.com.br/lumisportal/xsd/douidefinition.xsd"  xmlns:control="http://www.lumis.com.br/douicontrols">
	<service id="lumis.sample.testecpfvalidator" />
	<interfaces>
		<interface id="Teste">
			<controls>
				<control:lum_form>
					<control:lum_inputText id="cpf">
						<control:lum_regularExpressionValidator className="lumis.sample.CPFValidatorControl" errorMessage="CPF inválido!" id="cpfValidator"/>
					</control:lum_inputText>
					<control:lum_button text="Validar">
						<onClick type="processAction" processActionId="ok" />
					</control:lum_button>
				</control:lum_form>
			</controls>
			<processActions>
				<processAction id="ok" type="generic">
					<response type="doui_message" message="OK! CPF Válido!" />
				</processAction>
			</processActions>
		</interface>
	</interfaces>
</douiDefinition>

Arquivo src/java/lumis/sample/CPFValidatorControl.java:

package lumis.sample;

import org.w3c.dom.Node;

import lumis.doui.control.ControlContainer;
import lumis.doui.control.ControlException;
import lumis.doui.control.IClientSideReadableControl;
import lumis.doui.control.IControl;
import lumis.doui.control.IDataControl;
import lumis.doui.control.IErrorSummaryControl;
import lumis.doui.control.validator.RegularExpressionValidatorControl;
import lumis.portal.PortalException;
import lumis.portal.UnexpectedException;
import lumis.util.XmlUtil;

public class CPFValidatorControl extends RegularExpressionValidatorControl 
{
	protected static final String DEFAULT_EXPRESSION = "\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}";

	public void init(Node controlDefinitionNode, ControlContainer controlContainer, IControl parentControl) throws PortalException
	{
		super.init(controlDefinitionNode, controlContainer, parentControl);
		expression = DEFAULT_EXPRESSION;
	}

	@Override
	public boolean doServerValidation() throws PortalException {
		if (!super.doServerValidation())
			return false;

		IControl control = getControlToValidate();
		
		if(!(control instanceof IDataControl))
			throw new ControlException("STR_VALIDATING_NON_DATA_CONTROL");
		
		IDataControl controlToValidate = (IDataControl)control;
		
		if (controlToValidate.getValue() != null)
		{
			String cpf = controlToValidate.getValue().toString().replaceAll("[.-]", "");
	        boolean valid = CPF.validaCPF(cpf);
	        if (!valid)
	        {
	        	messages = getMessages();

				if (messages.getErrorMessage() != null)
				{
					// localize error message
					String errorMessage = localize(messages.getErrorMessage());
					IErrorSummaryControl errorSummaryControl = controlContainer.getErrorSummaryControl();
					errorSummaryControl.addErrorMessage(errorMessage);
				}

				controlToValidate.setValid(false);
				return false;
	        }
		}
		return true;
	}

	@Override
	public String getScriptValidationFunctionImplementation()
			throws PortalException {

		String controlToValidateId = XmlUtil.readAttributeString("controlToValidateId", controlDefinitionNode);

		IControl controlToValidate = null;
		if(controlToValidateId == null)
			controlToValidate = this.getParentControl();
		else
			controlToValidate = controlContainer.getControlById(controlToValidateId);
		
		StringBuilder code = new StringBuilder();

		code.append("function originalValidation(){");
		code.append(super.getScriptValidationFunctionImplementation());
		code.append("}");
		code.append("if (!originalValidation()) return false;");
		code.append("var s = " + ((IClientSideReadableControl)controlToValidate).getScriptGetValues() + ";");
		code.append("if (s[0] == '') {");
		code.append(getScriptClear());
		code.append(";");
		code.append("return true; }");
		code.append("if (!ValidaCPF(s[0])) {" + getScriptSetMessages(douiContext.getTransaction())+ "; return false;}");
		code.append("return true;");

		return code.toString();
	}

	@Override
	protected void includeScripts() throws PortalException
	{
		super.includeScripts();
		try
		{
			douiContext.getRenderResponse().getBeforeWriter().print("<script type=\"text/javascript\" charset=\"UTF-8\" src=\"CPFValidatorControl.js\"></script>", "CPFValidatorControl.js");
		}
		catch (Exception e)
		{
			throw new UnexpectedException(e);
		}
	}
}

Arquivo src/java/lumis/sample/CPF.java:

package lumis.sample;

// Código abaixo obtido em http://www.javafree.org/artigo/851371/Validacao-de-CPF.html

/* ******************************************************
 * Código  <a href='#' onClick="hwClick3367388890917(1701657801);return false;" style='cursor: hand; color:#006600; text-decoration:underline; border-bottom:dotted 1px;' onmouseover="hw3367388890917(event, this, '1701657801'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';"  onmouseout="hideMaybe(event, this); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " oncontextmenu="return false;">Original</a>:
 * Autor: Allan Peron
 * ******************************************************
 * Modificações feitas para fácil aplicação
*/

public abstract class CPF extends Object 
{

   private static String calcDigVerif(String num) {
       Integer primDig, segDig;
       int soma = 0, peso = 10;
       for (int i = 0; i < num.length(); i++)
               soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;

       if (soma % 11 == 0 | soma % 11 == 1)
           primDig = new Integer(0);
       else
           primDig = new Integer(11 - (soma % 11));

       soma = 0;
       peso = 11;
       for (int i = 0; i < num.length(); i++)
               soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;
       
       soma += primDig.intValue() * 2;
       if (soma % 11 == 0 | soma % 11 == 1)
           segDig = new Integer(0);
       else
           segDig = new Integer(11 - (soma % 11));

       return primDig.toString() + segDig.toString();
   }

   private static int calcSegDig(String cpf, int primDig) {
       int soma = 0, peso = 11;
       for (int i = 0; i < cpf.length(); i++)
               soma += Integer.parseInt(cpf.substring(i, i + 1)) * peso--;
       
       soma += primDig * 2;
       if (soma % 11 == 0 | soma % 11 == 1)
           return 0;
       else
           return 11 - (soma % 11);
   }

   public static String geraCPF() {
       String iniciais = "";
       Integer numero;
       for (int i = 0; i < 9; i++) {
           numero = new Integer((int) (Math.random() * 10));
           iniciais += numero.toString();
       }
       return iniciais + calcDigVerif(iniciais);
   }

   public static boolean validaCPF(String cpf) {
       if (cpf.length() != 11)
           return false;

       String numDig = cpf.substring(0, 9);
       return calcDigVerif(numDig).equals(cpf.substring(9, 11));
   }
}

Arquivo www/CPFValidatorControl.js:

// Código obtido em http://www.construindoseusite.com.br/javascript/scripts/js_validacao_cpf_imp.htm
// Autores: Anderson Luciano Santos da Silva e Marçal de Lima Hokama
// Adaptado para não exibir mensagens, apenas validar CPF, e também para validar tamanho.
function ValidaCPF(CPF)
{
	CPF = (CPF+"").replace(/[.-]/g, "");
	if (CPF.length != 11)
		return false;

	// Aqui começa a checagem do CPF
	var POSICAO, I, SOMA, DV, DV_INFORMADO;
	var DIGITO = new Array(10);
	DV_INFORMADO = CPF.substr(9, 2); // Retira os dois últimos dígitos do número informado

	// Desemembra o número do CPF na array DIGITO
	for (I = 0; I <= 8; I++) {
		DIGITO[I] = CPF.substr(I, 1);
	}

	// Calcula o valor do 10º dígito da verificação
	POSICAO = 10;
	SOMA = 0;
	for (I = 0; I <= 8; I++) {
		SOMA = SOMA + DIGITO[I] * POSICAO;
		POSICAO = POSICAO - 1;
	}
	DIGITO[9] = SOMA % 11;
	if (DIGITO[9] < 2) {
		DIGITO[9] = 0;
	}
	else {
		DIGITO[9] = 11 - DIGITO[9];
	}

	// Calcula o valor do 11º dígito da verificação
	POSICAO = 11;
	SOMA = 0;
	for (I = 0; I <= 9; I++) {
		SOMA = SOMA + DIGITO[I] * POSICAO;
		POSICAO = POSICAO - 1;
	}
	DIGITO[10] = SOMA % 11;
	if (DIGITO[10] < 2) {
		DIGITO[10] = 0;
	}
	else {
		DIGITO[10] = 11 - DIGITO[10];
	}

	// Verifica se os valores dos dígitos verificadores conferem
	DV = DIGITO[9] * 10 + DIGITO[10];
	if (DV != DV_INFORMADO) {
		return false;
	}
	return true;
}

 

Em 02/06/2009 04:07
Responder

Acompanhar pergunta

Receba atualizações e novas respostas por e-mail, e ajude a resolver as dúvidas da comunidade.

Realize Login para poder seguir!