Files
QR-Invoice/node_modules/swissqrbill/lib/esm/shared/utils.js
2026-01-12 13:12:46 +01:00

173 lines
4.8 KiB
JavaScript

function isQRIBAN(iban) {
iban = iban.replace(/ /g, "");
const QRIID = iban.substring(4, 9);
return +QRIID >= 3e4 && +QRIID <= 31999;
}
function isIBANValid(iban) {
iban = iban.replace(/ /g, "").toUpperCase();
iban = iban.substring(4) + iban.substring(0, 4);
return mod97(iban) === 1;
}
function formatIBAN(iban) {
var _a;
const ibanArray = iban.replace(/ /g, "").match(/.{1,4}/g);
return (_a = ibanArray == null ? void 0 : ibanArray.join(" ")) != null ? _a : iban;
}
function isQRReference(reference) {
reference = reference.replace(/ /g, "");
if (reference.length !== 27) {
return false;
}
if (!/^\d+$/.test(reference)) {
return false;
}
return true;
}
function isQRReferenceValid(reference) {
reference = reference.replace(/ /g, "");
if (!isQRReference(reference)) {
return false;
}
const ref = reference.substring(0, 26);
const checksum = reference.substring(26, 27);
const calculatedChecksum = calculateQRReferenceChecksum(ref);
return calculatedChecksum === checksum;
}
function isSCORReference(reference) {
reference = reference.replace(/ /g, "").toUpperCase();
if (!reference.startsWith("RF")) {
return false;
}
if (reference.length < 5 || reference.length > 25) {
return false;
}
if (!/^[\dA-Z]+$/.test(reference)) {
return false;
}
return true;
}
function isSCORReferenceValid(reference) {
reference = reference.replace(/ /g, "");
if (!isSCORReference(reference)) {
return false;
}
const ref = reference.substring(4);
if (Number.isNaN(reference)) {
return false;
}
const checksum = reference.substring(2, 4);
if (Number.isNaN(checksum)) {
return false;
}
const calculatedChecksum = calculateSCORReferenceChecksum(ref);
return calculatedChecksum === checksum;
}
function calculateSCORReferenceChecksum(reference) {
reference = reference.replace(/ /g, "");
const checksum = 98 - mod97(`${reference}RF00`);
return `${checksum}`.padStart(2, "0");
}
function calculateQRReferenceChecksum(reference) {
return mod10(reference);
}
function formatQRReference(reference) {
const trimmedReference = reference.replace(/ /g, "");
const match = trimmedReference.substring(2).match(/.{1,5}/g);
return match ? `${trimmedReference.substring(0, 2)} ${match.join(" ")}` : reference;
}
function formatSCORReference(reference) {
var _a;
const trimmedReference = reference.replace(/ /g, "");
const match = trimmedReference.match(/.{1,4}/g);
return (_a = match == null ? void 0 : match.join(" ")) != null ? _a : reference;
}
function formatReference(reference) {
const referenceType = getReferenceType(reference);
if (referenceType === "QRR") {
return formatQRReference(reference);
} else if (referenceType === "SCOR") {
return formatSCORReference(reference);
}
return reference;
}
function formatAmount(amount) {
const amountString = amount.toFixed(2);
const amountArray = amountString.split(".");
let formattedAmountWithoutDecimals = "";
for (let x = amountArray[0].length - 1, i = 1; x >= 0; x--, i++) {
formattedAmountWithoutDecimals = amountArray[0][x] + formattedAmountWithoutDecimals;
if (i === 3) {
formattedAmountWithoutDecimals = ` ${formattedAmountWithoutDecimals}`;
i = 0;
}
}
return `${formattedAmountWithoutDecimals.trim()}.${amountArray[1]}`;
}
function mm2pt(millimeters) {
return millimeters * 2.83465;
}
function pt2mm(points) {
return points / 2.83465;
}
function mm2px(millimeters) {
return millimeters * 960 / 254;
}
function px2mm(pixels) {
return pixels * 254 / 960;
}
function getReferenceType(reference) {
if (typeof reference === "undefined") {
return "NON";
} else if (isQRReference(reference)) {
return "QRR";
} else {
return "SCOR";
}
}
function mod97(input) {
const charCodeOfLetterA = "A".charCodeAt(0);
const inputArr = input.split("");
for (let i = 0; i < inputArr.length; i++) {
const charCode = inputArr[i].charCodeAt(0);
if (charCode >= charCodeOfLetterA) {
inputArr[i] = `${charCode - charCodeOfLetterA + 10}`;
}
}
input = inputArr.join("");
let remainder = 0;
for (let i = 0; i < input.length; i++) {
const digit = +input[i];
remainder = (10 * remainder + digit) % 97;
}
return remainder;
}
function mod10(input) {
const trimmedInput = input.replace(/ /g, "");
const table = [0, 9, 4, 6, 8, 2, 7, 1, 3, 5];
let carry = 0;
for (let i = 0; i < trimmedInput.length; i++) {
carry = table[(carry + parseInt(trimmedInput.substring(i, i + 1), 10)) % 10];
}
return ((10 - carry) % 10).toString();
}
export {
calculateQRReferenceChecksum,
calculateSCORReferenceChecksum,
formatAmount,
formatIBAN,
formatQRReference,
formatReference,
formatSCORReference,
getReferenceType,
isIBANValid,
isQRIBAN,
isQRReference,
isQRReferenceValid,
isSCORReference,
isSCORReferenceValid,
mm2pt,
mm2px,
pt2mm,
px2mm
};