Your IP : 216.73.216.43


Current Path : /proc/thread-self/root/home/deltalab/PMS/partner-manager-backend/services/
Upload File :
Current File : //proc/thread-self/root/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,
};