// ==UserScript== // @name IDEAERP - Rejestracja Płatności // @namespace http://tampermonkey.net/ // @version 1.0 // @description Dodano kopiowanie kwoty w oknie rejestracji płatności // @match https://emma.ideaerp.pl/web* // @icon https://emma.ideaerp.pl/web/image/res.company/1/favicon/ // @downloadURL https://n8n.emma.net.pl/webhook/idea-payment-register // @updateURL https://n8n.emma.net.pl/webhook/idea-payment-register // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_registerMenuCommand // ==/UserScript== /* ========================OPIS============================== WERSJA 1.0 - Kopiowanie kwoty płatności DZIAŁANIE SKRYPTU: - Wykrywa okno modalne "Rejestruj płatność" - Dodaje ikonę kopiowania (⧉) przy polu "Kwota" (amount) - Kliknięcie kopiuje wartość do schowka - Obsługa błędów i logowanie CHANGELOG: v1.0 (2024) - PIERWSZA WERSJA - Dodano obsługę okna modalnego - Dodano kopiowanie pola amount - Stylizacja zgodna z innymi skryptami ============================================================ */ (function () { 'use strict'; // ——— Style CSS ——— GM_addStyle(` /* Kopiowanie – ikona tuż za liczbą (inline), mniejsza, pomarańczowa */ .tm-copyable-icon { cursor: copy; display: inline-block; margin-left: 8px; font-size: 14px; line-height: 1; color: #ff9800; opacity: .75; vertical-align: middle; transition: opacity .15s ease; } .tm-copyable-icon:hover { opacity: 1; } .tm-copied { color: #4caf50 !important; /* Zielony po skopiowaniu */ } `); // ——— Schowek ——— async function tmCopyToClipboard(text) { try { await navigator.clipboard.writeText(text); return true; } catch (err) { console.error('[Tampermonkey] Clipboard API failed, trying fallback', err); try { const ta = document.createElement('textarea'); ta.value = text; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); return true; } catch (e) { console.error('[Tampermonkey] Fallback copy failed', e); return false; } } } // ——— Główna logika ——— function processModal(modal) { if (modal.dataset.tmProcessed) return; // Sprawdź czy to modal płatności const title = modal.querySelector('.modal-title'); const isPaymentModal = title && (title.textContent.includes('Rejestruj płatność') || title.textContent.includes('Register Payment')); if (!isPaymentModal) { // Jeśli nie ma tytułu, sprawdzamy czy są pola specyficzne dla płatności if (!modal.querySelector('input[name="amount"]')) return; } console.log('[Tampermonkey] Przetwarzanie modalu płatności...'); // Lista pól do obsłużenia const fieldsToProcess = [ { name: 'amount', label: 'Kwota' }, { name: 'amount_div', label: 'Kwota' }, // Fallback dla struktury z amount_div { name: 'payment_date', label: 'Data płatności' }, { name: 'communication', label: 'Notatka' }, { name: 'ref', label: 'Referencja' } ]; fieldsToProcess.forEach(field => { // Priorytet dla inputa - szukamy najpierw inputa let element = modal.querySelector(`input[name="${field.name}"]`); // Jeśli nie ma inputa, szukamy div lub span if (!element) { element = modal.querySelector(`div[name="${field.name}"], span[name="${field.name}"]`); } if (element) { console.log(`[Tampermonkey] Znaleziono pole ${field.name}:`, element); addCopyIcon(element, field.label); // Dla pola kwoty dodaj dodatkowy wiersz z VAT if (field.name === 'amount' || field.name === 'amount_div') { addVatRow(element, modal); } } }); modal.dataset.tmProcessed = '1'; } function addVatRow(amountElement, modal) { // Znajdź wiersz tabeli (tr) zawierający pole kwoty const amountRow = amountElement.closest('tr'); if (!amountRow) return; // Sprawdź czy wiersz VAT już istnieje if (amountRow.nextElementSibling && amountRow.nextElementSibling.classList.contains('tm-vat-row')) return; // Ustal element z wartością (input) - priorytet dla inputa wewnątrz kontenera let valueElement = amountElement; if (amountElement.tagName !== 'INPUT' && amountElement.querySelector('input')) { valueElement = amountElement.querySelector('input'); } const getAmountValue = () => { let valStr = ''; if (valueElement.tagName === 'INPUT') { valStr = valueElement.value; } else { valStr = valueElement.textContent; } // Używamy tej samej logiki czyszczenia co przy kopiowaniu valStr = valStr.replace(/[^\d,.-]/g, '').replace(',', '.'); return parseFloat(valStr) || 0; }; // Oblicz VAT (Brutto -> VAT) // Wzór: VAT = Brutto * 23 / 123 const calculateVat = (val) => { if (!val) return '0,00'; const vat = (val * 23) / 123; return vat.toFixed(2).replace('.', ','); }; const amountVal = getAmountValue(); const calculatedValue = calculateVat(amountVal); // Stwórz nowy wiersz const tr = document.createElement('tr'); tr.className = 'tm-vat-row'; tr.innerHTML = `