using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using Microsoft.SqlServer.Server;
using Neo.Afx.ComponentModel;
namespace Neo.Afx.Validation
{
///
/// The formatter.
///
public class RsaIdValidation
{
///
/// Does check digit validation on an RSA id number
///
/// The ID number.
/// True/False
[SqlFunction(
IsDeterministic = true,
IsPrecise = true,
DataAccess = DataAccessKind.Read,
SystemDataAccess = SystemDataAccessKind.Read
)]
public static SqlBoolean IsValidRsaIdNumber(SqlString idNumber)
{
var isValid = false;
var idNumberToCheck = idNumber.Value;
if (string.IsNullOrEmpty(idNumberToCheck) || idNumberToCheck.Length != 13)
{
return new SqlBoolean(isValid);
}
#region Check for 13 digits
int i;
for (i = 0; i < 13; i++)
if (idNumberToCheck[i] < '0' || idNumberToCheck[i] > '9')
{
return new SqlBoolean(isValid);
}
#endregion
#region Check digit validation
var digits = idNumberToCheck.ToCharArray();
var checkDigit = Convert.ToInt32(digits[digits.Length - 1].ToString());
var sumA = 0;
var sumB = "";
var sumC = 0;
for (var counter = 0; counter < digits.Length - 1; counter++)
{
if ((counter + 1) % 2 != 0)
{
sumA += Convert.ToInt32(digits[counter].ToString());
}
else
{
if (digits[counter] != 0 || sumB != "")
{
sumB = sumB + digits[counter].ToString();
}
}
}
sumC = Convert.ToInt32(sumB) * 2;
var bSplit = sumC.ToString().ToCharArray();
sumC = 0;
for (var counter = 0; counter < bSplit.Length; counter++)
{
sumC += Convert.ToInt32(bSplit[counter].ToString());
}
sumC += sumA;
var lastDigit = 10 - Convert.ToInt32(sumC.ToString().Substring(sumC.ToString().Length - 1));
if (lastDigit.ToString().Length == 2)
{
if (Convert.ToInt32(lastDigit.ToString().Substring(1)) != checkDigit)
{
return new SqlBoolean(false);
}
}
else
{
if (Convert.ToInt32(lastDigit) != checkDigit)
{
return new SqlBoolean(false);
}
}
#endregion
return new SqlBoolean(true);
}
}
}