From 650c42b8f0d4fbe012d35a6dc2b3904a785f7d82 Mon Sep 17 00:00:00 2001 From: data Date: Mon, 2 Mar 2026 11:53:21 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20PDF-Anh=C3=A4nge=20und=20Bezeichnung=20f?= =?UTF-8?q?=C3=BCr=20Lieferantenrechnungen=20(v4.2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PDF-Anhänge: - ZUGFeRD-PDF wird jetzt in ECM-Datenbank registriert (llx_ecm_files) - Verhindert Verlust der PDF beim Validieren der Rechnung - Korrekte Verknüpfung über src_object_type/src_object_id Rechnungsliste: - Teuerster Artikel wird als Bezeichnung (label) der Rechnung gesetzt - Erleichtert schnelle Identifikation in der Lieferantenrechnungsliste Co-Authored-By: Claude Opus 4.5 --- .claude/settings.local.json | 15 +++------ CHANGELOG.md | 13 ++++++++ core/modules/modImportZugferd.class.php | 2 +- import.php | 41 +++++++++++++++++++++++-- 4 files changed, 57 insertions(+), 14 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index d002b46..ff6ee06 100755 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -9,12 +9,9 @@ "Bash(cut:*)", "Bash(grep:*)", "Bash(mysql:*)", + "Bash(mariadb:*)", "Bash(ls:*)", "Bash(php:*)", -<<<<<<< HEAD - "Bash(for module in /srv/http/dolibarr/custom/*/core/modules/mod*.php)", - "Bash(do echo \"=== $module ===\" grep -A5 \"''js''\" \"$module\")", - "Bash(done)", "Bash(find:*)", "Bash(chown:*)", "Bash(sudo chown:*)", @@ -35,13 +32,9 @@ "Bash(git tag:*)", "Bash(git push:*)", "Bash(git pull:*)", - "Bash(git stash:*)" -======= - "Bash(mariadb:*)", - "Bash(git add:*)", - "Bash(git commit -m \"$\\(cat <<''EOF''\nVersion 3.2: Cross-Katalog-Suche und Multi-Lieferanten-Preise\n\n- Cross-Katalog-Suche: Artikel werden via EAN/Hersteller-Art.Nr. in allen Katalogen gefunden\n- Multi-Lieferanten-Anzeige mit Preisvergleich \\(Prozent guenstiger/teurer\\)\n- Fehlende Lieferantenpreise werden bei zugeordneten Produkten angeboten\n- Fix: Kluxen-Datanorm Preise im A-Record \\(Cent -> Euro Umrechnung\\)\n- Neue Uebersetzungen fuer Lieferanten-Alternativen\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", - "Bash(git push:*)" ->>>>>>> 8521c7f (Version 3.3) + "Bash(git stash:*)", + "Bash(1 <<'EOF'\nSELECT \n i.rowid as import_id,\n i.ref as import_ref,\n i.invoice_number,\n i.status,\n i.fk_facture_fourn,\n DATE\\(i.date_creation\\) as datum\nFROM llx_importzugferd_import i\nWHERE i.status = 'processed'\nORDER BY i.date_creation DESC\nLIMIT 10;\nEOF)", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfix: PDF-Anhänge und Bezeichnung für Lieferantenrechnungen \\(v4.2\\)\n\nPDF-Anhänge:\n- ZUGFeRD-PDF wird jetzt in ECM-Datenbank registriert \\(llx_ecm_files\\)\n- Verhindert Verlust der PDF beim Validieren der Rechnung\n- Korrekte Verknüpfung über src_object_type/src_object_id\n\nRechnungsliste:\n- Teuerster Artikel wird als Bezeichnung \\(label\\) der Rechnung gesetzt\n- Erleichtert schnelle Identifikation in der Lieferantenrechnungsliste\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")" ] } } diff --git a/CHANGELOG.md b/CHANGELOG.md index 979753c..774beef 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ Alle wesentlichen Änderungen an diesem Projekt werden in dieser Datei dokumentiert. +## [4.2] - 2026-03-02 + +### Behoben +- **PDF-Anhänge**: ZUGFeRD-PDFs werden jetzt korrekt an Lieferantenrechnungen angehängt + - Problem: PDF wurde nur ins Dateisystem kopiert, nicht in ECM-Datenbank registriert + - Lösung: `EcmFiles`-Eintrag wird erstellt für korrekte Verknüpfung mit Rechnung + - Wichtig: Bei Rechnungsvalidierung wird PDF automatisch mitverschoben + +### Hinzugefügt +- **Bezeichnung in Rechnungsliste**: Teuerster Artikel wird als Bezeichnung der Lieferantenrechnung gesetzt + - Erleichtert schnelle Identifikation in der Rechnungsliste + - Spalte "Bezeichnung" muss in Liste aktiviert sein + ## [4.0] - 2026-03-01 ### Behoben diff --git a/core/modules/modImportZugferd.class.php b/core/modules/modImportZugferd.class.php index 4d36f7f..a91f51e 100755 --- a/core/modules/modImportZugferd.class.php +++ b/core/modules/modImportZugferd.class.php @@ -76,7 +76,7 @@ class modImportZugferd extends DolibarrModules $this->editor_squarred_logo = ''; // Must be image filename into the module/img directory followed with @modulename. Example: 'myimage.png@importzugferd' // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z' - $this->version = '4.1'; + $this->version = '4.2'; // Url to the file with your last numberversion of this module //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; diff --git a/import.php b/import.php index 5e80e3e..f3eb69f 100755 --- a/import.php +++ b/import.php @@ -1981,6 +1981,21 @@ if ($action == 'createinvoice' && $id > 0) { $invoice->date = $import->invoice_date; $invoice->note_private = $langs->trans('ImportedFromZugferd').' ('.$import->ref.')'; + // Set label to most expensive item (for list display) + $maxTotal = 0; + $mostExpensiveLabel = ''; + foreach ($lines as $line) { + $lineTotal = $line->quantity * $line->unit_price; + if ($lineTotal > $maxTotal) { + $maxTotal = $lineTotal; + $mostExpensiveLabel = $line->product_name; + } + } + if (!empty($mostExpensiveLabel)) { + // Truncate to 255 chars (database field limit) + $invoice->label = dol_trunc($mostExpensiveLabel, 255); + } + // Use supplier default values for payment $invoice->cond_reglement_id = $supplier->cond_reglement_supplier_id ?: 1; $invoice->mode_reglement_id = $supplier->mode_reglement_supplier_id ?: 0; @@ -2025,14 +2040,36 @@ if ($action == 'createinvoice' && $id > 0) { if (!$error) { // Invoice stays as draft - user can validate manually - // Copy PDF to invoice + // Copy PDF to invoice and register in ECM $source_pdf = $conf->importzugferd->dir_output.'/imports/'.$import->id.'/'.$import->pdf_filename; if (file_exists($source_pdf)) { + // Relativer Pfad für ECM (ohne DOL_DATA_ROOT Prefix) + $rel_dir = 'fournisseur/facture/'.get_exdir($invoice->id, 2, 0, 0, $invoice, 'invoice_supplier').$invoice->ref; $dest_dir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($invoice->id, 2, 0, 0, $invoice, 'invoice_supplier').$invoice->ref; + if (!is_dir($dest_dir)) { dol_mkdir($dest_dir); } - if (!@copy($source_pdf, $dest_dir.'/'.$import->pdf_filename)) { + + $dest_file = $dest_dir.'/'.$import->pdf_filename; + if (@copy($source_pdf, $dest_file)) { + // In ECM-Datenbank registrieren für korrekte Verknüpfung + require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php'; + $ecmfile = new EcmFiles($db); + $ecmfile->filepath = $rel_dir; + $ecmfile->filename = $import->pdf_filename; + $ecmfile->label = md5_file(dol_osencode($dest_file)); + $ecmfile->fullpath_orig = $dest_file; + $ecmfile->gen_or_uploaded = 'uploaded'; + $ecmfile->description = 'ZUGFeRD Import - '.$import->invoice_number; + $ecmfile->src_object_type = 'supplier_invoice'; + $ecmfile->src_object_id = $invoice->id; + $ecmfile->entity = $conf->entity; + $result = $ecmfile->create($user); + if ($result < 0) { + dol_syslog('ImportZugferd: Fehler beim ECM-Eintrag: '.implode(',', $ecmfile->errors), LOG_ERR); + } + } else { dol_syslog('ImportZugferd: Fehler beim Kopieren der PDF nach '.$dest_dir, LOG_ERR); } }