Esempio n. 1
0
        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;
            }
        }
Esempio n. 3
0
        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;
            }
            }
        }