How to validate CIS in ruby?

Asked

Viewed 2,123 times

3

To validate CPF and CNPJ I use 'brcpfcnpj' in Gemfile.

But I couldn’t find anything to validate the CIS.

Validating INSS Specific Registration in Ruby on Rails ?

5 answers

6

An explanation of the IEC validation can be found here:

http://www.igoia.info/index.php/dicas-diversas/115-digitos-verificadores/74-cei-cadastro-especifico-do-inss

Format: EE.NNN.NNNNN/AD

Where:
EE - Number
NNNNNNNN - Number
A - Activity
D - Digit Verifier

a) Multiply the last 11 figures by their respective weights, as below:

Pesos: 7,4,1,8,5,2,1,6,3,7,4
Digits: EENNNNNNNNA

Calculus:

7 * E = X1
4 * E = X2
1 * N = X3
8 * N = X4
5 * N = X5
2 * N = X6
1 * N = X7
6 * N = X8
3 * N = X9
7 * N = X10
4 * A = X11
D (posição do dígito)

b) Sum all products obtained under "a"

Soma = X1+2+X3+X4+X5+X6+X7+X8+X9+X10+X11

c) With the total obtained in item "b", add the digit of the unit with the digit of the ten.

Total = Dezena de soma + Unidade de soma

d) Subtract from 10 the digit of the unit of the obtained in item "c".

Resultado = 10 - Unidade de Total

The unit digit of the subtraction result shall be the check digit.

Digito verificador = Unidade de Resultado

An implementation of this written in Ruby:

def cei_valid?(cei_str)
    cei = cei_str.gsub(/\D+/, "").chars.map(&:to_i)
    return false unless cei.size == 12

    sum = [7,4,1,8,5,2,1,6,3,7,4].zip(cei).map{|p|p.reduce(:*)}.reduce(:+)
    dv = (10 - (sum%10 + sum/10)).abs % 10
    return dv == cei.last
end

Example:

cei_valid? "11.583.00249/85"
# => true
  • Do you know the meaning of the different numbers (EE, NNNNNN, and A)? What are the possible values for the activity, and make EE or NNNNNNNN have some meaning as the components of CNPJ?

3


So, here it goes:

def validaCEI(num)

      num = num.gsub(/\D+/,'')  #só digitos

      return false if num.size!=12

      x = []
      numDV = num[-1].to_i

      num = num.chop #remove digito verificador

      [7,4,1,8,5,2,1,6,3,7,4].each_with_index { |peso,i|  x << (peso * num[i].to_i)  }

      soma = 0
      x.each {|n| soma += n }

      dv1 = soma.to_s[-2].to_i + soma.to_s[-1].to_i

      dv2 = 10 - dv1

      (dv2.abs==numDV) ? true : false
  end

1

Validation of the IEC (INSS Specific Registry) in Java.

private boolean validaCei(String str_cei) {
      Formato: EE.NNN.NNNNN/AD (12 dígitos)
        Onde:
        EE -        Número
        NNNNNNNN -  Número
        A -         Atividade
        D -         Dígito Verificador

    String peso = "74185216374";
    Integer soma = 0;

    if (str_cei.length() != 12)
        return false;

    //Faz um for para multiplicar os números do CEI digitado pelos números do peso.
    //E somar o total de cada número multiplicado.
    for (int i = 1; i < 12; i++){
        String fator = peso.substring(i - 1, i);
        String valor = str_cei.substring(i - 1, i);
        soma += (Integer.parseInt(fator) * Integer.parseInt(valor));
    }

    //Pega o length do resultado da soma e desconta 2 para pegar somente a dezena.
    Integer len = soma.toString().length() - 2;

    //Pega a dezena
    Integer dezena = Integer.parseInt(soma.toString().substring(len));

    //Pega o algarismo da dezena
    String algarismoDaDezena = dezena.toString().substring(0, 1);

    //Pega o algarismo da unidade
    Integer unidade = soma - (((soma / 10)) * 10);

    //Soma o algarismo da dezena com o algarismo da unidade.
    soma = Integer.parseInt(algarismoDaDezena) + unidade;

    Integer digitoEncontrado = 10 - soma;

    //Pega o dígito (último número) do cei digitado.
    String digitoCEI = str_cei.substring(11);

    if (digitoCEI.equals(digitoEncontrado.toString()))
        return true;
    else
        return false;
}

1

Good afternoon, after spending a lot of time looking for (unsuccessfully) a function that validates the CEI (INSS specific registration) via javascript, I found the explanation of how to validate here and created a javascript function to validate. With me it worked well, follow the code for those who need in the future.

/*
DATA: 08/05/2017
Valida o CEI digitado. 
Faz um cálculo matemático de acordo com o peso: 7,4,1,8,5,2,1,6,3,7,4.
@PARAM: @Obj = OBJ DO CAMPO.
*/
function validarCEI(Obj) {
    //Retira qualquer tipo de mascara e deixa apenas números.
    var cei = Obj.value.replace(/[^\d]+/g, '');

    if (cei == ""){

        return false;
    }

    if (cei.length != 12) {
        alert("CEI digitado é inválido!") ;
        return false;
    }

    var peso = "74185216374";
    var soma = 0;

    //Faz um for para multiplicar os números do CEI digitado pelos números do peso.
    //E somar o total de cada número multiplicado.
    for (i = 1; i < 12; i++){
        var fator = peso.substring(i - 1, i);
        var valor = cei.substring(i - 1, i);
        soma += (fator * valor);
    }
    //Pega o length do resultado da soma e desconta 2 para pegar somente a dezena.
    var len = soma.toString().length - 2;

    //pega a dezena
    var dezena = soma.toString().substring(len);

    //pega o algarismo da dezena
    var algdezena = dezena.toString().substring(0, 1);

    //pega o algarismo da unidade
    var unidade = parseInt(soma) - (parseInt((soma / 10)) * 10);

    //soma o algarismo da dezena com o algarismo da unidade.
    soma = parseInt(algdezena) + unidade;

    //pega o dígito (último número) do cei digitado.
    var digitoCEI = cei.substring(11);
    var digitoEncontrado = 10 - soma;

    if (digitoCEI != digitoEncontrado) {
        alert("CEI digitado é inválido!") ;
        return false;
    } else {
        return true;
    }
}

-1

In PHP the correct is this, which is equivalent to the ruby code /a/17534/13508

function cei_valido($cei) 
{
    $cei = preg_replace('/[^0-9]/', '', $value);

    if (strlen($cei) != 12 || $cei == '000000000000') {
        return false;
    }

    $numbers     = str_split($cei);
    $dv1         = array_pop($numbers);
    $multipliers = [7, 4, 1, 8, 5, 2, 1, 6, 3, 7, 4];
    for ($i = 0; $i < 11; $i++) {
        $numbers[$i] = $numbers[$i] * $multipliers[$i];
    }
    $sum = array_sum($numbers);
    $dv2 = abs(10 - ($sum % 10 + $sum / 10)) % 10;

    return $dv2 == $dv1;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.