tampermonkey/idea/idea-edi-tim.user.js
2025-12-15 19:42:21 +01:00

319 lines
13 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ==UserScript==
// @name IDEAERP - Dodaj sekcję EMMA z TIM EDI
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Dodaje sekcję "EMMA" do menu głównego z funkcjonalnością generowania plików EDI dla TIM. Po kliknięciu otwiera się modal z polem do wprowadzenia numeru zamówienia i wysyłania danych do serwera TIM EDI. Automatyczna konwersja liter na wielkie.
// @match https://emma.ideaerp.pl/web*
// @icon https://emma.ideaerp.pl/web/image/res.company/1/favicon/
// @downloadURL https://n8n.emma.net.pl/webhook/edi-tim
// @updateURL https://n8n.emma.net.pl/webhook/edi-tim
// @grant none
// ==/UserScript==
/* ========================OPIS==============================
WERSJA 1.0 - Integracja z TIM EDI + Automatyczne aktualizacje
CEL SKRYPTU:
- Dodanie sekcji "EMMA" do menu głównego IDEAERP
- Integracja z systemem TIM EDI do generowania plików
- Umożliwienie wysyłania numerów zamówień do serwera TIM
DZIAŁANIE SKRYPTU:
1. Lokalizuje sekcję menu o ID "209" w systemie IDEAERP
2. Tworzy nową sekcję "EMMA" z elementem "Tim Edi"
3. Po kliknięciu otwiera modal z formularzem
4. Umożliwia wprowadzenie numeru zamówienia
5. Wysyła dane do serwera TIM EDI (https://192.168.0.97:5011/tim/edi)
6. Czyści formularz po udanym wysłaniu
WYMAGANIA TECHNICZNE:
- Dostęp do serwera TIM EDI (192.168.0.97:5011)
- Sekcja menu o data-menu-section="209" w IDEAERP
- Obsługa fetch API w przeglądarce
- Dostęp do serwera aktualizacji (n8n.emma.net.pl/webhook/edi-tim)
- Tampermonkey z obsługą automatycznych aktualizacji
FUNKCJONALNOŚCI:
+ Dodawanie sekcji EMMA do menu głównego
+ Modal z formularzem do wprowadzania numeru zamówienia
+ Automatyczna konwersja liter na wielkie (w czasie rzeczywistym)
+ Zabezpieczenie przed wklejaniem małych liter
+ Walidacja wprowadzonych danych
+ Wysyłanie POST request do serwera TIM EDI
+ Obsługa błędów sieciowych
+ Czyszczenie formularza po wysłaniu
+ Przycisk zamknięcia modala (X)
+ Overlay z efektem przyciemnienia tła
STRUKTURA MODALA:
- Tytuł: "Generuj plik EDI"
- Pole tekstowe z placeholder: "Podaj numer zamówienia"
- Przycisk "Wyślij" (niebieski)
- Przycisk zamknięcia (X w prawym górnym rogu)
- Overlay z półprzezroczystym tłem
ENDPOINT API:
- URL: https://192.168.0.97:5011/tim/edi
- Method: POST
- Content-Type: application/json
- Body: { "Zamówienie": "numer_zamówienia" }
OBSŁUGA BŁĘDÓW:
- Walidacja pustego pola (alert: "Dodaj zamówienia")
- Obsługa błędów sieciowych (alert: "Wystąpił błąd podczas wysyłania danych")
- Logowanie błędów do konsoli
INTEGRACJA Z IDEAERP:
- Wstrzykiwanie sekcji do istniejącego menu
- Umieszczenie sekcji EMMA jako pierwszy element w kontenerze
- Zachowanie stylów i struktury menu IDEAERP
- Obsługa dynamicznego ładowania strony
AUTOMATYCZNE AKTUALIZACJE:
- Serwer aktualizacji: https://n8n.emma.net.pl/webhook/edi-tim
- Tampermonkey automatycznie sprawdza dostępność nowych wersji
- Jednoklikowa aktualizacja bez konieczności ręcznego pobierania
- Zachowanie ustawień użytkownika podczas aktualizacji
- Kompatybilność z systemem n8n do zarządzania wersjami
CHANGELOG:
v1.0 (2024) - AUTOMATYCZNE AKTUALIZACJE
- Dodano @downloadURL i @updateURL wskazujące na n8n.emma.net.pl/webhook/edi-tim
- Integracja z systemem n8n do zarządzania wersjami skryptu
- Automatyczne sprawdzanie i pobieranie aktualizacji przez Tampermonkey
- Dokumentacja procesu aktualizacji w sekcji OPIS
- Podwyższenie numeru wersji do 1.0 (stabilna wersja)
v0.9 (2024) - AUTOMATYCZNA KONWERSJA LITER
- Dodano automatyczną konwersję liter na wielkie w czasie rzeczywistym
- Zabezpieczenie przed wklejaniem małych liter
- Zachowanie pozycji kursora podczas konwersji
- Dodano CSS text-transform: uppercase dla wizualnej spójności
v0.8 (2024) - PIERWSZA WERSJA
- Dodanie sekcji EMMA do menu głównego
- Implementacja modala z formularzem
- Integracja z serwerem TIM EDI
- Obsługa wysyłania numerów zamówień
- Walidacja danych wejściowych
- Obsługa błędów sieciowych
- Czyszczenie formularza po wysłaniu
- Responsywny design modala
- Przycisk zamknięcia modala
============================================================ */
(function() {
'use strict';
// ——— Funkcja główna: dodawanie sekcji EMMA do menu ———
function addEmmaSection() {
var targetSection = document.querySelector('div.i_secondary_menu__section[data-menu-section="209"]');
if (!targetSection) {
setTimeout(addEmmaSection, 500);
return;
}
if (document.querySelector('div.i_secondary_menu__section[data-menu-section="1248"]')) {
attachPopupListener();
return;
}
var newSectionHtml = `
<div class="i_secondary_menu__section folded" data-menu-section="1248">
<a href="#" class="i_secondary_menu__toggle o_menu_header_lvl_1" data-menu-xmlid="ideaerp_base.i7_base_sale_order_folders_main_menu" data-display="static" role="button" aria-expanded="false">
EMMA
</a>
<ul class="i_secondary_menu__content" role="menu">
<li>
<a role="menuitem" href="#" class="dropdown-item o_menu_entry_lvl_2" id="timEdiLink">
<span>Tim Edi</span>
</a>
</li>
</ul>
</div>
`;
var tempDiv = document.createElement('div');
tempDiv.innerHTML = newSectionHtml.trim();
var newSection = tempDiv.firstElementChild;
// Wstawiamy sekcję jako pierwszy element w kontenerze
var parent = targetSection.parentNode;
parent.insertBefore(newSection, parent.firstChild);
console.log("Dodano sekcję EMMA z TIM EDI do menu jako pierwszy element.");
attachPopupListener();
}
// ——— Obsługa kliknięć: podpięcie event listenera do linku TIM EDI ———
function attachPopupListener() {
var timEdiLink = document.getElementById('timEdiLink');
if (timEdiLink) {
timEdiLink.addEventListener('click', function(e) {
e.preventDefault();
showPopup();
});
}
}
// ——— Tworzenie i wyświetlanie modala z formularzem TIM EDI ———
function showPopup() {
var overlay = document.getElementById('edi-popup-overlay');
if (!overlay) {
overlay = document.createElement('div');
overlay.id = 'edi-popup-overlay';
Object.assign(overlay.style, {
position: 'fixed',
top: '0',
left: '0',
right: '0',
bottom: '0',
background: 'rgba(0, 0, 0, 0.6)',
zIndex: '10000',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
});
var modal = document.createElement('div');
modal.id = 'edi-popup';
Object.assign(modal.style, {
background: '#fff',
borderRadius: '8px',
padding: '20px',
width: '320px',
boxSizing: 'border-box',
boxShadow: '0 2px 10px rgba(0,0,0,0.2)',
position: 'relative',
fontFamily: 'Arial, sans-serif'
});
// ——— Przycisk zamknięcia modala (X w prawym górnym rogu) ———
var closeButton = document.createElement('button');
closeButton.id = 'edi-close';
closeButton.textContent = '×';
Object.assign(closeButton.style, {
position: 'absolute',
top: '1px',
right: '5px',
background: 'transparent',
border: 'none',
fontSize: '22px',
cursor: 'pointer',
color: '#888'
});
closeButton.addEventListener('click', function() {
overlay.style.display = 'none';
});
modal.appendChild(closeButton);
// ——— Tytuł modala ———
var title = document.createElement('h4');
title.textContent = 'Generuj plik EDI';
Object.assign(title.style, {
margin: '20px 0 15px 0',
fontSize: '16px',
color: '#888'
});
modal.appendChild(title);
// ——— Pole tekstowe do wprowadzania numeru zamówienia ———
var input = document.createElement('input');
input.type = 'text';
input.id = 'order-number';
input.placeholder = 'Podaj numer zamówienia';
Object.assign(input.style, {
width: '100%',
padding: '8px',
marginBottom: '15px',
border: '1px solid #ccc',
borderRadius: '4px',
fontSize: '14px',
textTransform: 'uppercase' // Automatyczna konwersja na wielkie litery
});
// ——— Zabezpieczenie: automatyczna konwersja na wielkie litery ———
input.addEventListener('input', function(e) {
var cursorPosition = e.target.selectionStart;
var originalValue = e.target.value;
var upperValue = originalValue.toUpperCase();
// Aktualizujemy wartość tylko jeśli nastąpiła zmiana
if (originalValue !== upperValue) {
e.target.value = upperValue;
// Przywracamy pozycję kursora
e.target.setSelectionRange(cursorPosition, cursorPosition);
}
});
// ——— Dodatkowe zabezpieczenie dla wklejania tekstu ———
input.addEventListener('paste', function(e) {
setTimeout(function() {
var cursorPosition = input.selectionStart;
var originalValue = input.value;
var upperValue = originalValue.toUpperCase();
if (originalValue !== upperValue) {
input.value = upperValue;
input.setSelectionRange(cursorPosition, cursorPosition);
}
}, 0);
});
modal.appendChild(input);
// ——— Przycisk wysyłania danych do serwera TIM EDI ———
var button = document.createElement('button');
button.id = 'edi-submit';
button.textContent = 'Wyślij';
Object.assign(button.style, {
padding: '10px 20px',
fontSize: '14px',
background: '#007bff',
color: '#fff',
border: 'none',
borderRadius: '4px',
cursor: 'pointer'
});
button.addEventListener('click', function() {
// ——— Walidacja danych wejściowych ———
var orderNumber = input.value.trim();
if (!orderNumber) {
alert("Dodaj zamówienia");
return;
}
// ——— Wysyłanie danych do serwera TIM EDI ———
fetch('https://192.168.0.97:5011/tim/edi', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ "Zamówienie": orderNumber })
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
// ——— Obsługa sukcesu: czyszczenie formularza i zamknięcie modala ———
console.log('Sukces:', data);
input.value = "";
overlay.style.display = 'none';
})
.catch((error) => {
// ——— Obsługa błędów sieciowych ———
console.error('Error:', error);
alert("Wystąpił błąd podczas wysyłania danych.");
});
});
modal.appendChild(button);
overlay.appendChild(modal);
document.body.appendChild(overlay);
} else {
overlay.style.display = 'flex';
}
}
// ——— Inicjalizacja: uruchomienie po załadowaniu strony ———
window.addEventListener('load', addEmmaSection);
})();