medusajs-documents-plugin 1.1.40 → 1.1.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/api/admin/documents/settings/route.js +5 -1
- package/.medusa/server/src/api/admin/documents/templates/preview/route.js +3 -2
- package/.medusa/server/src/api/documents/templates/preview/route.js +3 -2
- package/.medusa/server/src/modules/documents/service.js +95 -51
- package/.medusa/server/src/services/pdf-post-processor.js +78 -24
- package/.medusa/server/src/services/pdfkit-generator.js +420 -405
- package/.medusa/server/src/services/zoho-books.js +79 -1
- package/.medusa/server/src/utils/phone-sanitizer.js +31 -0
- package/CHANGELOG.md +17 -0
- package/package.json +1 -1
|
@@ -7,13 +7,12 @@ exports.postProcessPdf = postProcessPdf;
|
|
|
7
7
|
const pdf_lib_1 = require("pdf-lib");
|
|
8
8
|
const qrcode_1 = __importDefault(require("qrcode"));
|
|
9
9
|
/**
|
|
10
|
-
* Post-processes PDF buffers to embed QR codes and clean up
|
|
11
|
-
* (Note: Watermarks removed per user instruction)
|
|
10
|
+
* Post-processes PDF buffers to embed QR codes, payment links, and clean up Zoho footers.
|
|
12
11
|
*/
|
|
13
12
|
async function postProcessPdf(pdfBuffer, options = {}) {
|
|
14
13
|
try {
|
|
15
14
|
const pdfDoc = await pdf_lib_1.PDFDocument.load(pdfBuffer, { ignoreEncryption: true });
|
|
16
|
-
// 1. Generate
|
|
15
|
+
// 1. Generate QR Code image if URL is provided
|
|
17
16
|
let qrImage = null;
|
|
18
17
|
if (options.qrUrl) {
|
|
19
18
|
try {
|
|
@@ -21,7 +20,7 @@ async function postProcessPdf(pdfBuffer, options = {}) {
|
|
|
21
20
|
errorCorrectionLevel: "H",
|
|
22
21
|
type: "png",
|
|
23
22
|
margin: 1,
|
|
24
|
-
width:
|
|
23
|
+
width: 80,
|
|
25
24
|
});
|
|
26
25
|
qrImage = await pdfDoc.embedPng(qrBufferLib);
|
|
27
26
|
}
|
|
@@ -30,26 +29,81 @@ async function postProcessPdf(pdfBuffer, options = {}) {
|
|
|
30
29
|
}
|
|
31
30
|
}
|
|
32
31
|
const pages = pdfDoc.getPages();
|
|
33
|
-
if (pages.length > 0
|
|
34
|
-
const
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
// 2. Obscure external footer (e.g. "Powered by Zoho Books") if requested
|
|
44
|
-
if (options.obscureZohoFooter) {
|
|
45
|
-
for (const page of pages) {
|
|
46
|
-
page.drawRectangle({
|
|
47
|
-
x: 0,
|
|
48
|
-
y: 0,
|
|
49
|
-
width: page.getWidth(),
|
|
50
|
-
height: 35,
|
|
51
|
-
color: (0, pdf_lib_1.rgb)(1, 1, 1),
|
|
32
|
+
if (pages.length > 0) {
|
|
33
|
+
const lastPage = pages[pages.length - 1];
|
|
34
|
+
// 1. Stamp QR Code on bottom right (above the divider line at 51 on the bottom right: y = 56, x = 502)
|
|
35
|
+
if (qrImage) {
|
|
36
|
+
lastPage.drawImage(qrImage, {
|
|
37
|
+
x: 502,
|
|
38
|
+
y: 56,
|
|
39
|
+
width: 46,
|
|
40
|
+
height: 46,
|
|
52
41
|
});
|
|
42
|
+
// Label under QR code
|
|
43
|
+
try {
|
|
44
|
+
const fontBold = await pdfDoc.embedFont(pdf_lib_1.StandardFonts.HelveticaBold);
|
|
45
|
+
const isInv = options.isInvoice ?? (Boolean(options.paymentLink) || options.docType === "invoice");
|
|
46
|
+
const qrLabel = isInv ? "Scan to Pay Online" : options.docType === "receipt" ? "Scan to Verify" : "Scan to View";
|
|
47
|
+
lastPage.drawText(qrLabel, {
|
|
48
|
+
x: 488,
|
|
49
|
+
y: 47,
|
|
50
|
+
size: 5.5,
|
|
51
|
+
font: fontBold,
|
|
52
|
+
color: (0, pdf_lib_1.rgb)(0.3, 0.35, 0.4),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (_) { }
|
|
56
|
+
}
|
|
57
|
+
// 2. For invoices, stamp payment link block to the left of QR code (x = 340..495)
|
|
58
|
+
// without overlapping customer notes on the left (x < 320) or totals above (y > 170)
|
|
59
|
+
const isInvoice = options.isInvoice ?? (Boolean(options.paymentLink) || options.docType === "invoice");
|
|
60
|
+
if (isInvoice && options.paymentLink) {
|
|
61
|
+
try {
|
|
62
|
+
const fontBold = await pdfDoc.embedFont(pdf_lib_1.StandardFonts.HelveticaBold);
|
|
63
|
+
const fontRegular = await pdfDoc.embedFont(pdf_lib_1.StandardFonts.Helvetica);
|
|
64
|
+
const pLink = String(options.paymentLink).trim();
|
|
65
|
+
lastPage.drawText("Pay Online:", {
|
|
66
|
+
x: 340,
|
|
67
|
+
y: 92,
|
|
68
|
+
size: 7.5,
|
|
69
|
+
font: fontBold,
|
|
70
|
+
color: (0, pdf_lib_1.rgb)(0.12, 0.16, 0.22),
|
|
71
|
+
});
|
|
72
|
+
// Truncate or fit link within x = 340..495 (max width 155pt)
|
|
73
|
+
let displayLink = pLink;
|
|
74
|
+
if (pLink.length > 36) {
|
|
75
|
+
displayLink = pLink.slice(0, 34) + "…";
|
|
76
|
+
}
|
|
77
|
+
lastPage.drawText(displayLink, {
|
|
78
|
+
x: 340,
|
|
79
|
+
y: 81,
|
|
80
|
+
size: 6.8,
|
|
81
|
+
font: fontRegular,
|
|
82
|
+
color: (0, pdf_lib_1.rgb)(0.15, 0.39, 0.92),
|
|
83
|
+
});
|
|
84
|
+
lastPage.drawText("Scan QR code to pay instantly", {
|
|
85
|
+
x: 340,
|
|
86
|
+
y: 70,
|
|
87
|
+
size: 6.2,
|
|
88
|
+
font: fontRegular,
|
|
89
|
+
color: (0, pdf_lib_1.rgb)(0.4, 0.45, 0.5),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (stampErr) {
|
|
93
|
+
console.error("[postProcessPdf] Error stamping payment link:", stampErr);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// 3. Obscure only the Zoho footer badge on the bottom left (x: 35, y: 12, width: 220, height: 36)
|
|
97
|
+
if (options.obscureZohoFooter) {
|
|
98
|
+
for (const page of pages) {
|
|
99
|
+
page.drawRectangle({
|
|
100
|
+
x: 35,
|
|
101
|
+
y: 12,
|
|
102
|
+
width: 220,
|
|
103
|
+
height: 36,
|
|
104
|
+
color: (0, pdf_lib_1.rgb)(1, 1, 1),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
53
107
|
}
|
|
54
108
|
}
|
|
55
109
|
const modifiedPdfBytes = await pdfDoc.save();
|
|
@@ -61,4 +115,4 @@ async function postProcessPdf(pdfBuffer, options = {}) {
|
|
|
61
115
|
}
|
|
62
116
|
}
|
|
63
117
|
exports.default = postProcessPdf;
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXBvc3QtcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3BkZi1wb3N0LXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWNBLHdDQWlIQztBQS9IRCxxQ0FBdUU7QUFDdkUsb0RBQTRCO0FBVTVCOztHQUVHO0FBQ0ksS0FBSyxVQUFVLGNBQWMsQ0FDbEMsU0FBaUIsRUFDakIsVUFBOEIsRUFBRTtJQUVoQyxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLHFCQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFM0UsK0NBQStDO1FBQy9DLElBQUksT0FBTyxHQUFRLElBQUksQ0FBQztRQUN4QixJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxnQkFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO29CQUN2RCxvQkFBb0IsRUFBRSxHQUFHO29CQUN6QixJQUFJLEVBQUUsS0FBSztvQkFDWCxNQUFNLEVBQUUsQ0FBQztvQkFDVCxLQUFLLEVBQUUsRUFBRTtpQkFDVixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLFFBQVEsR0FB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
|