esr-code-line
Version:
A code line generator for orange payment slips used in Switzerland
59 lines (58 loc) • 2.14 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.codeLine = exports.toSubscriberNumber = exports.pad = exports.attachCheckDigit = exports.checkDigit = void 0;
var CHECK_DIGIT_TABLE = [0, 9, 4, 6, 8, 2, 7, 1, 3, 5];
var AUXILIARY_CHARACTER_1 = ">";
var AUXILIARY_CHARACTER_2 = "+";
var AUXILIARY_CHARACTER_3 = ">";
/*
Modulo 10, recursive
@see http://www.hosang.ch/modulo10.aspx
*/
function checkDigit(code) {
var numbers = code.split("");
var carry = 0;
for (var i = 0, j = 0; i < numbers.length; i++) {
j = parseInt(carry, 10) + parseInt(numbers[i], 10);
carry = CHECK_DIGIT_TABLE[j % 10];
}
return (10 - carry) % 10;
}
exports.checkDigit = checkDigit;
var attachCheckDigit = function (code) {
return code + checkDigit(code).toString();
};
exports.attachCheckDigit = attachCheckDigit;
function pad(s, n) {
var zeros = "";
for (var i = 0; i < n - s.length; i++)
zeros += "0";
return zeros + s;
}
exports.pad = pad;
function toSubscriberNumber(customerNumber) {
var split = customerNumber.split("-");
if (split.length !== 3) {
throw new TypeError("The customer number needs to be in the format VV-XXX-C");
}
var isrCode = split[0], serialNumber = split[1], checkDigit = split[2];
return isrCode + pad(serialNumber, 6) + checkDigit;
}
exports.toSubscriberNumber = toSubscriberNumber;
function codeLine(req) {
var paddedAmountFrancsOrEuros = pad(req.amountFrancsOrEuros.toString(), 8);
var checkDigit1 = checkDigit(req.slipType + paddedAmountFrancsOrEuros + req.amountRappenOrCents);
var referenceNumberNoSpaces = req.referenceNumber.replace(/\s/g, "");
var subscriberNumber = toSubscriberNumber(req.customerNumber);
return (req.slipType +
paddedAmountFrancsOrEuros +
req.amountRappenOrCents +
checkDigit1 +
AUXILIARY_CHARACTER_1 +
referenceNumberNoSpaces +
AUXILIARY_CHARACTER_2 +
" " +
subscriberNumber +
AUXILIARY_CHARACTER_3);
}
exports.codeLine = codeLine;
;