| Current Path : /home/deltalab/PMS/partner-manager-backend/services/ |
| Current File : //home/deltalab/PMS/partner-manager-backend/services/pdf.js |
require('dotenv').config();
const PdfPrinter = require('pdfmake');
/**
* Low level function used to prepare the pdf document to be generated
* @param {*} order
* @param {*} parcels
* @returns docDefinition
*/
function generatePickingDocDefinition(order, parcels, labelUrls) {
// Preparing tables
const itemHeaders = [{ text: 'SKU', style: 'tableHeader' }, { text: 'Prodotto', style: 'tableHeader' }, { text: 'Quantità', style: 'tableHeader' }];
const itemRows = [];
const parcelHeaders = [
{ text: '#', style: 'tableHeader' },
{ text: 'Dimensioni', style: 'tableHeader' },
{ text: 'Peso', style: 'tableHeader' },
];
const parcelRows = [];
const labelHeaders = [{ text: 'Nome collo', style: 'tableHeader' }, { text: 'Link Etichetta', style: 'tableHeader' }];
const labelRows = [];
for (let url = 0; url < labelUrls.length; url++) {
labelRows.push([labelUrls[url].substring(labelUrls[url].lastIndexOf('/') + 1), {
text: 'scarica qui', link: labelUrls[url], decoration: 'underline', color: 'blue',
}]);
}
// Fill the table rows
for (const item of order.items) {
itemRows.push([item.sku, item.name, item.quantity]);
}
let i = 0;
for (const parcel of parcels) {
const parcelSizeStr = `${parcel.length}x${parcel.width}x${parcel.height}`;
parcelRows.push([++i, parcelSizeStr, `${parcel.weight}g`]);
}
// and you pass the doc-definition-object to createPdfKitDocument method
const docDefinition = {
content: [
{ text: `Ordine n. ${order.name}`, style: 'header' },
'\n',
{ text: 'Venditore', style: 'header' },
`Nome ${order.partner.companyName}\n`,
`P.IVA ${order.partner.vatNumber}\n`,
'\n',
{ text: 'Cliente', style: 'header' },
`${order.customer.displayName}\n`
+ '\n',
{ text: 'Destinatario', style: 'header' },
`${order.shippingAddress.name}\n${order.shippingAddress.companyName ? `${order.shippingAddress.companyName}\n` : ''
}${order.shippingAddress.address1}\n${order.shippingAddress.address2 ? `${order.shippingAddress.address2}\n` : ''
}${order.shippingAddress.city}\n${order.shippingAddress.province}\n${order.shippingAddress.zip}\n${order.shippingAddress.country}`,
order.shippingAddress.phone,
'\n\n',
{ text: 'Dettagli ordine', style: 'header' },
{ text: `Prodotti: ${order.items.length}`, style: 'header' },
{
table: {
headerRows: 1,
// dontBreakRows: true,
// keepWithHeaderRows: 1,
body: [
itemHeaders,
...itemRows,
],
},
},
'\n\n',
{ text: `Colli: ${parcels.length}`, style: 'header' },
{
table: {
headerRows: 1,
// dontBreakRows: true,
// keepWithHeaderRows: 1,
body: [
parcelHeaders,
...parcelRows,
],
},
},
'\n\n',
// {
// text: [
// 'Etichetta spedizione: ',
// {
// text: 'scarica qui', link: labelUrl, decoration: 'underline', color: 'blue',
// },
// ],
// },
{ text: `Etichette: ${labelUrls.length}`, style: 'header' },
{
table: {
headerRows: 1,
// dontBreakRows: true,
// keepWithHeaderRows: 1,
body: [
labelHeaders,
...labelRows,
],
},
},
'\n\n',
// footer
'- INDACO -',
],
styles: {
header: {
fontSize: 18,
bold: true,
margin: [0, 0, 0, 10],
},
subheader: {
fontSize: 16,
bold: true,
margin: [0, 10, 0, 5],
},
tableExample: {
margin: [0, 5, 0, 15],
},
tableHeader: {
bold: true,
fontSize: 13,
color: 'black',
},
},
defaultStyle: {
font: 'Times', // needed, it looks for Roboto otherwise
},
};
console.log(JSON.stringify(docDefinition));
return docDefinition;
}
/**
* Generate and finalize the pdf for the given order and estimated parcels
* @param {*} order
* @param {*} parcels
* @param {boolean} end whether or not to close the pdf stream, by default true
* @returns pdfDoc
*/
function generatePickingListPdf(order, parcels, labelUrls, end = true) {
const fonts = {
Courier: {
normal: 'Courier',
bold: 'Courier-Bold',
italics: 'Courier-Oblique',
bolditalics: 'Courier-BoldOblique',
},
Times: {
normal: 'Times-Roman',
bold: 'Times-Bold',
italics: 'Times-Italic',
bolditalics: 'Times-BoldItalic',
},
Symbol: {
normal: 'Symbol',
},
ZapfDingbats: {
normal: 'ZapfDingbats',
},
};
// then you create a PdfPrinter object
const printer = new PdfPrinter(fonts);
const pdfDoc = printer.createPdfKitDocument(generatePickingDocDefinition(order, parcels, labelUrls));
if (end) pdfDoc.end();
return pdfDoc;
}
module.exports = {
generatePickingListPdf,
};