Calculando dígito verificador do CT-e (reconhecimento de trânsito)

Publicado por Cleiton Ap. de Souza em 04/08/2014

[ Hits: 16.401 ]

 


Calculando dígito verificador do CT-e (reconhecimento de trânsito)



Introdução

O objetivo principal dessa dica, é demonstrar como é feito para calcular o dígito verificador da chave de acesso do DACTE (Documento Auxiliar do Conhecimento de Transporte Eletrônico) e também passar um visão básica a respeito da composição numérica dessa chave.

Primeiramente, vamos deixar claro como funciona a chave de acesso.

A chave de acesso é encontrada no DACTE (Documento Auxiliar de Conhecimento de Transporte Eletrônico). É composta por 44 dígitos, os quais são validados pela Receita Federal.

Dentro desses 44 dígitos, existe alguns grupos de informações. Abaixo, segue cada grupo de informações, conforme seu significado e quantidade de digito(s):
  • Código da UF - código da UF do emitente do documento fiscal (2 caracteres).
  • Ano e mês da emissão - é a data composta pelos 2 últimos dígitos do ano e os 2 primeiros dígitos do mês. Ex.: "02/2014", ficará "1402" (4 caracteres).
  • CNPJ - CNPJ do emitente (14 caracteres).
  • Modelo - modelo do documento. No nosso caso, será sempre 57, pois é o que identifica o documento referente ao CT-e (2 caracteres).
  • Série - série do documento fiscal (3 caracteres).
  • Número do Ct-e - número do documento fiscal (9 caracteres).
  • Código numérico - esse é o código que compõe a chave de acesso (9 caracteres).
  • Dígito verificador - esse dígito é feito através de um cálculo, o qual será mostrado na sequência (1 caractere).

A imagem abaixo exemplificará detalhadamente um documento:

Para mais informações sobre a chave de acesso, recomendo a leitura do manual do CT-e:

Procedimentos

A seguir, veremos como é o procedimento para o cálculo do dígito verificador.

Calculando o dígito verificador.

O cálculo é muito simples:

1. Primeiramente, devemos multiplicar cada um dos números da chave de acesso por: 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 7, 8, 9... começando do 43º dígito para o primeiro (da direita para a esquerda):

2. Devemos somar todos os resultados de multiplicação.

3. O resultado da somatória será dividido por 11.

4. O resto da divisão deverá ser subtraída por 11.

5. Se o valor da subtração for 0 (zero) ou 1 (um) o valor do dígito será 0 (zero).

A seguir: o passo a passo acima em código fonte do Java.

Código fonte:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

        String valor = jTextField1.getText(); //Valor inputado pelo Usuario
        String valormult = "4329876543298765432987654329876543298765432"; //Valor a ser multiplicado
        String valorresmult = "0000000000000000000000000000000000000000000" ;
        double divisao=123.123;
        int resto=0,digitoV=0,digitoverificador=0;
        double soma=0;

        int[] valorJtxt = new int[valor.length()];
        int[] valorMulti = new int[valormult.length()];
        int[] valorResMult = new int[valorresmult.length()];

        if ((valor.length() < 43) ||(valor.length()> 43)) { // Verifica quantidade de
            JOptionPane.showConfirmDialog(null,"O campo deve conter");
        } else {
            //Guardando informações no Array da chave de acesso
            for (int i = 0; i < valorJtxt.length; i++) {
                valorJtxt[i] = Integer.parseInt(valor.substring(i, i+1));
                System.out.println("Valor da chave de acesso "+valorJtxt[i]);
            }
            //Guardando informações dos numeros que multiplicam
            for (int i=0; i< valorMulti.length;i++){
                valorMulti[i] = Integer.parseInt(valormult.substring(i, i+1));
                System.out.println("Valores para calculo "+valorMulti[i]);
            }
            //multiplicando os itens
            for (int i=0; i<43;i++){
                valorResMult[i] = valorMulti[i]*valorJtxt[i];
                System.out.println("Valores Multiplicados"+valorResMult[i]);
            }
            //Somando itens Multiplicados
            for (int i=0; i<43;i++){
                soma = soma + valorResMult[i];
                System.out.println("Valor Somado "+soma);
            }
            System.out.println("Soma "+soma);
            divisao = soma/11;
            System.out.println("Divisão "+divisao);
            resto = (int)soma % 11;
            System.out.println("Valor Do Resto da Divisão "+resto);

            digitoV = 11-resto;
            System.out.println("Valor 11 - Resto = "+digitoV);

           if ((resto == 0) || (resto==1)){
               digitoverificador= 0;
               jTextField2.setText(Integer.toString(digitoverificador));
               System.out.println("Valor Digito Verificador = "+digitoverificador);
           }else {
               digitoverificador=digitoV;
               jTextField2.setText(Integer.toString(digitoverificador));
               System.out.println("Valor Digito Verificador = "+digitoverificador);
           }
        }
    }

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Duzeru - Uma distro que nem DistroWatch conhece, ainda!

Como configurar tronco Vono no SNEP (1.3.X ou 2.X)

Como executar automaticamente scripts na inicialização do SystemD Linux

Gerenciando histórico de comandos no GNU/Linux

Quebrar senha de root do MySQL

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário