PDF-Auftragsvorlagen-System, Objekttyp/Lage-Felder, Eigentümer-Fallback bei Bankverbindung
- PDF-Template-Editor in Einstellungen: Vorlagen hochladen, Formularfelder automatisch auslesen, CRM-Felder zuordnen - PDF-Vorschau mit annotierten Feldnamen, seitenweise Sortierung der Felder - Auftrag generieren aus Vertragsdaten (Button im Vertrags-Detail) - Dynamische Rufnummern-Felder mit Vorwahl-Extraktion und konfigurierbarer Maximalanzahl - Nicht zugeordnete Felder bleiben editierbar im generierten PDF - Eigentümer-Felder mit Namens-Kombinationen (Firma+Name etc.) und Fallback auf Kundendaten - Stressfrei-E-Mail als Feld-Option im Template-Editor - Objekttyp, Lage und Lage des Anschlusses als neue Felder bei Festnetz-Verträgen (DSL, Glasfaser, Kabel) - Bankverbindung-Fallback: wenn keine am Vertrag verknüpft, wird automatisch die neueste aktive des Kunden genommen Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
import { Router } from 'express';
|
||||
import multer from 'multer';
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import { authenticate, requirePermission } from '../middleware/auth.js';
|
||||
import * as pdfTemplateController from '../controllers/pdfTemplate.controller.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
// Upload-Verzeichnis
|
||||
const templatesDir = path.join(process.cwd(), 'uploads', 'pdf-templates');
|
||||
if (!fs.existsSync(templatesDir)) {
|
||||
fs.mkdirSync(templatesDir, { recursive: true });
|
||||
}
|
||||
|
||||
const upload = multer({
|
||||
storage: multer.diskStorage({
|
||||
destination: (_req, _file, cb) => cb(null, templatesDir),
|
||||
filename: (_req, file, cb) => {
|
||||
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);
|
||||
cb(null, `template-${uniqueSuffix}${path.extname(file.originalname)}`);
|
||||
},
|
||||
}),
|
||||
fileFilter: (_req, file, cb) => {
|
||||
if (file.mimetype === 'application/pdf') cb(null, true);
|
||||
else cb(new Error('Nur PDF-Dateien sind erlaubt'));
|
||||
},
|
||||
limits: { fileSize: 20 * 1024 * 1024 },
|
||||
});
|
||||
|
||||
router.use(authenticate);
|
||||
|
||||
// CRUD
|
||||
router.get('/', requirePermission('settings:read'), pdfTemplateController.getTemplates);
|
||||
router.get('/crm-fields', requirePermission('settings:read'), pdfTemplateController.getCrmFields);
|
||||
router.get('/:id', requirePermission('settings:read'), pdfTemplateController.getTemplate);
|
||||
router.post('/', requirePermission('settings:update'), upload.single('template'), pdfTemplateController.createTemplate);
|
||||
router.put('/:id', requirePermission('settings:update'), pdfTemplateController.updateTemplate);
|
||||
router.delete('/:id', requirePermission('settings:update'), pdfTemplateController.deleteTemplate);
|
||||
|
||||
// PDF-Felder auslesen
|
||||
router.get('/:id/fields', requirePermission('settings:read'), pdfTemplateController.extractFields);
|
||||
|
||||
// Annotierte Vorschau (Feldnamen in der PDF sichtbar)
|
||||
router.get('/:id/preview', requirePermission('settings:read'), pdfTemplateController.getAnnotatedPreview);
|
||||
|
||||
// PDF generieren
|
||||
router.get('/:id/generate/:contractId/inputs', requirePermission('contracts:read'), pdfTemplateController.getRequiredInputs);
|
||||
router.post('/:id/generate/:contractId', requirePermission('contracts:read'), pdfTemplateController.generatePdf);
|
||||
// Auch GET für direkte Links (ohne Extras)
|
||||
router.get('/:id/generate/:contractId', requirePermission('contracts:read'), pdfTemplateController.generatePdf);
|
||||
|
||||
export default router;
|
||||
Reference in New Issue
Block a user