firt commit
This commit is contained in:
commit
c2e63830e1
71 changed files with 9613 additions and 0 deletions
74
server/utils/pdf.js
Normal file
74
server/utils/pdf.js
Normal file
|
@ -0,0 +1,74 @@
|
|||
import PDFDocument from 'pdfkit';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
export async function generateTicketPDF({ ticketId, match, name, email, phone, seats, pdfFile }) {
|
||||
const doc = new PDFDocument({
|
||||
size: 'A4',
|
||||
margin: 50
|
||||
});
|
||||
|
||||
const outputPath = path.join(__dirname, '../uploads', `ticket-${ticketId}.pdf`);
|
||||
const writeStream = fs.createWriteStream(outputPath);
|
||||
doc.pipe(writeStream);
|
||||
|
||||
// Add logo if exists
|
||||
const logoPath = path.join(__dirname, '../assets/logo.png');
|
||||
if (fs.existsSync(logoPath)) {
|
||||
doc.image(logoPath, 50, 50, { width: 100 });
|
||||
}
|
||||
|
||||
// Add ticket information
|
||||
doc.fontSize(24).text('Handball Match Ticket', { align: 'center' });
|
||||
doc.moveDown();
|
||||
doc.fontSize(16).text(match.name, { align: 'center' });
|
||||
doc.moveDown();
|
||||
|
||||
// Add match details
|
||||
doc.fontSize(12);
|
||||
doc.text(`Date: ${new Date(match.date).toLocaleString()}`);
|
||||
doc.text(`Location: ${match.location}`);
|
||||
|
||||
// Add detailed seat information
|
||||
doc.text('Seats:');
|
||||
seats.forEach(seat => {
|
||||
doc.text(` - ${seat.direction || 'Seat'} ${seat.extractedSeatNumber || seat.seatNumber}`);
|
||||
});
|
||||
|
||||
doc.moveDown();
|
||||
|
||||
// Add customer details
|
||||
doc.text('Customer Information:');
|
||||
doc.text(`Name: ${name}`);
|
||||
doc.text(`Email: ${email}`);
|
||||
doc.text(`Phone: ${phone}`);
|
||||
doc.moveDown();
|
||||
|
||||
// Add ticket ID
|
||||
doc.text(`Ticket ID: ${ticketId}`);
|
||||
doc.moveDown();
|
||||
|
||||
// Add QR code or barcode if needed
|
||||
// TODO: Add QR code generation
|
||||
|
||||
// Add terms and conditions
|
||||
doc.fontSize(10);
|
||||
doc.text('Terms and Conditions:', { underline: true });
|
||||
doc.text('1. This ticket is non-refundable');
|
||||
doc.text('2. Please arrive at least 30 minutes before the match');
|
||||
doc.text('3. Present this ticket at the entrance');
|
||||
|
||||
// Finalize PDF
|
||||
doc.end();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
writeStream.on('finish', () => {
|
||||
resolve(outputPath);
|
||||
});
|
||||
writeStream.on('error', reject);
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue