COBOL - Calcula 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.       CADCACGC.                                      
       AUTHOR.           CARLOS ALBERTO DORNELLES.                      
      *-----------------------------------------------------------------
      *  PROGRAMA      : CADCACGC                                       
      *  OBJETIVO      : Calcula o digito do CNPJ (CGC)           
      *  ANALISTA      : CARLOS ALBERTO DORNELLES                       
      *  LINGUAGEM     : COBOL                                          
      *  MODO OPERACAO : BATCH                                          
      *  COMO USAR     : LKS-NUMERO ......: Numero informado            
      *                : LKS-CALCULADO ...: Numero calculado            
      *-----------------------------------------------------------------
      *  VERSAO DD.MM.AAAA  HISTORICO/AUTOR                             
      *  ------ ----------  ---------------                             
      *    001  17.11.2011  PROGRAMA INICIAL                            
      *-----------------------------------------------------------------
                                                                        
      *-----------------------------------------------------------------
       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(013)  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-I               PIC X(012).                    
           05 LKS-NUMERO-C               PIC 9(014).                    
                                                                        
      *-----------------------------------------------------------------
      * LKS-RETORNO      = 0 - Codigo verificado esta correto           
      *                  = 1 - Codigo verificado esta com erro          
      * LKS-NUMERO-I     = Numero informado ao programa                 
      * LKS-NUMERO-C     = Numero calculado                 
      *-----------------------------------------------------------------
                                                                        
      *-----------------------------------------------------------------
       PROCEDURE DIVISION USING LKS-PARAMETRO.                          
      *-----------------------------------------------------------------
                                                                        
           PERFORM P1000-INICIAL                       
           PERFORM P2000-PRINCIPAL                       
           PERFORM P4000-FINAL                       
           GOBACK.                                                      
                                                                        
      *-----------------------------------------------------------------
       P1000-INICIAL.                                                   
      *-----------------------------------------------------------------
                            
           IF  LKS-NUMERO-I NOT NUMERIC
               MOVE 1 TO LKS-RETORNO
               GOBACK
           ELSE 
               MOVE LKS-NUMERO-I  TO WSS-NUMERO (1:12)
               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.                                                     
      *-----------------------------------------------------------------
                                                                        
           MOVE 0          TO LKS-RETORNO.
           MOVE WSS-NUMERO TO LKS-NUMERO-C.
                                                                        
       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