uin-control-digit-calculator
Version:
Calculates Control Digit for UIN. RU: Модуль расчитывает контрольное значение для УИНа для указания его в платежном поручении.
165 lines (153 loc) • 3.21 kB
JavaScript
/**
* 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;
}