Mostrando las entradas con la etiqueta Validaciones. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Validaciones. Mostrar todas las entradas

martes, 18 de mayo de 2010

Validador de Archivos


Ver en CodePlex http://filevalidator.codeplex.com/

En un proyecto del sector bancario existía un requerimiento en donde los clientes suben archivos al servidor para procesar una serie de pagos, básicamente la aplicación WEB guarda el archivo en una ruta en especifico  y luego un servicio de Windows agarra el archivo y lo carga en BD para correr una serie de validaciones y procesos.

El requerimiento indicaba que había que validar el formato del archivo de texto antes de proceder a cargarlo en BD, por lo cual surge el presente componente.

El Componente permite realizar la validación de archivos (txt, imagenes, PDF, etc) actualmente solo tiene implementado la parte de los txt, permite validar un archivo con cabecera o no, con registros o no, permite la validación de cada columna del archivo.

Ejemplos:

Validar un archivo que tenga 6 columnas de header y al menos 2 registros (1 header y 1 detalle) El detalle debe tener 5 columnas
//Nota: El separador de columnas es punto y coma (;) pero es seteable para cualquier caracter en el header y en el detalle
ValidateContentFile target = new ValidateContentFile();
target.CantidadMinimaLineas = 2;
target.ValidarContenido = new BodyValidation();
target.ValidarContenido.CantidadMinColumnas = 5;
target.ValidarHeader = new HeaderValidation();
target.ValidarHeader.CantidadColumnas =6;
//Puede indicar la ruta o pasar un array de Bytes
DTOresultado expected = target.ValidateContent(FilePath, ValidateContentFile.ValidationType.OnlyText);


Validar un archivo que tenga 6 columnas de header y al menos 2 registros (1 header y 1 detalle) El detalle debe tener 5 columnas
Y ademas que la primera columna del Header sea un Rif, y la segunda sea una número de cuenta (20 digitos)
Ademas se desea que en el contenido tenga en la cuarta columna números que inicien en 0174 o 0428

ValidateContentFile target = new ValidateContentFile();
target.CantidadMinimaLineas = 2;
target.ValidarContenido = new BodyValidation();
target.ValidarContenido.CantidadMinColumnas = 5;
target.ValidarHeader = new HeaderValidation();
target.ValidarHeader.CantidadColumnas =6;
//se indica la expresión regular a usar en este caso para el header, se debe hacer en el orden que se esperan las columnas, si no se desea aplicar regex para una columna se debe dejar en blanco ""
target.ValidarHeader.sRegexColumnas = new string[] { "^[jJ]\\d{9}\\b\\b", "\\b\\d{20}\\b", " ","","",""};
//Se especifica las expresiones regulares para el detalle del archivo
target.ValidarContenido.sRegexColumnas = new string[] { "", "", "", "^(?!0174)(?!0428)\\d+", "" };
//Puede indicar la ruta o pasar un array de Bytes
DTOresultado expected = target.ValidateContent(FilePath, ValidateContentFile.ValidationType.OnlyText);

Pueden bajarlo en http://filevalidator.codeplex.com/

Por construir:
1- Documentación
2- Enriquecer la cantidad de información de respuesta del componente
3- Permitir que el componente valide todo el archivo antes de parar la revisión
4- Incluir las validaciones de imagen, PDF y otras

lunes, 10 de mayo de 2010

Validaciones: RIF en Venezuela

Para Validar RIF , código c#


public bool validarRif(string sRif)
        {
            bool bResultado = false;
            int iFactor = 0;

            sRif = sRif.Replace("-", "");
            if (sRif.Length < 10)
                sRif = sRif.ToUpper().Substring(0, 1) + sRif.Substring(1, sRif.Length - 1).PadLeft(9, '0');

             string sPrimerCaracter = sRif.Substring(0, 1).ToUpper();

            switch (sPrimerCaracter)
            {
                case "V": iFactor = 1; break;
                case "E": iFactor = 2; break;
                case "J": iFactor = 3; break;
                case "P": iFactor = 4; break;
                case "G": iFactor = 5; break;
            }
            if (iFactor > 0)
            {
                int suma = ((int.Parse(sRif.Substring(8, 1))) * 2)
                         + ((int.Parse(sRif.Substring(7, 1))) * 3)
                         + ((int.Parse(sRif.Substring(6, 1))) * 4)
                         + ((int.Parse(sRif.Substring(5, 1))) * 5)
                         + ((int.Parse(sRif.Substring(4, 1))) * 6)
                         + ((int.Parse(sRif.Substring(3, 1))) * 7)
                         + ((int.Parse(sRif.Substring(2, 1))) * 2)
                         + ((int.Parse(sRif.Substring(1, 1))) * 3)
                         + (iFactor * 4);

                float dividendo = suma / 11;
                int DividendoEntero = (int)dividendo;
                int resto = 11 - (suma - DividendoEntero * 11);
                if (resto >= 10 || resto < 1)
                    resto = 0;
                if (sRif.Substring(9, 1).Equals(resto.ToString()))
                {
                    bResultado = true;
                }

            }
          
            return bResultado;

        }

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