From 493fbcc5c0d1a938a29be5d1c3ec4742fb6e73db Mon Sep 17 00:00:00 2001 From: Alaguraj0361 Date: Fri, 5 Jun 2026 17:27:27 +0530 Subject: [PATCH] add shipping label generation and email functionality --- mailer.js | 74 ++++++++--- send-label-test.js | 80 ++++++++++++ server.js | 13 +- shipping-label-test.pdf | Bin 0 -> 57604 bytes shippingLabelGenerator.js | 249 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 395 insertions(+), 21 deletions(-) create mode 100644 send-label-test.js create mode 100644 shipping-label-test.pdf create mode 100644 shippingLabelGenerator.js diff --git a/mailer.js b/mailer.js index 9a7ae55..0bff353 100644 --- a/mailer.js +++ b/mailer.js @@ -7,9 +7,10 @@ const path = require('path'); * Sends a premium custom email with the PDF attachment. * @param {string} toEmail - The recipient's email address * @param {Object} orderData - The Shopify order payload - * @param {Buffer} pdfBuffer - The PDF data buffer + * @param {Buffer} pdfBuffer - The invoice PDF data buffer + * @param {Buffer} [shippingLabelBuffer] - Optional shipping label PDF buffer */ -const sendEmailWithAttachment = async (toEmail, orderData, pdfBuffer) => { +const sendEmailWithAttachment = async (toEmail, orderData, pdfBuffer, shippingLabelBuffer = null) => { const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST, port: Number(process.env.SMTP_PORT) || 465, @@ -209,8 +210,8 @@ const sendEmailWithAttachment = async (toEmail, orderData, pdfBuffer) => { `; - // Build attachments array - always include PDF, add logo as CID inline if it exists - const attachments = [ + // --- Customer attachments: Invoice PDF only --- + const customerAttachments = [ { filename: `Invoice_${orderNumber}.pdf`, content: pdfBuffer, @@ -219,26 +220,65 @@ const sendEmailWithAttachment = async (toEmail, orderData, pdfBuffer) => { ]; if (logoExists) { - attachments.push({ + customerAttachments.push({ filename: 'logo.png', path: localLogoPath, - cid: 'store_logo' // Referenced in HTML as src="cid:store_logo" + cid: 'store_logo' }); } - const mailOptions = { - from: `"${process.env.SHOP_NAME || 'Your Store'}" <${process.env.SMTP_FROM_EMAIL}>`, - to: toEmail, - subject: `Invoice for your order #${orderNumber}`, - text: `Thank you for your order! Attached is the invoice for order #${orderNumber}.`, - html: htmlTemplate, - attachments - }; + // --- Seller attachments: Invoice PDF + Shipping Label PDF --- + const sellerAttachments = [ + { + filename: `Invoice_${orderNumber}.pdf`, + content: pdfBuffer, + contentType: 'application/pdf' + } + ]; + + if (shippingLabelBuffer) { + sellerAttachments.push({ + filename: `ShippingLabel_${orderNumber}.pdf`, + content: shippingLabelBuffer, + contentType: 'application/pdf' + }); + } + + if (logoExists) { + sellerAttachments.push({ + filename: 'logo.png', + path: localLogoPath, + cid: 'store_logo' + }); + } try { - const info = await transporter.sendMail(mailOptions); - console.log(`Email sent: ${info.messageId}`); - return info; + // 1. Send to customer (Invoice only) + const customerMail = await transporter.sendMail({ + from: `"${process.env.SHOP_NAME || 'Your Store'}" <${process.env.SMTP_FROM_EMAIL}>`, + to: toEmail, + subject: `Invoice for your order #${orderNumber}`, + text: `Thank you for your order! Attached is the invoice for order #${orderNumber}.`, + html: htmlTemplate, + attachments: customerAttachments + }); + console.log(`Customer email sent: ${customerMail.messageId}`); + + // 2. Send to seller (Invoice + Shipping Label) + const sellerEmail = process.env.SELLER_EMAIL; + if (sellerEmail) { + const sellerMail = await transporter.sendMail({ + from: `"${process.env.SHOP_NAME || 'Your Store'}" <${process.env.SMTP_FROM_EMAIL}>`, + to: sellerEmail, + subject: `[NEW ORDER] #${orderNumber} - Invoice & Shipping Label`, + text: `New order #${orderNumber} received. Invoice and Shipping Label attached.`, + html: htmlTemplate, + attachments: sellerAttachments + }); + console.log(`Seller email sent: ${sellerMail.messageId}`); + } + + return customerMail; } catch (error) { console.error('Error sending email:', error); throw error; diff --git a/send-label-test.js b/send-label-test.js new file mode 100644 index 0000000..bf5506f --- /dev/null +++ b/send-label-test.js @@ -0,0 +1,80 @@ +require('dotenv').config({ override: true }); +const nodemailer = require('nodemailer'); +const { generateShippingLabelPDF } = require('./shippingLabelGenerator'); + +async function sendTestShippingLabelEmail() { + try { + console.log('Generating dummy Shipping Label...'); + const dummyOrder = { + name: '#9999', + order_number: 9999, + created_at: new Date().toISOString(), + currency: 'INR', + subtotal_price: '660.00', + total_tax: '0.00', + total_price: '660.00', + gateway: 'Request Quote', + shipping_lines: [{ title: 'Delhivery Courier' }], + billing_address: { + first_name: 'Alagu', last_name: 'Raj', + address1: 'South Street', address2: 'Near Temple', + city: 'Tuticorin', province: 'Tamil Nadu', zip: '628304', + country: 'India', phone: '7871207631' + }, + shipping_address: { + first_name: 'Alagu', last_name: 'Raj', + address1: 'South Street', address2: 'Near Temple', + city: 'Tuticorin', province: 'Tamil Nadu', zip: '628304', + country: 'India', phone: '7871207631' + }, + email: process.env.SMTP_USER, + line_items: [ + { name: 'Flat Bangle 4 Cut - Each Box', quantity: 1, price: '130.00' }, + { name: 'Glue Stick pencil - 1 piece', quantity: 3, price: '35.00' }, + { name: 'E-8000 - 50ML - 1 Piece', quantity: 2, price: '60.00' } + ] + }; + + const shippingLabelBuffer = await generateShippingLabelPDF(dummyOrder); + console.log('Shipping Label PDF generated successfully.'); + const fs = require('fs'); + fs.writeFileSync('shipping-label-test.pdf', shippingLabelBuffer); + console.log('Saved shipping-label-test.pdf to disk.'); + + const transporter = nodemailer.createTransport({ + host: process.env.SMTP_HOST, + port: Number(process.env.SMTP_PORT) || 465, + secure: process.env.SMTP_SECURE === 'true', + auth: { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASS, + }, + tls: { + rejectUnauthorized: false + } + }); + + const targetEmail = process.env.SMTP_USER; + console.log(`Sending email with shipping label attached to ${targetEmail}...`); + + const mailInfo = await transporter.sendMail({ + from: `"${process.env.SHOP_NAME || 'Your Store'}" <${process.env.SMTP_FROM_EMAIL}>`, + to: targetEmail, + subject: `Test Shipping Label - Order #9999`, + text: `Hello, this is a test email with the generated Shipping Label PDF attached.`, + attachments: [ + { + filename: `ShippingLabel_9999.pdf`, + content: shippingLabelBuffer, + contentType: 'application/pdf' + } + ] + }); + + console.log(`Success! Test email sent: ${mailInfo.messageId}`); + } catch (error) { + console.error('Error sending test shipping label email:', error); + } +} + +sendTestShippingLabelEmail(); diff --git a/server.js b/server.js index c7a0012..7646c54 100644 --- a/server.js +++ b/server.js @@ -3,6 +3,7 @@ const express = require('express'); const cors = require('cors'); const crypto = require('crypto'); const { generateInvoicePDF } = require('./pdfGenerator'); +const { generateShippingLabelPDF } = require('./shippingLabelGenerator'); const { sendEmailWithAttachment } = require('./mailer'); const app = express(); @@ -105,10 +106,13 @@ app.post('/webhooks/orders/create', verifyShopifyWebhook, async (req, res) => { })); } - // 1. Generate the PDF invoice - const pdfBuffer = await generateInvoicePDF(orderData); + // 1. Generate the PDF invoice and shipping label in parallel + const [pdfBuffer, shippingLabelBuffer] = await Promise.all([ + generateInvoicePDF(orderData), + generateShippingLabelPDF(orderData) + ]); - // 2. Send the email with the attached PDF + // 2. Send the email with the attached PDFs const customerEmail = orderData.email || orderData.contact_email; if (!customerEmail) { const errorMsg = `[${new Date().toISOString()}] Order ${orderData.order_number} has no email address associated.\n`; @@ -119,7 +123,8 @@ app.post('/webhooks/orders/create', verifyShopifyWebhook, async (req, res) => { await sendEmailWithAttachment( customerEmail, orderData, - pdfBuffer + pdfBuffer, + shippingLabelBuffer ); const successMsg = `[${new Date().toISOString()}] Successfully processed and sent email for Order ${orderData.order_number}\n`; diff --git a/shipping-label-test.pdf b/shipping-label-test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5aa05783dfb48d12ac598a11cde23426fed3e1ca GIT binary patch literal 57604 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 h)&Ea10*Z 0.6; + const lineWidth = isWide ? 2.2 : 0.9; + const spacing = Math.random() > 0.4 ? 1.5 : 2.5; + + if (currentX + lineWidth > endX) break; + + doc.rect(currentX, y, lineWidth, height - 16).fill('#000000'); + currentX += lineWidth + spacing; + } + + // Barcode number text below bars + doc.fontSize(8.5) + .font('Helvetica-Bold') + .fillColor('#000000') + .text(text, x, y + height - 11, { width: width, align: 'center', characterSpacing: 1.5 }); + + doc.restore(); +} + +/** + * Helper to adjust order number using ORDER_NUMBER_OFFSET + */ +const getAdjustedOrderNumber = (orderNumberOrName) => { + if (!orderNumberOrName) return ''; + const offset = parseInt(process.env.ORDER_NUMBER_OFFSET, 10) || 0; + const str = orderNumberOrName.toString(); + const matches = str.match(/\d+/); + if (!matches) return str; + const num = parseInt(matches[0], 10); + return (num + offset).toString(); +}; + +/** + * Generates a professional 4x6 inch shipping label PDF. + * @param {Object} orderData - The Shopify order payload + * @returns {Promise} - A promise that resolves to a Buffer containing the PDF data + */ +const generateShippingLabelPDF = async (orderData) => { + return new Promise(async (resolve, reject) => { + try { + // 4x6 inch = 288 x 432 points (1 inch = 72 points) + const doc = new PDFDocument({ + margin: 0, + size: [288, 432] + }); + + let buffers = []; + doc.on('data', buffers.push.bind(buffers)); + doc.on('end', () => resolve(Buffer.concat(buffers))); + + const W = 288; + const H = 432; + const PAD = 16; + + // --- BACKGROUND --- + doc.rect(0, 0, W, H).fill('#ffffff'); + + // --- OUTER BORDER --- + doc.rect(6, 6, W - 12, H - 12) + .lineWidth(2) + .strokeColor('#1e293b') + .stroke(); + + // ============================================================ + // SECTION 1: HEADER STRIP + // ============================================================ + const headerY = 6; + const headerH = 58; + doc.rect(6, headerY, W - 12, headerH).fill('#1e293b'); + + // Load local logo if it exists + const localLogoPath = path.join(__dirname, 'logo.png'); + let logoLoaded = false; + if (fs.existsSync(localLogoPath)) { + try { + doc.image(localLogoPath, PAD, headerY + 9, { height: 40 }); + logoLoaded = true; + } catch (e) { /* silent fail */ } + } + + // Shop name text + doc.fontSize(12.5) + .font('Helvetica-Bold') + .fillColor('#ffffff') + .text('RAY AARI SHOP', logoLoaded ? 95 : PAD, headerY + 13, { width: W - (logoLoaded ? 111 : PAD * 2) }); + + doc.fontSize(7.5) + .font('Helvetica') + .fillColor('#cbd5e1') + .text('Sivanatham Salai, Arappalayam Cross Rd,', logoLoaded ? 95 : PAD, headerY + 28, { width: W - (logoLoaded ? 111 : PAD * 2) }) + .text('Madurai 625016, Tamil Nadu, India | Ph: 9994333548', logoLoaded ? 95 : PAD, headerY + 38, { width: W - (logoLoaded ? 111 : PAD * 2) }); + + // ============================================================ + // SECTION 2: ORDER INFO STRIP + // ============================================================ + const orderStripY = headerY + headerH; + const orderStripH = 30; + doc.rect(6, orderStripY, W - 12, orderStripH).fill('#f1f5f9'); + + const orderNumber = getAdjustedOrderNumber(orderData.order_number || orderData.name); + const orderDate = new Date(orderData.created_at || Date.now()).toLocaleDateString('en-GB'); + const shippingMethod = orderData.shipping_lines?.[0]?.title || 'Standard Courier'; + + // Order Number + doc.fontSize(9.5) + .font('Helvetica-Bold') + .fillColor('#0f172a') + .text(`ORDER: #${orderNumber}`, PAD, orderStripY + 10); + + // Date | Courier Method + doc.fontSize(8) + .font('Helvetica-Bold') + .fillColor('#475569') + .text(`${orderDate} | ${shippingMethod}`, PAD, orderStripY + 11, { width: W - PAD * 2, align: 'right' }); + + // ============================================================ + // SECTION 3: SHIP TO SECTION HEADER + // ============================================================ + const shipToLabelY = orderStripY + orderStripH; + const shipToLabelH = 18; + doc.rect(6, shipToLabelY, W - 12, shipToLabelH).fill('#0f172a'); + + doc.fontSize(8.5) + .font('Helvetica-Bold') + .fillColor('#ffffff') + .text('SHIP TO', PAD, shipToLabelY + 5, { width: W - PAD * 2, align: 'center' }); + + // ============================================================ + // SECTION 4: CUSTOMER ADDRESS + // ============================================================ + const addressStartY = shipToLabelY + shipToLabelH + 12; + const shipping = orderData.shipping_address || orderData.billing_address || {}; + + const toName = `${shipping.first_name || ''} ${shipping.last_name || ''}`.trim() || 'Customer'; + const toPhone = shipping.phone || orderData.phone || orderData.billing_address?.phone || ''; + const toAddr1 = shipping.address1 || ''; + const toAddr2 = shipping.address2 || ''; + const toCity = shipping.city || ''; + const toProvince = shipping.province || ''; + const toZip = shipping.zip || ''; + const toCountry = shipping.country || 'India'; + + doc.fontSize(14) + .font('Helvetica-Bold') + .fillColor('#0f172a') + .text(toName, PAD, addressStartY, { width: W - PAD * 2 }); + + let currentY = addressStartY + 18; + + if (toPhone) { + doc.fontSize(9.5) + .font('Helvetica-Bold') + .fillColor('#0f172a') + .text(`Phone: ${toPhone}`, PAD, currentY, { width: W - PAD * 2 }); + currentY += 14; + } + + const addressParts = []; + if (toAddr1) addressParts.push(toAddr1); + if (toAddr2) addressParts.push(toAddr2); + + if (toCity || toProvince || toZip) { + const parts = []; + if (toCity) parts.push(toCity); + if (toProvince) parts.push(toProvince); + const cityState = parts.join(', '); + addressParts.push(cityState + (toZip ? ' - ' + toZip : '')); + } + addressParts.push(toCountry); + + const addressText = addressParts.join('\n'); + + doc.fontSize(9.5) + .font('Helvetica') + .fillColor('#334155') + .text(addressText, PAD, currentY, { width: W - PAD * 2, lineGap: 3.5 }); + + const addressHeight = doc.heightOfString(addressText, { width: W - PAD * 2, lineGap: 3.5 }); + currentY += addressHeight + 10; + + const minSeparatorY = 250; + const sepY = Math.max(currentY, minSeparatorY); + + // ============================================================ + // SECTION 5: HORIZONTAL SEPARATOR + // ============================================================ + doc.moveTo(PAD, sepY) + .lineTo(W - PAD, sepY) + .lineWidth(1) + .strokeColor('#cbd5e1') + .stroke(); + + // ============================================================ + // SECTION 6: FROM ADDRESS (Return address) + // ============================================================ + const fromY = sepY + 10; + + doc.fontSize(7.5) + .font('Helvetica-Bold') + .fillColor('#64748b') + .text('FROM / SENDER:', PAD, fromY); + + doc.fontSize(9) + .font('Helvetica-Bold') + .fillColor('#1e293b') + .text('Ray Aari Shop', PAD, fromY + 12); + + const shopAddressText = [ + 'Sivanatham Salai, Arappalayam Cross Rd, Near Madura Coats pvt', + 'Madurai 625016, Tamil Nadu, India | Ph: 9994333548' + ].join('\n'); + + doc.fontSize(7.5) + .font('Helvetica') + .fillColor('#475569') + .text(shopAddressText, PAD, fromY + 24, { width: W - PAD * 2, lineGap: 2 }); + + // ============================================================ + // SECTION 7: BARCODE STRIP + // ============================================================ + const barcodeAreaY = H - 75; + doc.rect(6, barcodeAreaY, W - 12, 1).fill('#cbd5e1'); + + const barcodeText = `RA${orderNumber}IN`; + drawBarcode(doc, PAD + 15, barcodeAreaY + 12, W - PAD * 2 - 30, 52, barcodeText); + + doc.end(); + } catch (error) { + reject(error); + } + }); +}; + +module.exports = { generateShippingLabelPDF };