lunes, 10 de mayo de 2010

Validaciones: Módulo 11 (permite validar números de cuenta bancarias)


A continuación muestro como implementar la validación módulo 11 en .NET y SQL Server

En .NET:


public bool ValidaModulo11(string cuentaCliente)
        {
            string entidad = cuentaCliente.Substring(0, 4);
            string sucursal = cuentaCliente.Substring(4, 4);
            string DC = cuentaCliente.Substring(8, 2);
            string cuenta = cuentaCliente.Substring(10);
            string dcCalculado = DigitosControl(entidad, sucursal, cuenta).ToString();
            if (dcCalculado != DC)
            {
                return false;
            }
            else
            {
                return true;
            }

        }

        static string DigitosControl(string entidad, string sucursal, string cuenta)
        {
            string d = dc(entidad + sucursal, false);
            d += dc(sucursal + cuenta, true);
            return d;
        }

        static string dc(string numero, bool esCuenta)
        {
            int[] pesos;
            if (esCuenta == false)
            {
                pesos = new int[] { 3, 2, 7, 6, 5, 4, 3, 2, 5, 4, 3, 2 };

            }
            else
            {
                pesos = new int[] { 3, 2, 7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 };
            }
            int contador = 0;
            long s = 0, d;

            bool fin = false;
            while (fin == false)
            {
                d = int.Parse(new string(numero[contador], 1));
                s += d * pesos[contador];
                contador++;
                if (contador == numero.Length)
                    fin = true;
            }
            int resultado = (int)(11 - (s % 11));
            if (resultado == 10)
                resultado = 0;
            else if (resultado == 11)
                resultado = 1;
            return resultado.ToString();
        }      
    }

EN SQL:


CREATE  FUNCTION [dbo].[validaModulo11]
(
@cuentaBancaria nvarchar(30)
)
RETURNS bit    -- 0 cuenta incorrecta / 1 cuenta correcta
AS
BEGIN
    --
    --Variable con el valor que retornara la función.
DECLARE @Resultado bit

    --
DECLARE @subCadena1 nvarchar(10)
DECLARE @subCadena2 nvarchar(15)
    --


    DECLARE @control nvarchar(5)

DECLARE @peso1  nvarchar(10)
DECLARE @peso2  nvarchar(15)

SET @Resultado= 0
if (len(@cuentaBancaria)= 20 and ISNUMERIC(@cuentaBancaria)=1) --Es un numero de cuenta valido
begin
SET @peso1 ='32765432'
SET @peso2='32765432765432'
SET @subCadena1=SUBSTRING(@cuentaBancaria,1,8)
SET @subCadena2=SUBSTRING(@cuentaBancaria,5,4)+SUBSTRING(@cuentaBancaria,11,10)
select @control=dbo.calcularControlBanco(@peso1,@subCadena1)+ dbo.calcularControlBanco(@peso2,@subCadena2)
IF(@control=SUBSTRING(@cuentaBancaria,9,2))
 SET @Resultado= 1

end

RETURN @Resultado
END

GO

CREATE FUNCTION [dbo].[calcularControlBanco]
(
@peso nvarchar(20),
@digitos nvarchar(20)
)
RETURNS  nvarchar(5)
AS
BEGIN
DECLARE @suma int  
DECLARE @control int
DECLARE @varIndice int
    set @suma=0
    set @varIndice=1
WHILE len(@digitos)>=@varIndice
BEGIN
SET @suma = @suma + cast(CAST(SUBSTRING(@digitos,@varIndice,1) AS INT)* CAST(SUBSTRING(@peso,@varIndice,1) AS INT) as nvarchar(30))
SET @varIndice=@varIndice+1
END
 set @control= 11-(@suma%11)
  if(@control=10)
set @control=0
  else
 begin
if (@control =11)
set @control=1
 end
    return  convert(nvarchar(5),@control)
END

3 comentarios: