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

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

[ Hits: 21.937 ]

 


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

Criando um repositório rápido de contole de versão com o Mercurial

Mudando a posição dos botões nas janelas do Ubuntu 10.04

Utilizando o Wiimote no Linux? Yes Wiican!

Rádio UOL com proxy transparente

BIOS sem opção de boot pelo CD-ROM

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts