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

156 lines
4.0 KiB
JavaScript

import { cleanData } from "./cleaner.js";
import { qrcodegen } from "./qr-code-generator.js";
import { validateData } from "./validator.js";
import { getReferenceType, mm2pt } from "./utils.js";
function generateQRData(data) {
var _a, _b, _c, _d, _e, _f;
const cleanedData = cleanData(data);
validateData(cleanedData);
const amount = (_a = cleanedData.amount) == null ? void 0 : _a.toFixed(2);
const reference = getReferenceType(cleanedData.reference);
const qrData = [
"SPC",
// Swiss Payments Code
"0200",
// Version
"1",
// Coding Type UTF-8
(_b = cleanedData.creditor.account) != null ? _b : "",
// IBAN
"S",
// Address Type
cleanedData.creditor.name,
// Name
cleanedData.creditor.address,
// Address
cleanedData.creditor.buildingNumber ? `${cleanedData.creditor.buildingNumber}` : "",
`${cleanedData.creditor.zip}`,
// Zip
cleanedData.creditor.city,
// City
cleanedData.creditor.country,
// Country
"",
// 1x Empty
"",
// 2x Empty
"",
// 3x Empty
"",
// 4x Empty
"",
// 5x Empty
"",
// 6x Empty
"",
// 7x Empty
amount != null ? amount : "",
// Amount
cleanedData.currency,
// Currency
...cleanedData.debtor ? [
"S",
// Address Type
cleanedData.debtor.name,
// Name
cleanedData.debtor.address,
// Address
cleanedData.debtor.buildingNumber ? `${cleanedData.debtor.buildingNumber}` : "",
`${cleanedData.debtor.zip}`,
// Zip
cleanedData.debtor.city,
// City
(_c = cleanedData.debtor.country) != null ? _c : ""
// Country
] : [
"",
// Empty address type
"",
// Empty name
"",
// Empty address
"",
// Empty building number
"",
// Empty zip field
"",
// Empty city field
""
// Empty country
],
reference,
// Reference type
(_d = cleanedData.reference) != null ? _d : "",
// Reference
(_e = cleanedData.message) != null ? _e : "",
// Unstructured message
"EPD",
// End of payment data
(_f = cleanedData.additionalInformation) != null ? _f : "",
// Additional information
...cleanedData.av1 ? [
cleanedData.av1
] : [],
...cleanedData.av2 ? [
cleanedData.av2
] : []
];
return qrData.join("\n");
}
function renderQRCode(data, size, renderBlockFunction) {
const qrData = generateQRData(data);
const eci = qrcodegen.QrSegment.makeEci(26);
const segments = qrcodegen.QrSegment.makeSegments(qrData);
const qrCode = qrcodegen.QrCode.encodeSegments([eci, ...segments], qrcodegen.QrCode.Ecc.MEDIUM, 10, 25);
const blockSize = size / qrCode.size;
for (let x = 0; x < qrCode.size; x++) {
const xPos = x * blockSize;
for (let y = 0; y < qrCode.size; y++) {
const yPos = y * blockSize;
if (qrCode.getModule(x, y)) {
renderBlockFunction(xPos, yPos, blockSize);
}
}
}
}
function renderSwissCross(size, renderRectFunction) {
const scale = size / mm2pt(46);
const swissCrossWhiteBackgroundSize = mm2pt(7) * scale;
const swissCrossBlackBackgroundSize = mm2pt(6) * scale;
const swissCrossThickness = mm2pt(1.17) * scale;
const swissCrossLength = mm2pt(3.89) * scale;
renderRectFunction(
size / 2 - swissCrossWhiteBackgroundSize / 2,
size / 2 - swissCrossWhiteBackgroundSize / 2,
swissCrossWhiteBackgroundSize,
swissCrossWhiteBackgroundSize,
"white"
);
renderRectFunction(
size / 2 - swissCrossBlackBackgroundSize / 2,
size / 2 - swissCrossBlackBackgroundSize / 2,
swissCrossBlackBackgroundSize,
swissCrossBlackBackgroundSize,
"black"
);
renderRectFunction(
size / 2 - swissCrossLength / 2,
size / 2 - swissCrossThickness / 2,
swissCrossLength,
swissCrossThickness,
"white"
);
renderRectFunction(
size / 2 - swissCrossThickness / 2,
size / 2 - swissCrossLength / 2,
swissCrossThickness,
swissCrossLength,
"white"
);
}
export {
generateQRData,
renderQRCode,
renderSwissCross
};