viernes, 4 de noviembre de 2011

Comprobar numeración de tarjeta de crédito

Al igual que con los números de cuenta cada tipo de tarjeta de crédito tiene una configuración determinada, os voy a dejar un bloque de código donde se comprueban los formatos para los diferentes tipos de tarjetas de credito, Visa, MasteCard, American Express, Discover y Dinners Club. A ver si os vale


  vDigito:=COPYSTR(NumeroTarjeta,1,1);
  vDigito2:=COPYSTR(NumeroTarjeta,1,2);
  vDigito4:=COPYSTR(NumeroTarjeta,1,4);

//American express
  IF "Tipo Tarjeta"="Tipo Tarjeta"::"American Express" THEN BEGIN
    IF (vDigito2 = '34') OR (vDigito2 = '37') THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 15) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
      ERROR(TXT2,rPolizas.NumeroTarjeta,rPolizas."Tipo Tarjeta");
  END;

//Visa
  IF "Tipo Tarjeta"="Tipo Tarjeta"::Visa THEN BEGIN
    IF vDigito = '4' THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 13) AND (STRLEN(NumeroTarjeta) <> 16) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
      ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
  END;

//MasterCard
  IF "Tipo Tarjeta"="Tipo Tarjeta"::MasterCard THEN BEGIN
    IF (vDigito2 >= '51') AND (vDigito2 <= '55') THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 16) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
         ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
  END;

//Discover
  IF "Tipo Tarjeta"=."Tipo Tarjeta"::Discover THEN BEGIN
    IF vDigito4 = '6011' THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 16) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
      ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
  END;  

//Diners club
  IF "Tipo Tarjeta"="Tipo Tarjeta"::"Diners club" THEN BEGIN
    IF (vDigito2 = '30') OR (vDigito2 = '36') OR (vDigito2 = '38') THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 14) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
      ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
  END;

//Comprobar numeración de tarjeta
  vNuevoNT:='';
  FOR vIndex:=1 TO STRLEN(NumeroTarjeta) DO BEGIN
     vNuevoNT:='';
     IF vIndex MOD 2 <> 0 THEN BEGIN
        EVALUATE(vNoperar,FORMAT(NumeroTarjeta[vIndex]));
        IF vNoperar * 2 > 9 THEN BEGIN
          vNuevoNT:=FORMAT((vNoperar*2)-9);
        END
        ELSE BEGIN
            vNuevoNT:=FORMAT((vNoperar*2));
        END    
     END
     ELSE BEGIN
         vNuevoNT:=FORMAT(NumeroTarjeta[vIndex]);
     END;
     EVALUATE(vConvert,vNuevoNT);
     vResultado+=vConvert;
  END;
  IF (vResultado MOD 10 <> 0) AND (vResultado > 150) THEN
    ERROR('El numero de tarjeta %1 no es correcto',NumeroTarjeta);
END;

Sacar el dígito control de numero cuenta para comprobar si es correcto

Voy a dejar un bloque de código donde se realiza la comprobación del dígito de control de un número de cuenta para saber si este es correcto.



//Comprobar longitud y numero de cuenta
Suma1Int:=0;
Suma2Int:=0;
IF vTXTNumCuenta <> '' THEN BEGIN
  FOR vIndex:=1 TO 10 DO BEGIN
     Suma1:=0;
     Suma2:=0;
     EVALUATE(Digit1,COPYSTR(vTXTNumCuenta,9,1));
     EVALUATE(Digit2,COPYSTR(vTXTNumCuenta,10,1));
     CASE vIndex  OF
       1: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,1,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,11,1));
            Suma1Int:=Suma1*4;
            Suma2Int:=Suma2*1;
          END;

       2: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,2,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,12,1));
            Suma1Int+=Suma1*8;
            Suma2Int+=Suma2*2;
          END;

       3: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,3,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,13,1));
            Suma1Int+=Suma1*5;
            Suma2Int+=Suma2*4;
          END;

       4: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,4,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,14,1));
            Suma1Int+=Suma1*10;
            Suma2Int+=Suma2*8;
          END;

       5: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,5,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,15,1));
            Suma1Int+=Suma1*9;
            Suma2Int+=Suma2*5;
          END;

       6: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,6,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,16,1));
            Suma1Int+=Suma1*7;
            Suma2Int+=Suma2*10;
          END;

       7: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,7,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,17,1));
            Suma1Int+=Suma1*3;
            Suma2Int+=Suma2*9;
          END;

       8: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,8,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,18,1));
            Suma1Int+=Suma1*6;
            Suma2Int+=Suma2*7;
          END;

       9: BEGIN
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,19,1));
            Suma2Int+=Suma2*3;
          END;

       10:  BEGIN
              EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,20,1));
              Suma2Int+=Suma2*6;
            END;
     END;
  END;
//Primer dígito de control entidad+sucursal
  Parc1:=0;
  Parc1:= 11 - (Suma1Int MOD 11);
  IF Parc1 > 9 THEN
    Parc1:=11 - Parc1;

//Segundo dígito de control Numero Cuenta
  Parc2:=0;
  Parc2:=11 - (Suma2Int MOD 11);
  IF Parc2 > 9 THEN
    Parc2:=11 - Parc2;

  IF (Digit1 = Parc1) AND (Digit2 = Parc2) THEN BEGIN
  END
  ELSE BEGIN
    ERROR('Número cuenta erroneo, no corresponde el DC: %1%2',Parc1,Parc2);
  END;
END;