UNPKG

esr-code-line

Version:

A code line generator for orange payment slips used in Switzerland

59 lines (58 loc) 2.14 kB
"use strict"; 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;