public override void DoValidate(object objectToValidate, object currentTarget, string key, Microsoft.Practices.EnterpriseLibrary.Validation.ValidationResults validationResults) { // празната стойност е допустима - ограничава се с RequiredAttribute if (objectToValidate == null || string.IsNullOrWhiteSpace(objectToValidate.ToString())) { return; } // Личният номер на чужденец (ЛНЧ) се състои от 10 цифри. string pattern = this.GetPattern(); Regex regex = new Regex(pattern, RegexOptions.None); if (!regex.IsMatch(objectToValidate.ToString())) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); return; } // преброяват се водещите нули string pnfWithZeros = objectToValidate.ToString().Trim(); string pnfWithOutZeros = pnfWithZeros.TrimStart('0'); int leadingZerosCount = pnfWithZeros.Length - pnfWithOutZeros.Length; Int64 pnf = Convert.ToInt64(objectToValidate); List <byte> pnfNumbers = pnf.BreakNumber(leadingZerosCount); int checkSum = 0; int modulus = 0; // 1. Изчислява се сумата: 21*а1+19*а2+17*а3+13*а4+11*а5+9*а6+7*а7+3*а8+1*а9, където а1 e първата цифра от ЛНЧ, а2 - втората и т.н. checkSum = 21 * pnfNumbers[0] + 19 * pnfNumbers[1] + 17 * pnfNumbers[2] + 13 * pnfNumbers[3] + 11 * pnfNumbers[4] + 9 * pnfNumbers[5] + 7 * pnfNumbers[6] + 3 * pnfNumbers[7] + 1 * pnfNumbers[8]; // 2. Изчислява се остатъкът по модул 11 от сумата по т.1 // Ако остатъкът е различен от 10, то той се определя като контролно число // Ако остатъкът е десет - за контролно число се определя 0 и се сравнява с десетата цифра – те трябва да са равни modulus = (checkSum % 11) % 10; // контролното число и десетата цифра трябва да са равни. if (modulus != pnfNumbers[9]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); return; } }
public override void DoValidate(object objectToValidate, object currentTarget, string key, Microsoft.Practices.EnterpriseLibrary.Validation.ValidationResults validationResults) { // празната стойност е допустима - ограничава се с RequiredAttribute if (objectToValidate == null || string.IsNullOrWhiteSpace(objectToValidate.ToString())) { return; } string pattern = this.GetPattern(); Regex regex = new Regex(pattern, RegexOptions.None); if (!regex.IsMatch(objectToValidate.ToString())) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); return; } // преброяват се водещите нули string egnWithZeros = objectToValidate.ToString().Trim(); string egnWithOutZeros = egnWithZeros.TrimStart('0'); int leadingZerosCount = egnWithZeros.Length - egnWithOutZeros.Length; Int64 egn = Convert.ToInt64(objectToValidate); List <byte> egnNumbers = egn.BreakNumber(leadingZerosCount); // 1. Проверка на датата: try { // Проверяват се денят, месецът и годината за валидна дата. int year = egnNumbers[0] * 10 + egnNumbers[1]; int month = egnNumbers[2] * 10 + egnNumbers[3]; if (month > 40) { // За родените след 31.12.1999 г. към месеца се прибавя числото 40. month -= 40; year += 2000; } else if (month > 20) { // За родените преди 01.01.1900 г. към месеца се прибавя числото 20. month -= 20; year += 1800; } else { year += 1900; } int day = egnNumbers[4] * 10 + egnNumbers[5]; DateTime date = new DateTime(year, month, day); } catch (Exception) { // невалидна дата base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); return; } int checkSum = 0; int modulus = 0; // 2.1. Изчислява се сумата: 2*а1+4*а2+8*а3+5*а4+10*а5+9*а6+7*а7+3*а8+6*а9, където а1 e първата цифра от ЕГН, а2 - втората и т.н. checkSum = 2 * egnNumbers[0] + 4 * egnNumbers[1] + 8 * egnNumbers[2] + 5 * egnNumbers[3] + 10 * egnNumbers[4] + 9 * egnNumbers[5] + 7 * egnNumbers[6] + 3 * egnNumbers[7] + 6 * egnNumbers[8]; // 2.2. Изчислява се остатъкът по модул 11 от сумата по т. 2.1 // 2.3. Ако остатъкът е различен от 10, то той се определя като контролно число // Ако остатъкът е десет - за контролно число се определя 0 и се сравнява с десетата цифра – те трябва да са равни modulus = (checkSum % 11) % 10; // контролното число и десетата цифра трябва да са равни. if (modulus != egnNumbers[9]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); return; } }
public override void DoValidate(object objectToValidate, object currentTarget, string key, Microsoft.Practices.EnterpriseLibrary.Validation.ValidationResults validationResults) { // празната стойност е допустима - ограничава се с RequiredAttribute if (string.IsNullOrEmpty(objectToValidate as string)) { return; } string pattern = this.GetPattern(); Regex regex = new Regex(pattern, RegexOptions.None); if (!regex.IsMatch(objectToValidate.ToString())) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); return; } // преброяват се водещите нули string bulstatWithZeros = objectToValidate.ToString().Trim(); string bulstatWithOutZeros = bulstatWithZeros.TrimStart('0'); int leadingZerosCount = bulstatWithZeros.Length - bulstatWithOutZeros.Length; Int64 bulstat = Convert.ToInt64(objectToValidate); List <byte> bulstatNumbers = bulstat.BreakNumber(leadingZerosCount); int checkSum = 0; int modulus = 0; switch (bulstatNumbers.Count) { case 9: { #region 9 цифров булстат for (int i = 0; i < 8; i++) { // 1. Изчислява се сумата: 1*а1+2*а2+3*а3+4*а4+5*а5+6*а6+7*а7+8*а8, където а1 e първата цифра от ЕИК, а2 - втората и т.н. checkSum += bulstatNumbers[i] * (i + 1); } // 2. Изчислява се остатъкът по модул 11 от сумата по т. 1 modulus = checkSum % 11; if (modulus != 10) { // 3. Ако остатъкът е различен от 10, то той се определя като контролно число и се сравнява с деветата цифра – те трябва да са равни. if (modulus != bulstatNumbers[8]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); } } else { checkSum = 0; // 4. Ако остатъкът е 10 for (int i = 0; i < 8; i++) { // се изчислява сумата 3*а1+4*а2+5*а3+6*а4+7*а5+8*а6+9*а7+10*а8, където а1 e първата цифра от ЕИК, а2 - втората и т.н checkSum += bulstatNumbers[i] * (i + 3); } // 5. Изчислява се остатъкът по модул 11 от новата сума (по т.4) modulus = checkSum % 11; if (modulus != 10) { // 6. Ако остатъкът е различен от 10, то той се определя като контролно число и се сравнява с деветата цифра – те трябва да са равни if (modulus != bulstatNumbers[8]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); } } else { // 7. Ако остатъкът е десет - за контролно число се определя 0 и се сравнява с деветата цифра – те трябва да са равни. if (0 != bulstatNumbers[8]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); } } } #endregion break; } case 10: { #region 10 цифров булстат // 1. Изчислява се сумата: 2*а1+4*а2+8*а3+5*а4+10*а5+9*а6+7*а7+3*а8 + 6*а9, където а1 e първата цифра от кода, а2 - втората и т.н. checkSum = 2 * bulstatNumbers[0] + 4 * bulstatNumbers[1] + 8 * bulstatNumbers[2] + 5 * bulstatNumbers[3] + 10 * bulstatNumbers[4] + 9 * bulstatNumbers[5] + 7 * bulstatNumbers[6] + 3 * bulstatNumbers[7] + 6 * bulstatNumbers[8]; // 2. Изчислява се остатъкът по модул 11 от сумата по т. 1 modulus = checkSum % 11; // 3. Ако остатъкът е различен от 10, то той се определя като контролно число. Ако остатъкът е десет - за контролно число се определя 0 modulus = modulus % 10; if (modulus == bulstatNumbers[9]) { return; } else { // 4. Ако контролното число по т. 3 не съвпада с 10-тата цифра се изчислява сумата: 21*а1+19*а2+17*а3+13*а4+11*а5+9*а6+7*а7+3*а8 + 1*а9 , където а1 e първата цифра от ЛНЧ, а2 - втората и т.н. checkSum = 21 * bulstatNumbers[0] + 19 * bulstatNumbers[1] + 17 * bulstatNumbers[2] + 13 * bulstatNumbers[3] + 11 * bulstatNumbers[4] + 9 * bulstatNumbers[5] + 7 * bulstatNumbers[6] + 3 * bulstatNumbers[7] + 1 * bulstatNumbers[8]; //5. Изчислява се остатъкът по модул 11 от сумата по т. 5. Ако остатъкът е различен от 10, то той се определя като контролно число. Ако остатъкът е десет - за контролно число се определя 0. modulus = (checkSum % 11) % 10; // 6. Полученото по т.5 контролно число се сравнява с 10-тата цифра от кода. Ако не съвпадат се извежда съобщение за грешка, дефинирана с термин с УРИ R-0136 if (modulus != bulstatNumbers[9]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); } } #endregion break; } case 13: { #region 13 цифров булстат // 1. От първите осем цифри се изчислява контролно число по начина, описан за 9 цифров ЕИК/БУЛСТАТ и се сравнява с деветата цифра. Те трябва да са равни. for (int i = 0; i < 8; i++) { // Изчислява се сумата: 1*а1+2*а2+3*а3+4*а4+5*а5+6*а6+7*а7+8*а8, където а1 e първата цифра от ЕИК, а2 - втората и т.н. checkSum += bulstatNumbers[i] * (i + 1); } // Изчислява се остатъкът по модул 11 от сумата по т. 1 modulus = checkSum % 11; if (modulus != bulstatNumbers[8]) { // Ако остатъкът е различен от 10, то той се определя като контролно число и се сравнява с деветата цифра – те трябва да са равни. base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); } else { // 2. Изчислява се сумата: 2*а9 + 7*а10 + 3*а11 +5*а12 , където а9 e деветата цифра от ЕИК, а10 - десетата и т.н. checkSum = 2 * bulstatNumbers[8] + 7 * bulstatNumbers[9] + 3 * bulstatNumbers[10] + 5 * bulstatNumbers[11]; // 3. Изчислява се остатъкът по модул 11 от сумата по т.2 modulus = checkSum % 11; if (modulus != 10) { // 4. Ако остатъкът е различен от 10, се определя като контролно число и се сравнява с тринадесетата цифра – те трябва да са равни. if (modulus != bulstatNumbers[12]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); } } else { // 5. Ако остатъкът е 10, се изчислява сумата: 4*а9+9*а10+5*а11+7*а12, където а9 e деветата цифра от ЕИК, а10 - десетата и т.н. checkSum = 4 * bulstatNumbers[8] + 9 * bulstatNumbers[9] + 5 * bulstatNumbers[10] + 7 * bulstatNumbers[11]; // 6.Изчислява се остатъкът по модул 11 от новата сума (по т.5) modulus = checkSum % 11; if (modulus != 10) { // 7. Ако остатъкът е различен от 10, то той се определя като контролно число и се сравнява с тринадесетата цифра – те трябва да са равни if (modulus != bulstatNumbers[12]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); } } else { // Ако остатъкът е десет - за контролно число се определя 0 и се сравнява с тринадесетата цифра – те трябва да са равни. if (0 != bulstatNumbers[12]) { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); } } } } #endregion break; } default: { base.LogValidationResult(validationResults, this.GetMessage(objectToValidate, key), currentTarget, key); break; } } }