COBOL - Verifica o dígito verificador do CNPJ/CGC - www.cadcobol.com.br


Volta ao Menu Principal


Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

Pesos: 6543298765432
         1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890

      *-----------------------------------------------------------------
       IDENTIFICATION DIVISION.                                         
      *-----------------------------------------------------------------
       PROGRAM-ID.       CADVECGC.                                      
       AUTHOR.           DORNELLES CARLOS ALBERTO.                      
      *-----------------------------------------------------------------
      *  PROGRAMA      : CADVECGC                                       
      *  OBJETIVO      : Verifica o digito do CNPJ (CGC)           
      *  ANALISTA      : CARLOS ALBERTO DORNELLES                       
      *  DESENVOLVEDOR : CARLOS ALBERTO DORNELLES                       
      *  LINGUAGEM     : COBOL                                          
      *  MODO OPERACAO : BATCH                                          
      *  COMO USAR     : LKS-RETORNO ....: 0 = o codigo esta correto 
      *                                    1 = o codigo esta errado
      *                : LKS-NUMERO . ...: Numero informado                    
      *-----------------------------------------------------------------
      *  VERSAO DD.MM.AAAA  HISTORICO        AUTOR                             
      *  ------ ----------  ---------------  ---------------------------                           
      *    001  17.11.2011  PROGRAMA INICIAL DORNELLES CARLOS ALBERTO                           
      *-----------------------------------------------------------------
                                                                        
      *-----------------------------------------------------------------
       ENVIRONMENT DIVISION.                                            
      *-----------------------------------------------------------------
       CONFIGURATION SECTION.                                           
       SPECIAL-NAMES.    DECIMAL-POINT IS COMMA.                        
       INPUT-OUTPUT SECTION.                                            
       FILE-CONTROL.                                                    
                                                                        
      *-----------------------------------------------------------------
       DATA DIVISION.                                                   
      *-----------------------------------------------------------------
       FILE SECTION.                                                    
                                                                        
      *-----------------------------------------------------------------
       WORKING-STORAGE SECTION.                                         
      *-----------------------------------------------------------------
                                                                        
       01  WS-AUXILIARES.                                               
           05 WSS-IND-D                  PIC 9(002)  VALUE ZEROES.      
           05 WSS-IND-N                  PIC 9(002)  VALUE ZEROES.      
           05 WSS-IND-O                  PIC 9(002)  VALUE ZEROES.      
           05 WSS-IND-P                  PIC 9(002)  VALUE ZEROES.      
           05 WSS-SOMA                   PIC 9(008)  VALUE ZEROES.      
           05 WSS-NUMERO                 PIC 9(014)  VALUE ZEROES.      
           05 WSS-NUMERO-R               REDEFINES   WSS-NUMERO.          
              10  WSS-NUMERO-T           PIC 9(001)  OCCURS 14 TIMES.   
           05 WSS-PESOS                  PIC X(013)  VALUE SPACES.      
           05 WSS-PESOS-R                REDEFINES   WSS-PESOS.           
              10  WSS-PESOS-T            PIC 9(001)  OCCURS 13 TIMES.   
           05 WSS-QUOCI                  PIC 9(008)  VALUE ZEROES.      
           05 WSS-RESTO                  PIC 9(008)  VALUE ZEROES.      
           05 WSS-PESOS-CGC              PIC X(028)  VALUE              
                                         '6543298765432'.
      *-----------------------------------------------------------------
       LINKAGE SECTION.                                                 
      *-----------------------------------------------------------------
                                                                        
       01  LKS-PARAMETRO.
      * A variavel COMPRIMENTO somente sera usada para programas on-line                                               
           05 COMPRIMENTO                PIC S9(04) COMP. 
      *              
           05 LKS-RETORNO                PIC 9(001).                    
           05 LKS-NUMERO                 PIC 9(014).                    
                                                                        
      *-----------------------------------------------------------------
      * LKS-RETORNO      = 0 - Codigo verificado esta correto           
      *                  = 1 - Codigo verificado esta com erro          
      * LKS-NUMERO       = Numero informado ao programa                 
      *-----------------------------------------------------------------
                                                                        
      *-----------------------------------------------------------------
       PROCEDURE DIVISION USING LKS-PARAMETRO.                          
      *-----------------------------------------------------------------
                                                                        
           PERFORM P1000-INICIAL                       
           PERFORM P2000-PRINCIPAL                       
           PERFORM P4000-FINAL                       
           GOBACK.                                                      
                                                                        
      *-----------------------------------------------------------------
       P1000-INICIAL.                                                   
      *-----------------------------------------------------------------
                                                                        
           MOVE LKS-NUMERO    TO WSS-NUMERO
           MOVE WSS-PESOS-CGC TO WSS-PESOS.                              
                                                                        
       P1000-FIM.                                                       
           EXIT.                                                        
                                                                        
      *-----------------------------------------------------------------
       P2000-PRINCIPAL.                                                 
      *-----------------------------------------------------------------

           MOVE 01            TO WSS-IND-N                              
           MOVE 02            TO WSS-IND-P                              
           MOVE 12            TO WSS-IND-O 
           MOVE 13            TO WSS-IND-D                               
           MOVE ZEROES        TO WSS-SOMA                               
           PERFORM P3000-CALC-DIGITO THRU P3000-FIM                   
                                                                        
           MOVE 01            TO WSS-IND-N                              
           MOVE 01            TO WSS-IND-P                              
           MOVE 13            TO WSS-IND-O
           MOVE 14            TO WSS-IND-D                              
           MOVE ZEROES        TO WSS-SOMA                               
           PERFORM P3000-CALC-DIGITO THRU P3000-FIM.                  
                                                                        
       P2000-FIM.                                                       
           EXIT.                                                        
                                                                        
      *-----------------------------------------------------------------
       P3000-CALC-DIGITO.                                             
      *-----------------------------------------------------------------
                                                                        
           PERFORM UNTIL WSS-IND-N GREATER WSS-IND-O                    
                   COMPUTE WSS-SOMA = WSS-SOMA +                        
                                     (WSS-NUMERO-T (WSS-IND-N) *        
                                      WSS-PESOS-T  (WSS-IND-P))         
                   ADD 1 TO WSS-IND-N                                   
                            WSS-IND-P                                   
           END-PERFORM                                                  
           DIVIDE WSS-SOMA BY 11 GIVING WSS-QUOCI REMAINDER WSS-RESTO   
           IF WSS-RESTO EQUAL 0 OR 1                                    
              MOVE ZEROES TO WSS-NUMERO-T (WSS-IND-D)                          
           ELSE                                                         
              SUBTRACT WSS-RESTO FROM 11 GIVING WSS-NUMERO-T (WSS-IND-D)       
           END-IF.                                                      
                                                                        
       P3000-FIM.                                                       
           EXIT.                                                        
                                                                        
      *-----------------------------------------------------------------
       P4000-FINAL.                                                     
      *-----------------------------------------------------------------
                                                                        
           IF LKS-NUMERO EQUAL WSS-NUMERO                       
              MOVE 0 TO LKS-RETORNO                                 
           ELSE                                                     
              MOVE 1 TO LKS-RETORNO                                 
           END-IF.
                                                                        
       P4000-FIM.                                                       
           EXIT.                                                        


