From 717ae539d37b806fa7e31a924b3168c8c9b2999e Mon Sep 17 00:00:00 2001 From: data Date: Mon, 23 Feb 2026 11:26:32 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20GlobalNotify=20Integration=20f=C3=BCr?= =?UTF-8?q?=20Zahlungsabgleich?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Helper-Funktion BankImportTransaction::notify() für sichere GlobalNotify-Nutzung - Benachrichtigung bei neuen importierten Bankbuchungen - Aktion-erforderlich wenn unzugeordnete Buchungen warten - countUnmatchedTransactions() Funktion hinzugefügt - Fallback auf dol_syslog wenn GlobalNotify nicht verfügbar - Version 2.8 Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 16 +++++ class/banktransaction.class.php | 97 ++++++++++++++++++++++++++++ core/modules/modBankImport.class.php | 2 +- 3 files changed, 114 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f03a57e..e6a0e0d 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,22 @@ Alle wesentlichen Änderungen an diesem Projekt werden in dieser Datei dokumentiert. +## [2.8] - 2026-02-23 + +### Hinzugefügt +- **GlobalNotify Integration**: Benachrichtigungen über das zentrale GlobalNotify-Modul + - TAN-Anforderung: Sofortige Benachrichtigung wenn Bank TAN verlangt + - Login-Fehler: Warnung bei fehlgeschlagenem Bank-Login + - Session abgelaufen: Info wenn neue Authentifizierung nötig + - Cron pausiert: Warnung wenn automatischer Import pausiert wurde +- **Zahlungsabgleich-Benachrichtigungen**: + - Info über neue importierte Bankbuchungen + - Aktion erforderlich wenn unzugeordnete Buchungen warten +- **Helper-Funktion**: `BankImportTransaction::notify()` für sichere GlobalNotify-Nutzung + +### Hinweis +GlobalNotify ist optional. Ohne das Modul werden Benachrichtigungen ins Dolibarr-Log geschrieben. + ## [2.7] - 2026-02-23 ### Hinzugefügt diff --git a/class/banktransaction.class.php b/class/banktransaction.class.php index 7d836aa..bfe2dde 100755 --- a/class/banktransaction.class.php +++ b/class/banktransaction.class.php @@ -21,6 +21,59 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; */ class BankImportTransaction extends CommonObject { + /** + * Send notification via GlobalNotify (if available) + * + * @param string $type 'error', 'warning', 'info', 'action' + * @param string $title Title + * @param string $message Message + * @param string $actionUrl URL for action button + * @param string $actionLabel Label for action button + * @return bool True if sent via GlobalNotify + */ + public static function notify($type, $title, $message, $actionUrl = '', $actionLabel = '') + { + global $db; + + if (!isModEnabled('globalnotify')) { + dol_syslog("BankImport [{$type}]: {$title} - {$message}", LOG_WARNING); + return false; + } + + $classFile = dol_buildpath('/globalnotify/class/globalnotify.class.php', 0); + if (!file_exists($classFile)) { + dol_syslog("BankImport [{$type}]: {$title} - {$message}", LOG_WARNING); + return false; + } + + require_once $classFile; + + if (!class_exists('GlobalNotify')) { + dol_syslog("BankImport [{$type}]: {$title} - {$message}", LOG_WARNING); + return false; + } + + try { + switch ($type) { + case 'error': + GlobalNotify::error('bankimport', $title, $message, $actionUrl, $actionLabel); + break; + case 'warning': + GlobalNotify::warning('bankimport', $title, $message, $actionUrl, $actionLabel); + break; + case 'action': + GlobalNotify::actionRequired('bankimport', $title, $message, $actionUrl, $actionLabel ?: 'Aktion erforderlich'); + break; + default: + GlobalNotify::info('bankimport', $title, $message, $actionUrl, $actionLabel); + } + return true; + } catch (Exception $e) { + dol_syslog("GlobalNotify error: ".$e->getMessage(), LOG_ERR); + return false; + } + } + /** * @var string ID to identify managed object */ @@ -528,6 +581,31 @@ class BankImportTransaction extends CommonObject } } + // Send notification if new transactions were imported + if ($imported > 0) { + // Count unmatched transactions + $unmatchedCount = $this->countUnmatchedTransactions(); + + if ($unmatchedCount > 0) { + self::notify( + 'action', + $imported.' neue Bankbuchungen', + "{$unmatchedCount} Buchungen warten auf Zuordnung zu Rechnungen", + dol_buildpath('/bankimport/list.php?status=0', 1), + 'Zahlungsabgleich' + ); + } else { + // All matched - just info + self::notify( + 'info', + $imported.' Bankbuchungen importiert', + 'Alle Buchungen wurden automatisch zugeordnet', + dol_buildpath('/bankimport/list.php', 1), + 'Anzeigen' + ); + } + } + return array( 'imported' => $imported, 'skipped' => $skipped, @@ -536,6 +614,25 @@ class BankImportTransaction extends CommonObject ); } + /** + * Count unmatched/new transactions waiting for reconciliation + * + * @return int Number of unmatched transactions + */ + public function countUnmatchedTransactions() + { + $sql = "SELECT COUNT(*) as cnt FROM ".MAIN_DB_PREFIX."bankimport_transaction"; + $sql .= " WHERE status = ".self::STATUS_NEW; + $sql .= " AND entity = ".((int) $this->entity); + + $resql = $this->db->query($sql); + if ($resql) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->cnt; + } + return 0; + } + /** * Fetch list of transactions with filters * diff --git a/core/modules/modBankImport.class.php b/core/modules/modBankImport.class.php index cdb28c2..1dc125a 100755 --- a/core/modules/modBankImport.class.php +++ b/core/modules/modBankImport.class.php @@ -76,7 +76,7 @@ class modBankImport extends DolibarrModules $this->editor_squarred_logo = ''; // Must be image filename into the module/img directory followed with @modulename. Example: 'myimage.png@bankimport' // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z' - $this->version = '2.7'; + $this->version = '2.8'; // Url to the file with your last numberversion of this module //$this->url_last_version = 'http://www.example.com/versionmodule.txt';