17 de junio de 2002

Validar CBU (solo para Argentina)

Rutina que valida la CBU (Clave Bancaria Uniforme) para Argentina
*------------------------------------------------------------
* FUNCTION ValidarCBU(tcCBU)
*------------------------------------------------------------
* Valida CBU (Clave Bancaria Uniforme)
* Solamente para la Argentina
* USOS:
*   ? ValidarCBU("2650450-2 0214505639667-6")
*   ? ValidarCBU("2650450202145056396676")
*   ? ValidarCBU("26504502/02145056396676")
*------------------------------------------------------------
*-- Formato del CBU:
*--   EEESSSS-V TTTTTTTTTTTTT-V
*-- Bloque 1:
*--   EEE - Número de entidad (3 posiciones)
*--   SSSS - Número de sucursal (4 posiciones)
*--   V - Dígito verificador de las primeras 7 posiciones
*-- Bloque 2:
*--   TTTTTTTTTTTTT - Identificación de la cuenta individual
*--   V - Dígito verificador de las anteriores 13 posiciones
*--
*-- Para el cálculo de los dígitos verificadores se
*-- debe aplicar la clave 10 con el ponderador 9713
*------------------------------------------------------------
FUNCTION ValidarCBU(tcCBU)
  LOCAL lcCBU, lcBloque1, lcBloque2
  lcCBU = CHRTRAN(tcCBU,CHRTRAN(tcCBU,"1234567890",""),"")
  IF LEN(lcCBU) = 22
    lcBloque1 = SUBSTR(lcCBU, 1, 8)
    lcBloque2 = SUBSTR(lcCBU, 9, 14)
    RETURN ValidarDigito(lcBloque1) ;
     AND ValidarDigito(lcBloque2)
  ELSE
    RETURN .F. && Largo de CBU incorrecto
  ENDIF
ENDFUNC

*------------------------------------------------------------
* FUNCTION ValidarDigito(tcBloque)
*------------------------------------------------------------
* Valida Dígito Verificador
*------------------------------------------------------------
FUNCTION ValidarDigito(tcBloque)
  *-- Ponderador '9713'
  #DEFINE Pond '9713'
  LOCAL lnSuma, lnLargo, ln, lcDigito, lcBloque
  lnSuma = 0
  lnLargo = LEN(tcBloque)
  lcDigito = SUBSTR(tcBloque, lnLargo, 1)
  lcBloque = SUBSTR(tcBloque, 1, lnLargo - 1)
  FOR ln = 1 TO lnLargo - 1
    lnSuma = lnSuma + ;
      VAL(SUBSTR(lcBloque, lnLargo - ln, 1)) * ;
      VAL(SUBSTR(Pond, MOD(4-ln,4) + 1, 1))
  ENDFOR
  RETURN lcDigito = RIGHT(STR(10 - MOD(lnSuma, 10)),1)
ENDFUNC
*------------------------------------------------------------
Luis María Guayán

No hay comentarios. :

Publicar un comentario