Como Calcular O Dígito Verificador Do CNPJ/CGC

Um CNPJ só é valido se estiver cadastrado na base da Receita Federal.
O CNPJ é composto de 14 algarismos, sendo os dois últimos dígitos verificadores.

Ele é dividido em três blocos:

  • o primeiro representa o número da inscrição da pessoa jurídica;
  • o segundo representa um código único para a matriz ou filial (após a barra);
  • o terceiro são os dígitos verificadores (DV).

Através dos dígitos verificadores podemos saber se ele tem o formato correto sem precisar consultar a Receita Federal.

Veja aqui como é feito a geração dos dígitos verificadores do CNPJ.

Cálculo do primeiro dígito verificador

De posse dos 12 algarismos do CNPJ, multiplique:

o primeiro algarismo por 5
o segundo  algarismo por 4
o terceiro algarismo por 3
o quarto algarismo por 2
o quinto algarismo por 9
o sexto  algarismo por 8
o sétimo algarismo por 7
o oitavo algarismo por 6
o nono   algarismo por 5
o décimo          algarismo por 4
o décimo primeiro algarismo por 3
o décimo segundo  algarismo por 2
  • Some todos os resultados e divida o total por 11.
  • Subtraia o resto encontrado de 11, ou seja 11 - RESTO.
  • Se o resultado for menor que 2 (zero ou hum), o primeiro dígito verificador é 0 (zero).
  • Caso contrário, o primeiro dígito verificador é o resultado da subtração.

