Matheus Garcia
7 years ago
6 changed files with 183 additions and 66 deletions
@ -0,0 +1,50 @@ |
|||
CPF Profile Field |
|||
=== |
|||
This is a CPF field to user profiles into moodle. |
|||
|
|||
The Cadastro de Pessoas Físicas (CPF) – Portuguese for Natural Persons Register – is a number attributed by the Brazilian revenue agency (Receita Federal – Federal Revenue) to both Brazilians and resident aliens who pay taxes or take part, directly or indirectly, in activities that provide revenue for any of the dozens of different types of taxes existing in Brazil. |
|||
|
|||
More about CPF: http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas |
|||
|
|||
For Everyone |
|||
--- |
|||
This plugin was made to add possibility to add CPF field in the user profile form. |
|||
|
|||
Moodle documentation about profilefields -> http://docs.moodle.org/26/en/User_profile_fields |
|||
|
|||
I recommend to insert a mask plugin to the CPF field. I did as follows: |
|||
|
|||
- Added the Jquery masked Input plugin -> http://digitalbush.com/projects/masked-input-plugin/ |
|||
- Added the follow code relative to the masked field into the selected theme file: |
|||
> jQuery("#profilefield_cpf").mask("999.999.999-99"); |
|||
|
|||
Para Brasileiros |
|||
--- |
|||
Como CPF é um padrão brasileiro, a explicação será em português. :) |
|||
Este plugin foi criado para possibilitar a inclusão do campo cpf nos formulários de criação de novos usuários e também na alteração dos dados do usuário. |
|||
|
|||
Documentação de como utilizar os profilefields -> http://docs.moodle.org/26/en/User_profile_fields |
|||
|
|||
Recomendo inserir um plugin de máscara para o campo CPF. Eu fiz da seguinte forma: |
|||
- Adicionei o plugin Jquery masked Input -> http://digitalbush.com/projects/masked-input-plugin/ |
|||
- Adicionei o seguinte código referente à mascara do campo no tema utilizado: |
|||
> jQuery("#profilefield_cpf").mask("999.999.999-99"); |
|||
|
|||
Installation |
|||
--- |
|||
|
|||
As usual: |
|||
|
|||
* Download the source code (zip or git clone) |
|||
* Uncompress to user/profile/field/cpf |
|||
* Go to **Notifications** |
|||
|
|||
License |
|||
--- |
|||
|
|||
It is released as GPL v3. |
|||
|
|||
Authors: |
|||
* Willian Mano - http://willianmano.net |
|||
|
|||
Copyright 2014 onwards Willian Mano (http://willianmano.net) |
@ -1,57 +1,117 @@ |
|||
<?php |
|||
|
|||
class profile_field_cpf extends profile_field_base { |
|||
/** |
|||
* Overwrite the base class to display the data for this field |
|||
*/ |
|||
function display_data() { |
|||
/// Default formatting |
|||
$data = parent::display_data(); |
|||
$data = str_pad($data, 11, '0', STR_PAD_LEFT); // Prevent low digits formatting errors |
|||
if ($data !== '') { |
|||
$data = substr($data,0,3).'.'.substr($data,3,3).'.'.substr($data,6,3).'-'.substr($data,9,2); |
|||
public function edit_field_add($mform) { |
|||
$mform->addElement( |
|||
'text', |
|||
$this->inputname, |
|||
format_string($this->field->name), |
|||
'maxlength="11" size="11" id="profilefield_cpf" pattern="[0-9]{11}" data-tip="Informe o CPF (apenas números)" title="Apenas números"' |
|||
); |
|||
$mform->setType($this->inputname, PARAM_TEXT); |
|||
// if ($this->is_required() and !has_capability('moodle/user:update', get_context_instance(CONTEXT_SYSTEM))) { |
|||
// $mform->addRule($this->inputname, get_string('regexerrormessage', 'pluginname'), 'regex', '\d{11}'); |
|||
$mform->addRule($this->inputname, get_string('onlydigits', 'profilefield_cpf'), 'numeric', null, 'client'); |
|||
//get_string('required'), 'nonzero', null, 'client'); |
|||
// } |
|||
} |
|||
return $data; |
|||
|
|||
public function edit_validate_field($usernew) { |
|||
$return = array(); |
|||
if (isset($usernew->{$this->inputname})) { |
|||
if (!$this->exists($usernew->{$this->inputname}, $usernew->id)) { |
|||
$return[$this->inputname] = get_string('cpfexists', 'profilefield_cpf'); |
|||
} else if (!$this->validatecpf($usernew->{$this->inputname})) { |
|||
$return[$this->inputname] = get_string('invalidcpf', 'profilefield_cpf'); |
|||
} |
|||
} |
|||
return $return; |
|||
} |
|||
|
|||
function edit_field_add($mform) { |
|||
/// Create the form field |
|||
$mform->addElement('text', $this->inputname, format_string($this->field->name), 'maxlength="11" size="11"'); |
|||
$mform->setType($this->inputname, PARAM_TEXT); |
|||
// Define formatação para o campo de CPF |
|||
public function display_data() { |
|||
if( preg_match( "/^(\d{3})(\d{3})(\d{3})(\d{2})$/", $this->data, $matches ) ) { |
|||
$result = $matches[1] . '.' .$matches[2] . '.' . $matches[3] . '-' . $matches[4]; |
|||
} else { |
|||
$result = $this->data; |
|||
} |
|||
return $result; |
|||
} |
|||
|
|||
|
|||
/* |
|||
Testa se já existe algum usuário com este mesmo número de CPF. |
|||
Se existir, retorna falso, do contrário retorna verdadeiro. |
|||
*/ |
|||
private function exists($cpf = null, $userid = 0) { |
|||
global $DB; |
|||
|
|||
function edit_validate_field($usernew) { |
|||
// Get default validation errors |
|||
$errors = parent::edit_validate_field($usernew); |
|||
if ($errors) { |
|||
return $errors; |
|||
// Por definição, se for admin, aceita 00000000000 |
|||
if( is_siteadmin() && $cpf == '00000000000') { |
|||
return true; |
|||
} |
|||
|
|||
// Based on script by Moacir, in http://codigofonte.uol.com.br/codigos/validacao-de-cpf-com-php |
|||
if (isset($usernew->{$this->inputname})) { |
|||
$cpf = $usernew->{$this->inputname}; |
|||
if (!ctype_digit($cpf)) { |
|||
return array($this->inputname => get_string('cpf_digits', 'profilefield_cpf')); |
|||
// Verifica se um número foi informado. |
|||
if (is_null($cpf)) { |
|||
return false; |
|||
} |
|||
if (strlen($cpf) != 11) { |
|||
return array($this->inputname => get_string('cpf_size', 'profilefield_cpf')); |
|||
|
|||
$sql = "SELECT uid.data FROM {user_info_data} uid |
|||
INNER JOIN {user_info_field} uif ON uid.fieldid = uif.id |
|||
INNER JOIN {user} u on uid.userid = u.id |
|||
WHERE uif.datatype = 'cpf' AND u.deleted = 0 AND uid.data = :cpf AND uid.userid <> :userid"; |
|||
$params['cpf'] = $cpf; |
|||
$params['userid'] = $userid; |
|||
$dbcpf = current($DB->get_records_sql($sql, $params)); |
|||
|
|||
if (!empty($dbcpf)) { |
|||
return false; |
|||
} else { |
|||
return true; |
|||
} |
|||
if (in_array($cpf, array('00000000000', '11111111111', '22222222222', '33333333333', '44444444444', '55555555555', '66666666666', '77777777777', '88888888888', '99999999999'))) { |
|||
return array($this->inputname => get_string('cpf_invalid', 'profilefield_cpf')); |
|||
} |
|||
|
|||
/* |
|||
Verifica se um determinado valor passado corresponde a um número de CPF válido |
|||
Retorna verdadeiro apenas se DV bater com esperado |
|||
*/ |
|||
private function validatecpf($cpf = null) { |
|||
// Por definição, se for admin, aceita 00000000000 |
|||
if( is_siteadmin() && $cpf == '00000000000') { |
|||
return true; |
|||
} |
|||
|
|||
// Verifica se um numero foi informado. |
|||
if (is_null($cpf)) { |
|||
return false; |
|||
} |
|||
if (!is_numeric($cpf)) { |
|||
return false; |
|||
} |
|||
//$cpf = str_pad($cpf, 11, '0', STR_PAD_LEFT); |
|||
|
|||
// Verifica se o numero de digitos informados eh igual a 11. |
|||
if (strlen($cpf) != 11) { |
|||
return false; |
|||
} else if ($cpf == '00000000000' || $cpf == '11111111111' || $cpf == '22222222222' || |
|||
$cpf == '33333333333' || $cpf == '44444444444' || $cpf == '55555555555' || |
|||
$cpf == '66666666666' || $cpf == '77777777777' || $cpf == '88888888888' || |
|||
$cpf == '99999999999') { |
|||
return false; |
|||
} else { |
|||
// Calcula os digitos verificadores para verificar se o CPF eh valido. |
|||
for ($t = 9; $t < 11; $t++) { |
|||
|
|||
for ($d = 0, $c = 0; $c < $t; $c++) { |
|||
$v = substr($cpf,$c,1); |
|||
$d += $v * (($t + 1) - $c); |
|||
$d += $cpf{$c} * (($t + 1) - $c); |
|||
} |
|||
$v = substr($cpf,$c,1); |
|||
$d = ((10 * $d) % 11) % 10; |
|||
if ($v != $d) { |
|||
return array($this->inputname => get_string('cpf_invalid', 'profilefield_cpf')); |
|||
if ($cpf{$c} != $d) { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
return $errors; |
|||
} |
|||
|
|||
} |
|||
|
Loading…
Reference in new issue