import { Injectable } from '@nestjs/common'; import { KeyHandoverDto } from 'src/model/dto/key-handover.dto'; import * as puppeteer from 'puppeteer'; import { MinioService } from '../minio/minio.service'; import { KeyHandoutRepository } from 'src/model/repositories/key-handout.repository'; import { KeyHandout } from 'src/model/entitites'; import { ConfigService } from '@nestjs/config'; @Injectable() export class KeyHandoverPdfService { constructor(private readonly minioService: MinioService, private handoverRepo: KeyHandoutRepository, private configService: ConfigService) {} async generatePdf(dto: KeyHandoverDto): Promise { const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], }); try { const page = await browser.newPage(); const html = this.buildHtml(dto); await page.setContent(html, { waitUntil: 'networkidle0', }); const pdf = await page.pdf({ format: 'A4', printBackground: true, margin: { top: '20mm', right: '15mm', bottom: '20mm', left: '15mm', }, displayHeaderFooter: true, headerTemplate: `
`, footerTemplate: `
Übergabeprotokoll ${new Date().toLocaleString()}
`, }); const buffer = Buffer.from(pdf); const bucket = this.configService.get('MINIOBUCKET'); const key = `handover-forms/${Date.now()}-schluesseluebergabe.pdf`; await this.minioService.uploadPdf(bucket, key, buffer); await this.saveKeyToHandover(dto.handoverId, key) return buffer; } finally { await browser.close(); } } private async saveKeyToHandover(handoverId: string, fileKey: string) { const handover: KeyHandout = await this.handoverRepo.findOneBy({ id: handoverId }); if (!handover) { return; } handover.pdfFormKey = fileKey; this.handoverRepo.save(handover); } private buildHtml(dto: KeyHandoverDto): string { return ` Übergabeprotokoll

Übergabeprotokoll

Übergabedaten
Datum der Übergabe: ${this.escapeHtml(new Date(dto.handoverDate).toLocaleDateString())}
Übergeber
Name: ${this.escapeHtml(dto.giverName)}
Adresse: ${this.escapeHtml(dto.giverAddress ?? '-')}
Empfänger
Name: ${this.escapeHtml(dto.receiverName)}
Adresse: ${this.escapeHtml(dto.receiverAddress ?? '-')}
Schlüsselangaben
Schlüsselnummer: ${this.escapeHtml(dto.keyNumber ?? '-')}
Objekt / Raum: ${this.escapeHtml(dto.objectDescription ?? '-')}
Bemerkungen:
${this.escapeHtml(dto.notes ?? '-')}
Hiermit bestätigt der Empfänger den Erhalt der oben aufgeführten Schlüssel.
Mit ihrer Unterschrift bestätigen beide Parteien die ordnungsgemäße Übergabe.
Unterschrift Übergeber
Unterschrift Empfänger
`; } private escapeHtml(value: string): string { if (!value) { return ""; } return value .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } }