// ==UserScript== // @name Плашка оператора (Новые договоры) // @namespace http://192.168.254.38/ // @version 1.0.0 // @description Показывает плашку с именем оператора из папки "Новые договоры" // @author yasu // @match https://admin2.gtn.ru/diagnostics/index.php?*search=* // @grant GM_xmlhttpRequest // @connect 192.168.254.38 // @updateURL http://192.168.254.38:8766/script.user.js // @downloadURL http://192.168.254.38:8766/script.user.js // ==/UserScript== (function() { 'use strict'; const BANNER_ID = 'contract-operator-banner'; let bannerShownOnThisPage = false; function getContractNumberFromUrl() { const url = window.location.href; const match = url.match(/[?&]search=(\d+)/); return match ? match[1] : null; } function checkBanner(contractNumber, callback) { GM_xmlhttpRequest({ method: 'GET', url: `http://192.168.254.38:8766/get-banner?contract=${contractNumber}`, timeout: 5000, onload: function(response) { try { callback(null, JSON.parse(response.responseText)); } catch(e) { callback(e, null); } }, onerror: callback, ontimeout: function() { callback(new Error('Timeout'), null); } }); } function closeBanner(contractNumber, callback) { GM_xmlhttpRequest({ method: 'POST', url: 'http://192.168.254.38:8766/close-banner', headers: { 'Content-Type': 'application/json' }, data: JSON.stringify({ contract_number: contractNumber }), timeout: 5000, onload: function() { callback(null); }, onerror: callback }); } function formatDate(dateString) { if (!dateString) return ''; const parts = dateString.split(' '); if (parts.length < 2) return dateString; const dateParts = parts[0].split('-'); if (dateParts.length === 3) { return `${dateParts[2]}.${dateParts[1]}.${dateParts[0]} ${parts[1].substring(0, 5)}`; } return dateString; } function showBanner(operatorName, contractNumber, receivedDate) { const oldBanner = document.getElementById(BANNER_ID); if (oldBanner) oldBanner.remove(); const banner = document.createElement('div'); banner.id = BANNER_ID; banner.style.cssText = ` position: fixed; top: 10px; right: 10px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 18px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.2); z-index: 99999; font-family: Arial, sans-serif; font-size: 14px; cursor: pointer; min-width: 200px; border-left: 3px solid #ffd700; `; banner.innerHTML = `
📋 ${operatorName}
Договор №${contractNumber}
${formatDate(receivedDate) ? `
${formatDate(receivedDate)}
` : ''}
×
`; banner.onclick = () => { banner.remove(); closeBanner(contractNumber, function(err) { if (err) console.error('Ошибка при закрытии плашки:', err); else console.log(`Плашка для договора ${contractNumber} закрыта`); }); }; document.body.appendChild(banner); bannerShownOnThisPage = true; } function init() { if (bannerShownOnThisPage) return; const contractNumber = getContractNumberFromUrl(); if (!contractNumber) return; checkBanner(contractNumber, function(err, data) { if (err || !data || data.show !== true) return; showBanner(data.operator_name, data.contract_number, data.received_date); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();