viernes, 27 de julio de 2012

Validar CBU

El algoritmo de validación del CBU es bastante sencillo.

Las validaciones principales que se pueden hacer es que el CBU tenga 22 digitos numericos y que sea de una entidad financiera en particular:

Por ejemplo si queremos solo aceptar solo CBU's del BANCO NACION deberiamos validar que el CBU ingresado empiece con el numero 011.

La lista de las entidades financieras validas es la siguiente:

  • 005 A.B.N AMRO BANK N.V.
  • 007 BANCO DE GALICIA Y BUENOS AIRES S.A.
  • 010 LLOYDS TSB BANK plc.
  • 011 BANCO DE LA NACION ARGENTINA
  • 014 BANCO DE LA PROVINCIA DE BUENOS AIRES
  • 015 BANKBOSTON, NATIONAL ASSOCIATION
  • 016 CITIBANK N.A.
  • 017 BBVA BANCO FRANCES S.A.
  • 018 THE BANK OF TOKYO - MITSUBISHI, LTD.
  • 020 BANCO DE LA PROVINCIA DE CORDOBA S.A.
  • 027 BANCO SOCIETE GENERALE S.A.
  • 029 BANCO DE LA CIUDAD DE BUENOS AIRES
  • 034 BANCO PATAGONIA SUDAMERIS S.A.
  • 044 BANCO HIPOTECARIO S.A.
  • 045 BANCO DE SAN JUAN S.A.
  • 046 BANCO DO BRASIL S.A.
  • 060 BANCO DEL TUCUMAN S.A.
  • 065 BANCO MUNICIPAL DE ROSARIO
  • 072 BANCO RIO DE LA PLATA S.A.
  • 079 BANCO REGIONAL DE CUYO S.A.
  • 083 BANCO DEL CHUBUT S.A.
  • 086 BANCO DE SANTA CRUZ S.A.
  • 093 BANCO DE LA PAMPA SOCIEDAD DE ECONOMIA MIXTA
  • 094 BANCO DE CORRIENTES S.A.
  • 097 BANCO PROVINCIA DEL NEUQUEN S.A.
  • 137 BANCO EMPRESARIO DE TUCUMAN COOP. LTDO.
  • 147 BANCO B. I. CREDITANSTALT S.A.
  • 150 HSBC BANK ARGENTINA S.A.
  • 165 J P MORGAN CHASE BANK SUCURSAL BUENOS AIRES
  • 191 BANCO CREDICOOP COOP. LTDO.
  • 198 BANCO DE VALORES S.A.
  • 247 BANCO ROELA S.A.
  • 254 BANCO MARIVA S.A.
  • 259 BANCO ITAU BUEN AYRE S.A.
  • 262 BANK OF AMERICA, NATIONAL ASSOCIATION
  • 265 BANCA NAZIONALE DEL LAVORO S.A.
  • 266 BNP PARIBAS
  • 268 BANCO PROVINCIA DE TIERRA DEL FUEGO
  • 269 BANCO DE LA REPUBLICA ORIENTAL DEL URUGUAY
  • 277 BANCO SAENZ S.A.
  • 281 BANCO MERIDIAN S.A.
  • 285 BANCO MACRO BANSUD S.A.
  • 293 BANCO MERCURIO S.A.
  • 294 ING BANK N.V.
  • 295 AMERICAN EXPRESS BANK LTD. S.A.
  • 297 BANCO BANEX S.A.
  • 299 BANCO COMAFI S.A.
  • 300 BANCO DE INVERSION Y COMERCIO EXTERIOR S.A.
  • 301 BANCO PIANO S.A.
  • 303 BANCO FINANSUR S.A.
  • 305 BANCO JULIO S.A.
  • 306 BANCO PRIVADO DE INVERSIONES S.A.
  • 309 NUEVO BANCO DE LA RIOJA S.A.
  • 310 BANCO DEL SOL S.A.
  • 311 NUEVO BANCO DEL CHACO S.A.
  • 312 M. B. A. BANCO DE INVERSIONES S.A.
  • 315 BANCO DE FORMOSA S.A.
  • 319 BANCO CMF S.A.
  • 321 BANCO DE SANTIAGO DEL ESTERO S.A.
  • 322 NUEVO BANCO INDUSTRIAL DE AZUL S.A.
  • 325 DEUTSCHE BANK S.A.
  • 330 NUEVO BANCO DE SANTA FE S.A.
  • 331 BANCO CETELEM ARGENTINA S.A.
  • 332 BANCO DE SERVICIOS FINANCIEROS S.A.
  • 335 BANCO COFIDIS S.A.
  • 336 BANCO BRADESCO ARGENTINA S.A.
  • 338 BANCO DE SERVICIOS Y TRANSACCIONES S.A.
  • 339 RCI BANQUE
  • 340 BACS BANCO DE CREDITO Y SECURITIZACION S.A.
  • 386 NUEVO BANCO DE ENTRE RIOS S.A.
  • 387 NUEVO BANCO SUQUIA S.A.
  • 388 NUEVO BANCO BISEL S.A.
  • 389 BANCO COLUMBIA S.A.


Luego debe separarse la CBU en 2 bloques:

