363 lines
10 KiB
Markdown
363 lines
10 KiB
Markdown
# 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 <draw:frame> │
|
|
│ 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 `<img>`-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
|
|
<manifest:file-entry
|
|
manifest:media-type="image/png"
|
|
manifest:full-path="Pictures/img.png"/>
|
|
```
|
|
4. **Content.xml anpassen**:
|
|
```xml
|
|
<draw:frame draw:name="QRCode"
|
|
text:anchor-type="as-char"
|
|
svg:width="2cm"
|
|
svg:height="2cm">
|
|
<draw:image xlink:href="Pictures/img.png"
|
|
xlink:type="simple"
|
|
xlink:show="embed"/>
|
|
</draw:frame>
|
|
```
|
|
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'] = "<img src='".$qrurl."'>";
|
|
```
|
|
|
|
**Neu (ab Version 1.5):**
|
|
```php
|
|
$qrCodePath = $qrGen->generateEPCQRCode(...);
|
|
$invoice->array_options['options_qrcodepath'] = $qrCodePath;
|
|
$invoice->array_options['options_qrcode'] = "<img src='".DOL_URL_ROOT."/viewimage.php?...'>";
|
|
```
|
|
|
|
**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 `<draw:frame>` 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
|