71 lines
1.6 KiB
JavaScript
71 lines
1.6 KiB
JavaScript
const fs = require("fs");
|
|
const path = require("path");
|
|
const { PDFDocument, StandardFonts, rgb } = require("pdf-lib");
|
|
|
|
exports.createCreditPdf = async ({
|
|
creditId,
|
|
originalInvoice,
|
|
creditAmount,
|
|
patient,
|
|
}) => {
|
|
const pdfDoc = await PDFDocument.create();
|
|
const page = pdfDoc.addPage([595, 842]); // A4
|
|
|
|
const font = await pdfDoc.embedFont(StandardFonts.Helvetica);
|
|
const bold = await pdfDoc.embedFont(StandardFonts.HelveticaBold);
|
|
|
|
let y = 800;
|
|
|
|
const draw = (text, size = 12, boldFont = false) => {
|
|
page.drawText(text, {
|
|
x: 50,
|
|
y,
|
|
size,
|
|
font: boldFont ? bold : font,
|
|
color: rgb(0, 0, 0),
|
|
});
|
|
y -= size + 6;
|
|
};
|
|
|
|
draw("GUTSCHRIFT", 20, true);
|
|
y -= 20;
|
|
|
|
draw(`Gutschrift-Nr.: ${creditId}`, 12, true);
|
|
draw(`Bezieht sich auf Rechnung Nr.: ${originalInvoice.id}`);
|
|
y -= 10;
|
|
|
|
draw(`Patient: ${patient.firstname} ${patient.lastname}`);
|
|
draw(`Rechnungsdatum: ${originalInvoice.invoice_date_formatted}`);
|
|
y -= 20;
|
|
|
|
draw("Gutschriftbetrag:", 12, true);
|
|
draw(`${creditAmount.toFixed(2)} €`, 14, true);
|
|
|
|
// Wasserzeichen
|
|
page.drawText("GUTSCHRIFT", {
|
|
x: 150,
|
|
y: 400,
|
|
size: 80,
|
|
rotate: { type: "degrees", angle: -30 },
|
|
color: rgb(0.8, 0, 0),
|
|
opacity: 0.2,
|
|
});
|
|
|
|
const pdfBytes = await pdfDoc.save();
|
|
|
|
const dir = path.join(
|
|
__dirname,
|
|
"..",
|
|
"public",
|
|
"invoices",
|
|
new Date().getFullYear().toString(),
|
|
);
|
|
|
|
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
|
|
const filePath = `/invoices/${new Date().getFullYear()}/credit-${creditId}.pdf`;
|
|
fs.writeFileSync(path.join(__dirname, "..", "public", filePath), pdfBytes);
|
|
|
|
return filePath;
|
|
};
|