El 1º bloque contiene:
  • Banco (3 dígitos)
  • Dígito Verificador 1 (1 dígito)
  • Sucursal (3 dígitos)
  • Dígito Verificador 2 (1 digito)

    El 2º bloque contiene:
      • Cuenta (13 dígitos)
      • Dígito Verificador (1 dígito)

      Validación:

      Por ejemplo: CBU 2850590940090418135201

      Validación 1º bloque (28505909)

      • Banco = 285 (Descomponer en sus dígitos B1 = 2, B2 = 8, B3 = 5)
      • DigitoVerificador1 = 0 
      • Sucursal = 590 (Descomponer en sus dígitos S1 = 5, S2 = 9, S3 = 0)
      • DigitoVerificador2 = 9
        Obtener:

        • SUMA1 = B1*7 + B2*1 + B3*3 + DigitoVerificador1*9 + S1*7 + S2*1 + S3*3
        • SUMA1 = 2*7 + 8*1 + 5*3 + 0*9 + 5*7 + 9*1 + 0*3 = 14 + 8 + 15 + 0 + 35 + 9 + 0 = 81
          Obtener:

          • DIFERENCIA1 = 10 - ultimo digito de SUMA1 = 10 - 1 = 9
          • Si DIFERENCIA1 = DigitoVerificador2 => CBU OK


            Validación 2º bloque (40090418135201)

            • Cuenta = 4009041813520 (Descomponer en sus dígitos C1 = 4, C2 = 0, C3 = 0, C4 = 9, C5 = 0, C6 = 4, C7 = 1, C8 = 8, C9 = 1, C10 = 3, C11 = 5, C12 = 2, C13 = 0
            • Digito = 1

            Obtener:

            • SUMA2 = C1*3 + C2*9 + C3*7 + C4*1 + C5*3 + C6*9 + C7*7 + C8*1 + C9*3 + C10*9 + C11*7 + C12*1 + C13*3
            • SUMA2 = 12 + 0 + 0 + 9 + 0 + 36 + 7 + 8 + 3 + 27 + 35 + 2 + 0
            • SUMA2 = 139

            Obtener:

            • DIFERENCIA2 = 10 - ultimo digito de SUMA2 = 10 - 9 = 1
            • Si DIFERENCIA2 = Digito => CBU OK


            Espero que les sirva!.. :)..

            18 comentarios:

            1. A este método le falta algo, por ejemplo este cbu (0170 0992 20000067797370, que existe y es válido) nunca te va a dar porque el resultado de la suma2 es 230.
              El último dígito es 0, por lo tanto:
              DIFERENCIA2 = 10 - 0 = 10
              Entonces falta esto: cuando el último dígito da cero y el DV es también cero, es válido.

              ResponderEliminar
              Respuestas
              1. Yo añadi un mod extra para solucionar esto y evitar un "if" adicional.

                (10 - (C1*3 + C2*9 + C3*7...) % 10) % 10

                PD: con el primer mod (%) obtenes el último dígito de la suma. Con el 2do solucionas el problema del 10.

                Eliminar
            2. Ojo con este metodo. Verificar el "digito verificador 1" que pertenece al codigo de banco.
              El ponderador es 9713.

              ResponderEliminar
            3. que util este dato, hay algo que estoy buscando hace tiempo, he llamado a banco central y banco nacion pero aun no lo he conseguido.alguien tiene algun listado de los "numeros de sucursal" de Banco Nacion, de tres digitos de la estructura que conforma la CBU.

              ResponderEliminar
            4. y como se calcula el digito verificador1? siempre es cero? me refiero al digito de la cuarta posicion...no esta esplicado, alguien podria decirme. gracias

              ResponderEliminar
            5. Estimado. Esta rutina no siempre funciona. La correcta para el primer bloque es aplicar los mutiplicadores 3 9 7 1 3 9 7. El digito del primer bloque es la unidad de la suma resultante.

              ResponderEliminar
            6. El segundo bloque tiene el mismo error, alguien tiene la solucion ?

              ResponderEliminar
            7. Este comentario ha sido eliminado por el autor.

              ResponderEliminar
            8. En python, funciona para los CBU que pusieron aquí. Fijensé que la direfencia lo resolví tomando el resto del módulo por fuera de la diferencia. Por aritmética de congruencia se puede ver fácil que

              (10-s1%10) == (10-s1) (10)

              Que al fin y al cabo, la solución al problema que tiene originalmente el algoritmo es que no toma el resto de la diferencia antes de comparar contra el dígito.

              def cbu_validate(cbu):
              ....if type(cbu) == int: cbu = "%022d" % cbu
              ....cbu = cbu.strip()
              ....if len(cbu) != 22: return False
              ....s1 = sum( int(a)*b for a,b in zip(cbu[0:7],(7,1,3,9,7,1,3)) )
              ....d1 = (10 - s1) % 10
              ....if d1 != int(cbu[7]): return False
              ....s2 = sum( int(a)*b for a,b in zip(cbu[8:-1],(3,9,7,1,3,9,7,1,3,9,7,1,3)) )
              ....d2 = (10 - s2) % 10
              ....if d2 != int(cbu[-1]): return False
              ....return True

              (una vez copiado reemplazar los puntos por espacios)

              ResponderEliminar
              Respuestas
              1. Probé tu metodo Cristian y no funciona del todo bien. :(

                Eliminar
              2. Perdón retiro lo dicho. Tu método anda muy bien jajaja.
                Era cuestión de probar y probar

                Eliminar
            9. Este comentario ha sido eliminado por el autor.

              ResponderEliminar
            10. alguien me puede decir comjo obtener listado de cbu de los bancos?

              ResponderEliminar
            11. alguien me puede decir comjo obtener listado de cbu de los bancos?

              ResponderEliminar
              Respuestas
              1. Los datos de CBU reales son datos privados.. no creo que se pueda conseguir un listado de todos los CBU'S de un bco particular.
                Lo que hay que tener en claro que todos los CBU'S de un banco, comenzaran de la misma forma, ya que como se explico previamente los primeros 3 digitos indican el numero de bco.
                Por ejemplo todos los CBU'S del Banco Nacion comenzaran con: 011.

                Eliminar