Skip to content

Instantly share code, notes, and snippets.

@andervilo02
Last active March 2, 2016 19:55
Show Gist options
  • Save andervilo02/9dd706dd401900ad6ea6 to your computer and use it in GitHub Desktop.
Save andervilo02/9dd706dd401900ad6ea6 to your computer and use it in GitHub Desktop.
<?php
/**
* Arquivo forms/validate/Cnpj.php
*/
class Validate_Cnpj extends Zend_Validate_Abstract
{
const CNPJ_INVALIDO = "cnpj_invalido";
protected $_messageTemplates = array (
self::CNPJ_INVALIDO => "CNPJ Inválido"
);
public function isValid($cnpj)
{
// Garante que o CNPJ é uma string
$cnpj = (string) $cnpj;
$this->_setValue($cnpj);
// Deixa o CNPJ com apenas números
$cnpj = preg_replace( '/[^0-9]/', '', $cnpj );
// O valor original
$cnpj_original = $cnpj;
// Captura os primeiros 12 números do CNPJ
$primeiros_numeros_cnpj = substr( $cnpj, 0, 12 );
// verificar por dígitos iguauis
$regex = "/^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/";
if (preg_match($regex, $cnpj)) {
$this->_error(self::CNPJ_INVALIDO);
return false;
}
/**
* Multiplicação do CNPJ
*
* @param string $cnpj Os digitos do CNPJ
* @param int $posicoes A posição que vai iniciar a regressão
* @return int O
*
*/
if ( ! function_exists('multiplica_cnpj') )
{
function multiplica_cnpj( $cnpj, $posicao = 5 )
{
// Variável para o cálculo
$calculo = 0;
// Laço para percorrer os item do cnpj
for ( $i = 0; $i < strlen( $cnpj ); $i++ )
{
// Cálculo mais posição do CNPJ * a posição
$calculo = $calculo + ( $cnpj[$i] * $posicao );
// Decrementa a posição a cada volta do laço
$posicao--;
// Se a posição for menor que 2, ela se torna 9
if ( $posicao < 2 ) {
$posicao = 9;
}
}
// Retorna o cálculo
return $calculo;
}
// Faz o primeiro cálculo
$primeiro_calculo = multiplica_cnpj( $primeiros_numeros_cnpj );
// Se o resto da divisão entre o primeiro cálculo e 11 for menor que 2, o primeiro
// Dígito é zero (0), caso contrário é 11 - o resto da divisão entre o cálculo e 11
$primeiro_digito = ( $primeiro_calculo % 11 ) < 2 ? 0 : 11 - ( $primeiro_calculo % 11 );
// Concatena o primeiro dígito nos 12 primeiros números do CNPJ
// Agora temos 13 números aqui
$primeiros_numeros_cnpj .= $primeiro_digito;
// O segundo cálculo é a mesma coisa do primeiro, porém, começa na posição 6
$segundo_calculo = multiplica_cnpj( $primeiros_numeros_cnpj, 6 );
$segundo_digito = ( $segundo_calculo % 11 ) < 2 ? 0 : 11 - ( $segundo_calculo % 11 );
// Concatena o segundo dígito ao CNPJ
$cnpj = $primeiros_numeros_cnpj . $segundo_digito;
// Verifica se o CNPJ gerado é idêntico ao enviado
if ( $cnpj !== $cnpj_original ) {
$this->_error(self::CNPJ_INVALIDO);
return false;
}
return true;
}
}
}
<?php
/**
* Arquivo forms/validate/Estado.php
*/
class Validate_Estado extends Zend_Validate_Abstract
{
const ESTADO = "estado_invalido";
protected $_messageTemplates = array (
self::ESTADO => "Estado Inválido"
);
public function isValid($value)
{
$siglas = ['AC','AL','AP','AM','BA','CE','DF','ES','GO','MA','MT','MS','MG','PA','PB','PR','PE','PI','RJ','RN','RS','RO','RR','SC','SP','SE','TO'];
if(!in_array($value, $siglas)){
$this->_error(self::ESTADO);
return false;
}
return true;
}
}
<?php
class Application_Form_Teste extends Zend_Form
{
public function init()
{
$this->setName('fornecedor');
$this->setAttrib('class', 'form-horizontal');
$this->addElementPrefixPath(
'Validate', APPLICATION_PATH . '/forms/validate/', 'validate'
);
}
$cnpj = new Zend_Form_Element_Text('cnpj');
$cnpj->setLabel('CNPJ')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($notEmpty, true)
->addValidator('Cnpj')
->setAttrib('class', 'form-control cnpj')
->setAttrib('placeholder', 'CNPJ');
$uf = new Zend_Form_Element_Text('uf');
$uf->setLabel('Estado')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator($notEmpty, true)
->addValidator('Estado')
->setAttrib('class', 'form-control text-uppercase')
->setAttrib('v-model', 'fornecedor.uf')
// ->setAttrib('v-on:keyup', 'buscaSigla')
->setAttrib('placeholder', 'ESTADO')
->setAttrib('maxLength', 2);
}
@andervilo02
Write
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment