const fs = require('fs'); const path = require('path'); const { createReport } = require('docx-templates'); // Rechnungsvorlage erstellen const invoiceTemplate = ` RECHNUNG Rechnungssteller: Kunde: ++firma++ ++straße++ ++plz++ ++stadt++ Tel: ++telefon++ Email: ++email++ ++kunde_name++ ++kunde_straße++ ++kunde_plz++ ++kunde_stadt++ Rechnungsnummer: ++rechnungsnummer++ Rechnungsdatum: ++datum++ Fälligkeitsdatum: ++fälligkeitsdatum++ Rechnungsposten: Pos. Artikel/Leistung Menge Einzelpreis Gesamtpreis ++positionen[0].nr++ ++positionen[0].artikel++ ++positionen[0].menge++ ++positionen[0].einzelpreis++ ++positionen[0].gesamtpreis++ Nettobetrag: ++nettobetrag++ MwSt. (19%): ++mwst++ Gesamtbetrag: ++gesamtbetrag++ Vielen Dank für Ihr Vertrauen! Bei Fragen erreichen Sie uns unter: ++email++ `; // Minimales DOCX erstellen const minimalDocx = Buffer.from([ 'UEsDBAoAAAAAAHJZMlUAAAAAAAAAAAAAAQAAAFsQ=', 'b250ZW50X1R5cGVzXS54bWyLycgsyk1VKMsvyk1VKE5OzStJTVEozk8p0S8pzUlNTi0qSsxLTi2y0lEDAEVKB', 'A9QSwECCgAAAAAAclkyVQAAAAAAAAAAAAABAAoAABgAAAAAAAAAAAA==', '[Content_Types].xml', 'UEsFBgAAAAEAAQAwAAAAOgAAAAA=' ].join(''), 'base64'); // Einfaches Template erstellen mit createReport async function createInvoiceTemplate() { try { const templatePath = path.join(__dirname, 'templates', 'rechnung-template.docx'); // Einfaches Template als Basis verwenden und dann überschreiben const baseTemplate = fs.readFileSync(path.join(__dirname, 'templates', 'simple-template.docx')); // Rechnung-Template mit erweiterten Tags erstellen const invoiceContent = await createReport({ template: baseTemplate, data: { // Dummy-Daten um Template-Struktur zu erstellen firma: '++firma++', straße: '++straße++', plz: '++plz++', stadt: '++stadt++', telefon: '++telefon++', email: '++email++', kunde_name: '++kunde_name++', kunde_straße: '++kunde_straße++', kunde_plz: '++kunde_plz++', kunde_stadt: '++kunde_stadt++', rechnungsnummer: '++rechnungsnummer++', datum: '++datum++', fälligkeitsdatum: '++fälligkeitsdatum++', positionen: [ { nr: '++positionen[0].nr++', artikel: '++positionen[0].artikel++', menge: '++positionen[0].menge++', einzelpreis: '++positionen[0].einzelpreis++', gesamtpreis: '++positionen[0].gesamtpreis++' } ], nettobetrag: '++nettobetrag++', mwst: '++mwst++', gesamtbetrag: '++gesamtbetrag++' } }); fs.writeFileSync(templatePath, invoiceContent); console.log('✅ Rechnungs-Template erstellt:', templatePath); } catch (error) { console.error('❌ Fehler beim Erstellen des Rechnungs-Templates:', error); } } // Da wir das base template brauchen, erstellen wir das Template manuell const fs2 = require('fs'); const AdmZip = require('adm-zip'); function createInvoiceTemplateManual() { try { // Neues ZIP für DOCX erstellen const zip = new AdmZip(); // [Content_Types].xml const contentTypes = ` `; // _rels/.rels const rels = ` `; // word/document.xml - Rechnung Template const document = ` RECHNUNG Firma: ++firma++ Kunde: ++kunde_name++ ++straße++ ++kunde_straße++ ++plz++ ++stadt++ ++kunde_plz++ ++kunde_stadt++ Tel: ++telefon++ Email: ++email++ Rechnungsnummer: ++rechnungsnummer++ Datum: ++datum++ Fällig: ++fälligkeitsdatum++ Rechnungsposten: Pos. Artikel Menge Preis Gesamt ++positionen[0].nr++ ++positionen[0].artikel++ ++positionen[0].menge++ ++positionen[0].einzelpreis++ ++positionen[0].gesamtpreis++ Nettobetrag: ++nettobetrag++ MwSt. (19%): ++mwst++ Gesamtbetrag: ++gesamtbetrag++ Vielen Dank für Ihr Vertrauen! `; // Dateien zum ZIP hinzufügen zip.addFile('[Content_Types].xml', Buffer.from(contentTypes, 'utf8')); zip.addFile('_rels/.rels', Buffer.from(rels, 'utf8')); zip.addFile('word/document.xml', Buffer.from(document, 'utf8')); // DOCX speichern const templatePath = path.join(__dirname, 'templates', 'rechnung-template.docx'); fs2.writeFileSync(templatePath, zip.toBuffer()); console.log('✅ Rechnungs-Template erstellt:', templatePath); } catch (error) { console.error('❌ Fehler beim Erstellen des Rechnungs-Templates:', error); } } createInvoiceTemplateManual();