UNPKG

uin-control-digit-calculator

Version:

Calculates Control Digit for UIN. RU: Модуль расчитывает контрольное значение для УИНа для указания его в платежном поручении.

165 lines (153 loc) 3.21 kB
/** * Created by Lev Zabudko on 08.01.2016. * Module exports. * @public */ module.exports.CalculateControlDigit = CalculateControlDigit; module.exports.Test = Test; /** * Chars weights array for calculations in CalculateControlDigit */ var chars = new Array; //Cyrillic chars['А'] = 1; chars['Б'] = 2; chars['В'] = 3; chars['Г'] = 4; chars['Д'] = 5; chars['Е'] = 6; chars['Ж'] = 7; chars['З'] = 8; chars['И'] = 9; chars['К'] = 10; chars['Л'] = 11; chars['М'] = 12; chars['Н'] = 13; chars['О'] = 14; chars['П'] = 15; chars['Р'] = 16; chars['С'] = 17; chars['Т'] = 18; chars['У'] = 19; chars['Ф'] = 20; chars['Х'] = 21; chars['Ц'] = 22; chars['Ч'] = 23; chars['Ш'] = 24; chars['Щ'] = 25; chars['Э'] = 26; chars['Ю'] = 27; chars['Я'] = 28; chars['Ъ'] = 33; chars['Ы'] = 36; chars['Ь'] = 42; //Latin chars['A'] = 1; chars['B'] = 3; chars['E'] = 6; chars['K'] = 10; chars['M'] = 12; chars['H'] = 13; chars['O'] = 14; chars['P'] = 16; chars['C'] = 17; chars['T'] = 18; chars['Y'] = 19; chars['X'] = 21; chars['D'] = 29; chars['F'] = 30; chars['G'] = 31; chars['I'] = 32; chars['J'] = 33; chars['L'] = 34; chars['N'] = 35; chars['Q'] = 36; chars['R'] = 37; chars['S'] = 38; chars['U'] = 39; chars['V'] = 40; chars['W'] = 41; chars['Z'] = 42; //digits chars['0'] = 0; chars['1'] = 1; chars['2'] = 2; chars['3'] = 3; chars['4'] = 4; chars['5'] = 5; chars['6'] = 6; chars['7'] = 7; chars['8'] = 8; chars['9'] = 9; /** * Calculates UIN Control Digit as a result. * * @param {string} uin * @return {int} calculated control UIN digit * @api public */ function CalculateControlDigit(uin) { result = 0; try { result = main(uin.toUpperCase(), 0); } catch (e) { try { result = main(uin.toUpperCase(), 2); } catch (ex) { result = 0; } } return result; } function Test() { var data = [ { "uin": "041112870559000000000001", "controlSum" : 1, }, { "uin": "041112870559000000000002", "controlSum" : 5 }, { "uin": "041112870559000000000003", "controlSum" : 9 }, { "uin": "041112870559000000000004", "controlSum" : 2 }, { "uin": "041112870559000000000100", "controlSum" : 4 }, { "uin": "041112870559000000000125", "controlSum" : 3 }, { "uin": "041112870559000000000173", "controlSum" : 2 } ] data.forEach(function(element) { console.log('Expect digit: ' + element.controlSum + ' for UIN: ' + element.uin + ", result: " + (CalculateControlDigit(element.uin) == element.controlSum)); }); } /** * @param {string} uin * @return {int} calculated control UIN digit * @param leftShift 0 (for first try) or 2 (for second try) */ function main(uin, leftShift) { var controlSum = 0; for (i = 0; i < uin.length; i++) { controlSum += (chars[uin[i]] % 10) * (((i + leftShift) % 10) + 1); } if ((controlSum % 11) == 10) { throw new ArithmeticException('Арифметическая ошибка'); } return controlSum % 11; }