# Bilder in ODT-Dokumenten mit EPCQR-Modul ## Übersicht Das EPCQR-Modul bietet eine **wiederverwendbare Lösung** zum Einfügen von Bildern in ODT-Dokumentvorlagen. Die Implementierung ist generisch und kann für beliebige Bilder verwendet werden, nicht nur für QR-Codes. ## Funktionsweise ### 1. QR-Code Keyword: `{qrcode}` Das neue Keyword `{qrcode}` kann in jedem ODT-Dokumenttemplate verwendet werden und wird automatisch durch ein QR-Code-Bild ersetzt. **Beispiel in ODT-Template:** ``` Rechnung: {ref} Betrag: {total_ttc} Bitte überweisen Sie den Betrag mit folgendem QR-Code: {qrcode} ``` ### 2. Generische Bildintegration Das System unterstützt auch **beliebige andere Bilder**: - Erstellen Sie ein Extrafeld mit dem Suffix `_imagepath` - Speichern Sie den Dateipfad zum Bild im Extrafeld - Verwenden Sie das Keyword `{FELDNAME}` im ODT-Template **Beispiel:** 1. Extrafeld: `logo_imagepath` (Typ: varchar) 2. Speichern: `/pfad/zum/logo.png` im Extrafeld 3. Im Template: `{logo}` ## Installation und Konfiguration ### Schritt 1: Modul aktualisieren Das Modul muss deaktiviert und neu aktiviert werden, damit die neuen Funktionen verfügbar sind: 1. **Home → Setup → Modules/Applications** 2. **EPCQR-Modul deaktivieren** 3. **EPCQR-Modul aktivieren** ### Schritt 2: Extrafeld erstellen (automatisch) Das SQL-Update-Script erstellt automatisch das Extrafeld `qrcodepath`: ```sql -- Wird automatisch bei Modulaktivierung ausgeführt INSERT INTO llx_extrafields (name, label, type, elementtype, ...) VALUES ('qrcodepath', 'QR-Code Bildpfad (lokal)', 'varchar', 'facture', ...); ``` ### Schritt 3: Konfiguration anpassen (optional) Bankverbindung in [admin/setup.php](admin/setup.php) konfigurieren: - **EPCQR_ACCOUNT_HOLDER**: Kontoinhaber Name - **EPCQR_IBAN**: IBAN - **EPCQR_BIC**: BIC *Aktuell noch hardcoded im Trigger, wird in Version 1.6 konfigurierbar.* ## Verwendung in ODT-Templates ### QR-Code in Rechnung einfügen 1. **ODT-Template bearbeiten** (z.B. `invoice_template.odt`) 2. **Keyword einfügen**: `{qrcode}` an gewünschter Stelle 3. **Template speichern** in Dolibarr 4. **Rechnung validieren** → QR-Code wird automatisch generiert 5. **Dokument generieren** (ODT) → QR-Code wird eingefügt ### Eigene Bilder einfügen **Beispiel: Firmenlogo** 1. **Extrafeld erstellen**: - Name: `company_logo_imagepath` - Typ: `varchar(255)` - Element: `facture` 2. **Bild speichern**: ```php $invoice->array_options['options_company_logo_imagepath'] = '/pfad/zum/logo.png'; $invoice->insertExtraFields(); ``` 3. **Template verwenden**: ``` {company_logo} ``` ## Technische Details ### Architektur ``` ┌─────────────────────────────────────┐ │ 1. BILL_VALIDATE Trigger │ │ - Rechnung validiert │ │ - QR-Code generieren │ │ - Pfad in Extrafeld speichern │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 2. ODT-Generierung │ │ - Template laden │ │ - Felder ersetzen │ │ - ODT-Datei erstellen │ └──────────────┬──────────────────────┘ │ ▼ ┌─────────────────────────────────────┐ │ 3. afterODTCreation Hook │ │ - ODT entpacken (ZIP) │ │ - Bild in Pictures/ kopieren │ │ - manifest.xml aktualisieren │ │ - {qrcode} durch │ │ XML ersetzen │ │ - ODT neu packen │ └─────────────────────────────────────┘ ``` ### Wichtige Dateien | Datei | Funktion | |-------|----------| | [lib/qrcode.class.php](../lib/qrcode.class.php) | QR-Code-Generator mit Caching | | [lib/epcqr.lib.php](../lib/epcqr.lib.php) | Hilfsfunktionen für QR-Codes und Bilder | | [core/substitutions/functions_epcqr.lib.php](../core/substitutions/functions_epcqr.lib.php) | Substitutionsfunktionen für ODT | | [class/actions_epcqr.class.php](../class/actions_epcqr.class.php) | Hook-Klasse für ODT-Verarbeitung | | [core/triggers/interface_99_modEpcqr_EpcqrTriggers.class.php](../core/triggers/interface_99_modEpcqr_EpcqrTriggers.class.php) | Trigger für BILL_VALIDATE | ### Extrafelder | Feldname | Typ | Beschreibung | |----------|-----|--------------| | `qrcode` | HTML | QR-Code als ``-Tag (Kompatibilität) | | `qrcodepfad` | varchar | URL zum QR-Code über viewimage.php | | `qrcodepath` | varchar | **NEU**: Lokaler Dateipfad für ODT-Integration | ### Bildverarbeitung **ODT ist ein ZIP-Archiv:** ``` invoice.odt ├── mimetype (unkomprimiert!) ├── META-INF/ │ └── manifest.xml (Bild-Referenzen) ├── content.xml (Dokument-Inhalt) ├── styles.xml └── Pictures/ ├── qrcode.png └── logo.png ``` **Ablauf:** 1. **ODT entpacken**: `ZipArchive::extractTo()` 2. **Bild kopieren**: `copy($source, $tmpDir.'/Pictures/img.png')` 3. **Manifest aktualisieren**: ```xml ``` 4. **Content.xml anpassen**: ```xml ``` 5. **ODT neu packen**: `ZipArchive::addFile()` mit `mimetype` unkomprimiert ## QR-Code-Generierung ### Aktueller Stand (Version 1.5) QR-Codes werden **lokal generiert** und gecached: ```php $qrGen = new QRCodeGenerator($db); $qrCodePath = $qrGen->generateEPCQRCode( 'Eduard Wisch', // Kontoinhaber 'DE70217625500013438147', // IBAN 'GENODEF1HUM', // BIC 150.00, // Betrag 'IN26-0001' // Verwendungszweck ); // Ergebnis: /srv/http/dolibarr/documents/epcqr/qrcodes/epc_abc123.png ``` **Caching:** - QR-Codes werden im Verzeichnis `documents/epcqr/qrcodes/` gespeichert - Dateiname basiert auf MD5-Hash der Parameter - Wiederverwendung bei identischen Parametern ### Migration von externem Service **Alt (bis Version 1.4):** ```php $qrurl = "https://qr.data-it-solution.de/epc?..."; $invoice->array_options['options_qrcode'] = ""; ``` **Neu (ab Version 1.5):** ```php $qrCodePath = $qrGen->generateEPCQRCode(...); $invoice->array_options['options_qrcodepath'] = $qrCodePath; $invoice->array_options['options_qrcode'] = ""; ``` **Kompatibilität:** - Bestehende Extrafelder bleiben erhalten - Alte Rechnungen mit extern gehosteten QR-Codes funktionieren weiter - Neue Rechnungen verwenden lokale QR-Codes ## Erweiterte Verwendung ### Eigene QR-Codes generieren ```php require_once DOL_DOCUMENT_ROOT.'/custom/epcqr/lib/qrcode.class.php'; $qrGen = new QRCodeGenerator($db); // Generischer QR-Code $qrPath = $qrGen->generateQRCode('https://example.com', 'url'); // EPC-QR-Code $qrPath = $qrGen->generateEPCQRCode( 'Firma GmbH', 'DE89370400440532013000', 'COBADEFFXXX', 99.99, 'Rechnung 2026-001' ); ``` ### Cache-Verwaltung ```php // Alte QR-Codes löschen (älter als 30 Tage) $qrGen = new QRCodeGenerator($db); $deleted = $qrGen->cleanCache(30); echo "Gelöscht: ".$deleted." QR-Codes"; ``` ### Bildgröße anpassen Die Bildgröße wird automatisch berechnet und an die ODT-Vorgaben angepasst: ```php // In functions_epcqr.lib.php, Zeile ~180 $widthCm = round(($imageWidth / 96) * 2.54, 2); // Pixel → cm (96 DPI) $heightCm = round(($imageHeight / 96) * 2.54, 2); // Maximale Größe begrenzen $maxWidth = 6; // cm $maxHeight = 6; // cm ``` **Anpassen:** Bearbeiten Sie `epcqr_insertImagesIntoODT()` in [core/substitutions/functions_epcqr.lib.php](../core/substitutions/functions_epcqr.lib.php#L180) ## Fehlerbehebung ### Problem: QR-Code wird nicht angezeigt **Ursache 1: Extrafeld fehlt** ```bash # Prüfen ob Extrafeld existiert mysql> SELECT name, label FROM llx_extrafields WHERE name = 'qrcodepath'; ``` **Lösung:** ```bash # SQL-Update manuell ausführen mysql dolibarr < sql/update_1.5.0.sql ``` **Ursache 2: Verzeichnis nicht beschreibbar** ```bash # Prüfen ls -la /srv/http/dolibarr/documents/epcqr/ # Berechtigungen setzen chmod 755 /srv/http/dolibarr/documents/epcqr/ chmod 755 /srv/http/dolibarr/documents/epcqr/qrcodes/ ``` **Ursache 3: Hook nicht aktiviert** ```bash # Prüfen grep -r "hooks.*array" core/modules/modEpcqr.class.php # Sollte enthalten: 'hooks' => array( 'data' => array('pdfgeneration', 'odtgeneration', ...), ``` ### Problem: Bild wird im ODT nicht korrekt eingebettet **Diagnose:** 1. ODT als ZIP öffnen 2. Prüfen ob `Pictures/qrcode.png` existiert 3. Prüfen ob `META-INF/manifest.xml` Eintrag enthält **Lösung:** - `manifest.xml` muss Bild-Referenz enthalten - `mimetype` muss unkomprimiert sein - `content.xml` muss `` Element enthalten ### Debug-Modus aktivieren ```php // In lib/epcqr.lib.php oder functions_epcqr.lib.php dol_syslog("EPCQR: Debug-Info", LOG_DEBUG); // Dolibarr syslog Levels: // LOG_ERR - Fehler // LOG_WARNING - Warnungen // LOG_INFO - Informationen // LOG_DEBUG - Debug-Informationen ``` **Logs ansehen:** ```bash tail -f /srv/http/dolibarr/documents/dolibarr.log | grep EPCQR ``` ## Roadmap ### Version 1.6 (geplant) - [ ] Native PHP-QR-Code-Generierung (ohne externen Service) - [ ] Konfigurierbare Bankverbindung in Admin-Panel - [ ] Unterstützung für mehrere Bankkonten - [ ] Bildgröße per Konfiguration anpassbar ### Version 1.7 (geplant) - [ ] Unterstützung für DOCX-Dokumente - [ ] Batch-Verarbeitung für mehrere Rechnungen - [ ] QR-Code Vorschau im Rechnungsformular ## Support und Beiträge **Autor:** Eduard Wisch (data@data-it-solution.de) **Lizenz:** GPL v3 **GitHub:** (falls vorhanden) **Bei Problemen:** 1. Prüfen Sie die Logs: `documents/dolibarr.log` 2. Aktivieren Sie Debug-Modus 3. Erstellen Sie ein Issue mit Logs und Screenshots