Cálculo do segundo dígito verificador

Para obter o segundo dígito verificador, faça o mesmo procedimento que o primeiro dígito verificador.
Desta vez considerando o primeiro dígito verificador já calculado.

De posse dos 13 algarismos do CNPJ (os 12 mais o primeiro dígito verificador), multiplique:

o primeiro algarismo por 6
o segundo  algarismo por 5
o terceiro algarismo por 4
o quarto   algarismo por 3
o quinto   algarismo por 2
o sexto  algarismo por 9
o sétimo algarismo por 8
o oitavo algarismo por 7
o nono   algarismo por 6
o décimo algarismo por 5
o décimo primeiro algarismo por 4
o décimo segundo  algarismo por 3
o décimo terceiro algarismo por 2
  • Some todos os resultados e divida o total por 11.
  • Subtraia o resto encontrado de 11, ou seja 11 - RESTO.
  • Se o resultado for menor que 2 (zero ou hum), o segundo dígito verificador é 0 (zero).
  • Caso contrário, o segundo dígito verificador é o resultado da subtração.

Exemplo prático

Considerando o CNPJ 12.345.678/0001

Calculando o primeiro dígito verificador - Multiplicando

o primeiro algarismo por 5 (1 x 5 = 5)
o segundo  algarismo por 4 (2 x 4 = 8)
o terceiro algarismo por 3 (3 x 3 = 9)
o quarto   algarismo por 2 (4 x 2 = 8)
o quinto algarismo por 9 (5 x 9 = 45)
o sexto  algarismo por 8 (6 x 8 = 48)
o sétimo algarismo por 7 (7 x 7 = 49)
o oitavo algarismo por 6 (8 x 6 = 48)
o nono            algarismo por 5 (0 x 5 = 0)
o décimo          algarismo por 4 (0 x 4 = 0)
o décimo primeiro algarismo por 3 (0 x 3 = 0)
o décimo segundo  algarismo por 2 (1 x 2 = 2)
  • Somando todos os resultados (5 + 8 + 9 + 8 + 45 + 48 + 49 + 48 + 0 + 0 + 0 + 2 = 222)
  • Dividindo o total por 11 (222 / 11)
  • O resto desta divisão é 2
  • Subtraindo o resto encontrado de 11 (11 - 2 = 9).
  • O resultado é maior que 2, então o primeiro dígito verificador é 9 (nove).

Calculando o segundo dígito verificador - Multiplicando

o primeiro algarismo por 6 (1 x 6 = 6)
o segundo  algarismo por 5 (2 x 5 = 10)
o terceiro algarismo por 4 (3 x 4 = 12)
o quarto   algarismo por 3 (4 x 3 = 12)
o quinto   algarismo por 2 (5 x 2 = 10)
o sexto  algarismo por 9 (6 x 9 = 54)
o sétimo algarismo por 8 (7 x 8 = 56)
o oitavo algarismo por 7 (8 x 7 = 56)
o nono   algarismo por 6 (0 x 6 = 0)
o décimo algarismo por 5 (0 x 5 = 0)
o décimo primeiro algarismo por 4 (0 x 4 = 0)
o décimo segundo  algarismo por 3 (1 x 3 = 3)
o décimo terceiro algarismo por 2 (9 x 2 = 18)
  • Somando todos os resultados (6 + 10 + 12 + 12 + 10 + 54 + 56 + 56 + 0 + 0 + 0 + 3 + 18 = 237)
  • Dividindo o total por 11 (237 / 11)
  • O resto desta divisão é 6
  • Subtraindo o resto encontrado de 11 (11 - 6 = 5).
  • O resultado é igual a 5 (que é maior que 1), então o segundo dígito verificador é 5.

Resultado final: 12.345.678/0001-95