Dolibarr-Modul: Arbeitsberichte aus Anhängen erstellen, annotieren, als PDF an Rechnungen anhängen
|
All checks were successful
Deploy bericht / deploy (push) Successful in 2s
Paradigmen-Wechsel: Editor rendert bei jedem Save sein Fabric-Canvas als PNG und lädt es hoch. PDF nutzt dieses PNG 1:1 statt die Shapes serverseitig nachzuzeichnen. Damit ist garantiert: was du im Editor siehst, ist EXAKT das was im PDF landet. Alle Pfeil/Text/Shape-Rendering-Bugs zwischen Fabric-JSON und PHP-Nachzeichnung sind Geschichte. Kernänderungen: 1. DB: Neue Spalte bericht_page.composite_path (Migration im init()) 2. ajax/save_annotations.php: nimmt multipart file 'composite' entgegen, speichert es unter bericht/work/<fkb>/composite_<pid>.png 3. lib/bericht.lib.php: bericht_render_page_to_pdf prüft composite_path zuerst — wenn vorhanden, wird eine Seite mit genau diesem PNG als volles Bild gerendert, fertig. Fallback auf alte Logik bei alten Berichten ohne Composite. 4. editor.js renderImage: Quellbild wird NICHT mehr auf pdfCanvas gezeichnet, sondern als fabric.Image ins Fabric-Canvas geladen — ZIEHBAR, SKALIERBAR, ROTIERBAR wie jedes andere Objekt. Mehrere Bilder auf einer Seite kein Problem mehr. 5. editor.js savePageAnnotations: nach Shape-State wird toDataURL mit multiplier:2 aufgerufen, PNG-Blob hochgeladen zusammen mit fabric_json (für spätere Edits) und note. 6. editor.js loadPage: wenn fabric_json existiert, wird dieses clientseitig wieder eingeladen (inkl. eingebettete Bilder) — das Quell-Bild wird nicht mehr neu aus der Quelle geholt. Bei leerer Seite läuft der alte Render-Flow. Phase 6 Bonus — Text mit Hintergrund: - Neuer color-picker 'BG:' in der Toolbar + 'Ø'-Button (kein BG) - Fabric IText bekommt textBackgroundColor + padding:6 - Bei selektiertem Text-Objekt wird BG live angewendet - Dataset-Flag 'active' toggelt zwischen ein/aus Dark-Input-Fix: - Textarea in .bericht-page-note nutzte --inputbackgroundcolor (existiert in awl-dark nicht → Fallback #fff = weiße Fläche mit schwarzer Schrift auf Dark-Theme) - Jetzt: --colorbackbody + --colortext + --colorboxbordertitle1 - Generischer Input-Style für alle Text-Eingaben in .bericht-editor Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> [deploy] |
||
|---|---|---|
| .forgejo/workflows | ||
| admin | ||
| ajax | ||
| api | ||
| class | ||
| core/modules | ||
| css | ||
| js | ||
| langs | ||
| lib | ||
| sql | ||
| .gitignore | ||
| bericht_batch.php | ||
| bericht_card.php | ||
| bericht_thirdparty.php | ||
| ChangeLog.md | ||
| CLAUDE.md | ||
| mobile_upload.php | ||
| modulebuilder.txt | ||
| README.md | ||
Bericht — Arbeitsberichte für Dolibarr
Erstellt aus den Anhängen einer Rechnung (oder eines Auftrags / Angebots) einen Arbeitsbericht als PDF. Bilder und PDFs lassen sich im Browser annotieren (Pfeile, Kreise, Rechtecke, Text, Freihand) — der fertige Bericht wird unter Verknüpfte Dokumente der Rechnung abgelegt.
Funktionen
- Reiter „Bericht" auf Rechnungen, Aufträgen und Angeboten (jeweils per Konstante deaktivierbar)
- Anhänge-Browser zeigt alle Dateien des aktuellen Dokuments und der direkt verknüpften Objekte (z. B. der Auftrag zur Rechnung)
- Auswahl per Checkbox — markierte Dateien werden als Seiten in den Bericht übernommen
- Browser-Editor mit PDF.js + Fabric.js: Pfeile, Kreise, Rechtecke, Freihand, Text, Farbe, Strichstärke, Undo/Redo
- Seiten-Verwaltung per Drag&Drop (SortableJS): umordnen, löschen, drehen, neue Seiten hochladen
- Notizen pro Seite — werden im finalen PDF unten auf der Seite gedruckt
- Deckblatt aus ODT-Vorlage mit Platzhaltern (
{auftragsnummer},{kunde_name},{datum}, …) - ODT-Templates im Admin-Bereich verwaltbar (mehrere Vorlagen, Standard wählbar)
- Auftragsnummer wird automatisch aus dem Extrafield
options_auftragsnummerder Rechnung gezogen - Mehrere Berichte pro Dokument möglich
- Berichte als Entwurf speichern (jederzeit wieder editierbar) oder finalisieren (PDF erzeugen)
Voraussetzungen
- Dolibarr ≥ 19.0
- PHP ≥ 7.4
- TCPDF (in Dolibarr enthalten)
- FPDI (für PDF-Anhänge in den Bericht zu mergen) — empfohlen, optional
- LibreOffice headless (für ODT→PDF Konvertierung der Deckblätter)
- Optional:
pdfinfooderimagickfür PDF-Seitenanzahl-Erkennung
Installation
- Modul-Verzeichnis nach
dolibarr/htdocs/custom/bericht/(oder per Symlink aus dem Module-Mount-Pfad) kopieren - In Dolibarr unter Konfiguration → Module/Anwendungen das Modul Bericht aktivieren
- Beim Aktivieren werden die SQL-Tabellen
llx_berichtundllx_bericht_pageangelegt - Vorhandene Extrafields auf
llx_facture_extrafields(auftragsnummer,angebotsnummer, …) werden erkannt und nicht überschrieben — fehlende werden angelegt - Im Admin-Bereich (
/bericht/admin/setup.php) die ODT-Templates hochladen und Standard-Template setzen
Verwendung
- Eine Rechnung öffnen (
/compta/facture/card.php?id=…) - Reiter Bericht auswählen
- + Neuer Bericht klicken — die Auftragsnummer wird automatisch übernommen
- Im Editor links die gewünschten Anhänge ankreuzen → Auswahl in Bericht übernehmen
- Im mittleren Editor mit den Werkzeugen Pfeile, Texte etc. zeichnen
- Seiten rechts per Drag&Drop sortieren, einzelne Seiten löschen, neue Dateien hochladen
- Bericht finalisieren — PDF wird erzeugt, Deckblatt aus der ODT-Vorlage gerendert und unter den verknüpften Dokumenten der Rechnung abgelegt
ODT-Template Platzhalter
| Platzhalter | Inhalt |
|---|---|
{auftragsnummer} |
Aus extrafield options_auftragsnummer der Rechnung |
{angebotsnummer} |
Aus extrafield options_angebotsnummer |
{rechnungsnummer} |
ref der Rechnung |
{kunde_name} |
Name des Kunden (Société) |
{kunde_adresse} |
Adresse des Kunden, mehrzeilig |
{datum} |
Heutiges Datum |
{beschreibung} |
extrafield options_beschreibung |
{hinweis} |
extrafield options_hinweis |
{bericht_titel} |
Titel des Berichts |
{ersteller} |
Login-Name des erstellenden Users |
Architektur
bericht/
├── core/modules/modBericht.class.php Modul-Descriptor, Tabs, Extrafields-Init
├── class/bericht.class.php Bericht + BerichtPage CRUD
├── lib/bericht.lib.php Helper (Anhänge sammeln, Auftragsnr., Templates)
├── bericht_card.php Editor-Seite (Tab-Inhalt)
├── admin/setup.php Admin: ODT-Templates, Konstanten
├── ajax/ Endpoints (Token-geschützt)
│ ├── _inc.php Gemeinsamer Header
│ ├── add_attachment.php Anhang als Seite hinzufügen
│ ├── upload_extra.php Direkter Upload
│ ├── save_annotations.php Fabric-JSON speichern
│ ├── page_meta.php Annotationen + Notiz laden
│ ├── page_image.php Seitenbild/PDF ausliefern
│ ├── delete_page.php
│ ├── reorder_pages.php
│ └── generate_pdf.php Finalisierung: TCPDF + FPDI + ODT-Deckblatt
├── js/
│ ├── editor.js PDF.js + Fabric.js Integration
│ └── lib/ PDF.js, Fabric.js, SortableJS (lokal)
├── css/bericht.css
├── sql/
│ ├── llx_bericht.sql
│ ├── llx_bericht.key.sql
│ ├── llx_bericht_page.sql
│ └── llx_bericht_page.key.sql
└── langs/{de_DE,en_US}/bericht.lang
Lizenz
GPL v3+