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;
}
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)
Los números de cuenta bancaria en Venezuela llevan un par de dígitos de control para evitar posibles problemas de transcripción. La forma de validarlos es muy sencilla.
En primer lugar, debemos darnos cuenta de que un número de cuenta completo está formado por varias partes:
En total, 20 dígitos.
.
El primero de los dígitos de control se calcula a partir de los cuatro dígitos de la entidad más los cuatro dígitos de la sucursal.
El segundo dígito de control se calcula a partir de los diez dígitos de la cuenta.
El algoritmo es de tipo checksum, en el que se multiplica cada dígito de la cuenta empezando por el de más a la derecha por un peso específico que se obtiene de la siguiente tabla según su posición. Estas multiplicaciones se suman y si el resultado es s, se el dígito de control se calcula de la siguiente manera:
En primer lugar, debemos darnos cuenta de que un número de cuenta completo está formado por varias partes:
- 4 dígitos que identifican a la entidad bancaria
- 4 dígitos que identifican a la sucursal
- 2 dígitos de control
- 10 dígitos que son el número de cuenta dentro de la sucursal
En total, 20 dígitos.
.
El primero de los dígitos de control se calcula a partir de los cuatro dígitos de la entidad más los cuatro dígitos de la sucursal.
El segundo dígito de control se calcula a partir de los diez dígitos de la cuenta.
El algoritmo es de tipo checksum, en el que se multiplica cada dígito de la cuenta empezando por el de más a la derecha por un peso específico que se obtiene de la siguiente tabla según su posición. Estas multiplicaciones se suman y si el resultado es s, se el dígito de control se calcula de la siguiente manera:
- dc=(11-(s mod 11))
- si (dc==11) entonces dc=0
- si dc (dc==10) entonces dc=1
A continuación muestro como implementar la validación módulo 11 en .NET y SQL Server
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
Suscribirse a:
Entradas (Atom)