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); } } }