* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. */ /** * JavaScript for browser push notifications about incoming payments * Loaded on every Dolibarr page via module_parts['js'] */ // Define MIME type if (!defined('NOTOKENRENEWAL')) { define('NOTOKENRENEWAL', '1'); } if (!defined('NOREQUIREMENU')) { define('NOREQUIREMENU', '1'); } if (!defined('NOREQUIREHTML')) { define('NOREQUIREHTML', '1'); } if (!defined('NOREQUIREAJAX')) { define('NOREQUIREAJAX', '1'); } $res = 0; if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; } $tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { $i--; $j--; } if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; } if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; } if (!$res && file_exists("../../main.inc.php")) { $res = @include "../../main.inc.php"; } if (!$res && file_exists("../../../main.inc.php")) { $res = @include "../../../main.inc.php"; } header('Content-Type: application/javascript; charset=UTF-8'); header('Cache-Control: max-age=3600'); if (!isModEnabled('bankimport') || empty($user->id) || !$user->hasRight('bankimport', 'read')) { echo '/* bankimport: no access */'; exit; } $checkUrl = dol_buildpath('/bankimport/ajax/checkpending.php', 1); $confirmUrl = dol_buildpath('/bankimport/confirm.php', 1).'?mainmenu=bank&leftmenu=bankimport'; $checkInterval = 5 * 60 * 1000; // 5 Minuten ?> (function() { 'use strict'; var STORAGE_KEY = 'bankimport_last_pending'; var CHECK_URL = ; var CONFIRM_URL = ; var CHECK_INTERVAL = ; // Erst nach Seitenload starten if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } function init() { // Berechtigung anfragen beim ersten Mal if ('Notification' in window && Notification.permission === 'default') { // Dezent um Berechtigung bitten - nicht sofort, sondern nach 10 Sekunden setTimeout(function() { Notification.requestPermission(); }, 10000); } // Sofort prüfen checkPending(); // Regelmäßig prüfen setInterval(checkPending, CHECK_INTERVAL); } function checkPending() { var xhr = new XMLHttpRequest(); xhr.open('GET', CHECK_URL, true); xhr.timeout = 15000; xhr.onload = function() { if (xhr.status !== 200) return; try { var data = JSON.parse(xhr.responseText); } catch(e) { return; } var lastKnown = parseInt(localStorage.getItem(STORAGE_KEY) || '0', 10); var currentPending = data.pending || 0; var incoming = data.incoming || 0; var incomingTotal = data.incoming_total || 0; // Neue Buchungen seit letztem Check? if (currentPending > lastKnown && currentPending > 0) { var newCount = currentPending - lastKnown; if (incoming > 0) { showNotification( 'Zahlungseingang', incoming + ' Zahlungseingang' + (incoming > 1 ? 'e' : '') + ' (' + formatAmount(incomingTotal) + ' €)\nBestätigung erforderlich', 'incoming' ); } else { showNotification( 'Bankimport', newCount + ' neue Buchung' + (newCount > 1 ? 'en' : '') + ' warten auf Zuordnung', 'pending' ); } } // Aktuellen Stand merken localStorage.setItem(STORAGE_KEY, currentPending.toString()); }; xhr.onerror = function() {}; xhr.send(); } function showNotification(title, body, type) { if (!('Notification' in window)) return; if (Notification.permission !== 'granted') return; var icon = type === 'incoming' ? '/theme/common/mime/money.png' : '/theme/common/mime/doc.png'; var notification = new Notification(title, { body: body, icon: icon, tag: 'bankimport-' + type, requireInteraction: true }); notification.onclick = function() { window.focus(); window.location.href = CONFIRM_URL; notification.close(); }; // Nach 30 Sekunden automatisch schließen setTimeout(function() { notification.close(); }, 30000); } function formatAmount(amount) { return parseFloat(amount).toFixed(2).replace('.', ',').replace(/\B(?=(\d{3})+(?!\d))/g, '.'); } })();