Greasy Fork is available in English.

action

Ajouter plusieurs boutons de gel pour différentes durées pendant les heures de bureau

// ==UserScript==
// @name         action
// @namespace    http://tampermonkey.net/
// @version      0.19
// @description  Ajouter plusieurs boutons de gel pour différentes durées pendant les heures de bureau
// @author       Tony Gargaud, Florian Villeret, Clément Bahuaud
// @match        *://*/*
// @match        https://tck.mydstny.fr/Ticket/*
// @match        https://tck.mydstny.fr/Secure/Tickets/Ticket/Detail?ticketId=*
// @match        https://tck.mydstny.fr/Tickets
// @match        https://extranet.kosc-telecom.fr/diagnostics/*
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
// @require      https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery-ui-timepicker-addon/1.6.3/jquery-ui-timepicker-addon.min.js
// ==/UserScript==

(function() {


        const currentURL = window.location.href;

    // extration des infos d'ouverture de ticket fournisseur

    // Prend la ref de liaison
    function getServiceStatus(element) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: element.href,
            onload: function(response) {
                const parser = new DOMParser();
                const doc = parser.parseFromString(response.responseText, 'text/html');
                let tdList = doc.querySelectorAll('td');
                let state = null;

                for (let i = 0; i < tdList.length - 1; i++) {
                    if (tdList[i].textContent.trim() === 'Identifiant') {
                        state = tdList[i + 1].textContent.trim();
                        break;
                    }
                }

                if (state) {
                    console.log(state);
                    GM_setValue("RefLiaison", state);
                }
            }
        });
    }
// extration des infos
    function extraitlesdonnees() {

        let element = document.getElementById("main-questionnaire-container");
        if (element) {
            let dataValues = element.getAttribute("data-values");
            let parsedData = JSON.parse(dataValues);

            let contactPhone = parsedData["contact_sur_site_telephone"];
            // Assurez-vous d'extraire correctement les heures d'ouverture depuis votre source de données
            let openingHours = `${parsedData["horaires_matin"]} / ${parsedData["horaires_apres_midi"]}`;

            GM_setValue("contactPhone", contactPhone);
            GM_setValue("openingHours", openingHours); // Sauvegarde des heures d'ouverture

        }
    }

// FIN des extractions
// FIN des extractions
// FIN des extractions

//FONCTION POUR OUVERTURE LIEN ORANGE


    //CHECK DES LIENS

       function checkDSL() {
        // Recherche du formulaire par son identifiant textuel dans la page
        const formText = Array.from(document.querySelectorAll('td')).find(td => td.textContent.includes('FRM-DSLACCESSONLYETH'));
        return formText !== undefined; // Retourne true si le texte est trouvé, sinon false
    }

           function checkFTTH() {
        // Recherche du formulaire par son identifiant textuel dans la page
        const formText = Array.from(document.querySelectorAll('td')).find(td => td.textContent.includes('103_FRM_ARIANE_PBO'));
        return formText !== undefined; // Retourne true si le texte est trouvé, sinon false
    }


    // LISTE DES ACTIONS EN FONCTION DES LIENS

   function LienOrangeFTTH() {

     if (!checkFTTH()) {
            console.log('Lien FTTH non trouvé ❌');
            return; // Arrête l'exécution si le formulaire n'est pas présent
        }
       console.log('Lien FTTH trouvé ✅');
       // Numéro de téléphone
           let contactPhone = GM_getValue('contactPhone');
    if (contactPhone) {
        const inputField = document.querySelector('input[name="INFO_CONTACT_CLI"]');
        if (inputField) {
            inputField.value = contactPhone;
        }
    }

    // Horaires d'ouverture
    const openingHours = GM_getValue('openingHours');
    const openingHoursField = document.querySelector('input[name="INFO_HEUR_OUV_SITE"]');
    if (openingHoursField && openingHours) {
        openingHoursField.value = openingHours;
    }


        // Cocher les boutons radio
        document.querySelector('input[name="INFO_PRELOC"][value="PRELOC_CLI"]').checked = true;
        document.querySelector('input[name="INFO_ALIM"][value="VOYALIMBOX_VERTFIX"]').checked = true;
        document.querySelector('input[name="INFO_FIB"][value="VOYFIB_ETEINT"]').checked = true;
        document.querySelector('input[name="INFO_INT"][value="VOYINT_ETEINT"]').checked = true;
        document.querySelector('input[name="INFO_ALIM_ONT"][value="VOYALIMONT_VERTFIX"]').checked = true;
        document.querySelector('input[name="DEFECT_LOC_DEFAUT"][value="ONT_KO"]').checked = true;
        document.querySelector('input[name="forcing"][value="true"]').checked = true;


        // Cocher le checkbox
        document.querySelector('input[name="DEFECT_SYNCH_KO"]').checked = true;

        // Écrire dans le textarea
        const descriptionText = "Bonjour,\nNous constatons un défaut au niveau de l'ont, pouvez-vous intervenir ?";
        const descriptionTextarea = document.querySelector('textarea[name="description"]');
        if (descriptionTextarea) {
            descriptionTextarea.value = descriptionText;
        }
    }

function LienOrangeDSL() {
    if (!checkDSL()) {
        console.log('Lien DSL non trouvé ❌');
        return; // Arrête l'exécution si le formulaire n'est pas présent
    }
    console.log('Lien DSL trouvé ✅');

    // Numéro de téléphone
    let contactPhone = GM_getValue('contactPhone');
    if (contactPhone) {
        const inputField = document.querySelector('input[name="INFO_CONTACT_CLI"]');
        if (inputField) {
            inputField.value = contactPhone;
            GM_setValue('contactPhone', null); // Réinitialiser la clé 'contactPhone' à null
        }
    }

    // Horaires d'ouverture
    const openingHours = GM_getValue('openingHours');
    const openingHoursField = document.querySelector('input[name="INFO_HEUR_OUV_SITE"]');
    if (openingHoursField && openingHours) {
        openingHoursField.value = openingHours;
        GM_setValue('openingHours', null); // Réinitialiser la clé 'openingHours' à null
    }

    // Cocher les boutons radio
    document.querySelector('input[name="INFO_SECUR_SITE"][value="OUI"]').checked = true;
    document.querySelector('input[name="INFO_PRELOC"][value="PRELOC_CLI"]').checked = true;
    document.querySelector('input[name="forcing"][value="true"]').checked = true;

    // Cocher le checkbox
    document.querySelector('input[name="DEFECT_PLUS_SYNCH"]').checked = true;

    // Écrire dans le textarea
    const descriptionText = "Bonjour,\nNous constatons un défaut de ligne, pouvez-vous intervenir ?";
    const descriptionTextarea = document.querySelector('textarea[name="description"]');
    if (descriptionTextarea) {
        descriptionTextarea.value = descriptionText;
    }
}

//FIN FONCTION POUR OUVERTURE LIEN ORANGE
//FIN FONCTION POUR OUVERTURE LIEN ORANGE
//FIN FONCTION POUR OUVERTURE LIEN ORANGE
//FIN FONCTION POUR OUVERTURE LIEN ORANGE


    if (window.location.href.includes('https://tck.mydstny.fr/Ticket')) {

    // Styles CSS personnalisés pour les pop-ups
    // Styles CSS personnalisés pour les pop-ups
    GM_addStyle(`
        .ui-datepicker, .ui-dialog, .ui-timepicker-container {
            font-family: Arial, sans-serif;
            background: #ffffff;
            border: 1px solid #dddddd;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
        }
        .ui-datepicker-header, .ui-dialog-titlebar {
            background: #007bff;
            color: white;
            border: none;
        }
        .ui-datepicker-prev-hover, .ui-datepicker-next-hover, .ui-dialog-titlebar-close:hover {
            filter: brightness(85%);
        }
        .ui-state-default, .ui-button {
            background: #f8f9fa;
            border: 1px solid #ddd;
            color: #333;
        }
        .ui-state-default:hover, .ui-state-hover, .ui-button:hover {
            background: #007bff;
            color: white;
            border-color: #0056b3;
        }
        .ui-state-active, .ui-button:active {
            background: #0056b3;
            color: white;
        }
        .ui-state-highlight {
            background: #28a745;
            color: white;
        }
        /* Supprimer les éléments inutiles */
.ui-timepicker-second, .ui-timepicker-millisec, .ui-timepicker-microsec, .ui-timepicker-timezone {
    display: none;
}

/* Styles pour le fond et le texte des inputs et dropdowns */
.ui-timepicker-div .ui-widget-header {
    background: #1c87c9;
    color: white;
    border: none;
}

.ui-timepicker-div dl {
    text-align: left;
    padding: 5px 0;
}

.ui-timepicker-div dl dt {
    float: left;
    clear: left;
    padding: 0 0 0 5px;
}

.ui-timepicker-div dl dd {
    margin: 0 10px 10px 45%;
}

.ui-timepicker-div td {
    font-size: 90%;
}

/* Styles pour les boutons */
.ui-timepicker-div .ui_tpicker_unit_hide,
.ui-timepicker-div .ui_tpicker_time_hide {
    display: none;
}

.ui-timepicker-div .ui_tpicker_time {
    margin-left: 0;
}

.ui-timepicker-div .ui_tpicker_time_label {
    position: absolute;
    top: 3px;
    margin-left: 0;
    padding-left: 5px;
}

.ui-timepicker-div .ui_tpicker_hour .ui_tpicker_hour_slider,
.ui-timepicker-div .ui_tpicker_minute .ui_tpicker_minute_slider {
    width: 100%;
}

.ui-button {
    text-align: center;
    border: 1px solid #ddd;
    background-color: #f7f7f7;
    color: #333;
}

.ui-button:hover {
    border: 1px solid #ccc;
    background-color: #e6e6e6;
    color: #333;
}

.ui-button:active {
    background-color: #ccc;
}

/* Styles pour le slider (si utilisé) */
.ui-slider-horizontal {
    height: 0.8em;
}

.ui-slider-horizontal .ui-slider-handle {
    top: -.3em;
    margin-left: -.6em;
}

.ui-slider .ui-slider-handle {
    cursor: pointer;
    -webkit-border-radius: 0;
    border-radius: 0;
    background-color: #5BC0DE;
}
         #timepickerDialog {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        display: flex;
        flex-wrap: wrap;
        justify-content: start; /* Aligner les boutons au début du conteneur */
        align-items: center; /* Centre les boutons verticalement */
        padding: 10px;
        background: white;
        border: 1px solid #ddd;
        box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.5);
        z-index: 1002;
        width: auto; /* Permet au conteneur de s'ajuster en fonction de la largeur des boutons */
        max-width: 300px; /* Définir une largeur maximale suffisante pour deux boutons */
        box-sizing: border-box;
    }


    /* Styles pour les boutons de sélection de l'heure */
   .time-button {
        width: calc(50% - 10px); /* 50% pour deux boutons par ligne, -10px pour ajuster l'espace de la marge */
        margin: 5px; /* Marge entre les boutons */
        padding: 5px; /* Padding à l'intérieur des boutons */
        font-size: 0.9em; /* Taille de la police */
        text-align: center;
        border: 1px solid #ccc;
        background-color: #f7f7f7;
        cursor: pointer;
        display: inline-block; /* S'assurer que les boutons sont côte à côte */
        box-sizing: border-box;
    }

    .time-button:hover {
        background-color: #e6e6e6;
    }
    `);
    }
//FIN CSS


    // Gestionnaire d'événement pour les raccourcis clavier
    document.addEventListener('keydown', function(e) {
        if (e.altKey && e.key === 'p') {
            let ipAddress = prompt("Entrez l'adresse IP à tester:");
            if (ipAddress) testPorts(ipAddress);
        } else if (e.altKey && e.key === 'k') {
            handleShiftK();
        } else if (e.altKey && e.key === 'j') {
            askForNumber();
        }
    });

    // Fonctions spécifiques pour les raccourcis clavier
    function handleShiftK() {
        let selectedText = window.getSelection().toString();
        if (/^[\d .]+$/.test(selectedText)) {
            let formattedNumber = selectedText.replace(/[ .]/g, '');
            navigator.clipboard.writeText(formattedNumber)
                .then(() => console.log('Numéro copié dans le presse-papiers:', formattedNumber))
                .catch(err => console.error('Erreur lors de la copie:', err));
        } else {
            console.log('Le texte sélectionné n\'est pas un numéro.');
        }
    }

    // Fonction pour demander le numéro via une popup
    function askForNumber() {
        var numero = prompt("Entrez le numéro à rechercher :");
        if (numero !== null && numero.trim() !== '') {
            // Si l'utilisateur entre un numéro valide, ouvrir le site avec le numéro en tant que paramètre
            openSite(numero);
        }
    }

    // Fonction pour ouvrir le site avec le numéro en tant que paramètre
    function openSite(numero) {
        var siteUrl = 'https://jupiter.mydstny.fr/GestionDesNumeros/Liste';
        // Ajouter le numéro comme paramètre à l'URL du site
        siteUrl += '?number=' + encodeURIComponent(numero);
        // Ouvrir la page dans une nouvelle fenêtre
        window.open(siteUrl, '_blank');
        // Appliquer la recherche sur la nouvelle fenêtre
    }
      if (window.location.href.includes('https://jupiter.mydstny.fr/Secure/dbnum/list')) {
                // Fonction pour extraire le numéro de l'URL
        const params = new URLSearchParams(window.location.search);
        const numero = params.get('number'); // Récupère la valeur du paramètre 'number'
        if (numero) {
            console.log('Numéro extrait:', numero);
        // Mettre à jour le champ value de l'input
                document.getElementById('tx_number').value = numero;
                // Lancer la recherche en cliquant sur le bouton "Rechercher"
                document.querySelector("[name='search']").click();
        } else {
            console.log('Numéro non trouvé dans l\'URL');
        }

        

            }
           if (window.location.href.includes('https://jupiter.mydstny.fr/GestionDesNumeros/Liste')) {

                              // Fonction pour extraire le numéro de l'URL
        const params = new URLSearchParams(window.location.search);
        const numero = params.get('number'); // Récupère la valeur du paramètre 'number'
        if (numero) {
            console.log('Numéro extrait:', numero);
        // Mettre à jour le champ value de l'input
                document.getElementById('tx_number').value = numero;
                // Lancer la recherche en cliquant sur le bouton "Rechercher"
                document.querySelector("[name='search']").click();
        } else {
            console.log('Numéro non trouvé dans l\'URL');
        }

            }

        function testPorts(ip) {
        const ports = [444, 48443, 443, 80, 8443];
        ports.forEach(port => {
            const protocol = (port === 80 || port === 8443) ? 'http' : 'https';
            const url = `${protocol}://${ip}:${port}`;

            GM_xmlhttpRequest({
                method: "GET",
                url: url,
                timeout: 5000, // Temps en ms avant l'abandon de la requête
                onload: function(response) {
                    if (response.status >= 200 && response.status < 400) {
                        console.log(`Port ouvert trouvé : ${url}`);
                        window.open(url, '_blank');
                    } else {
                        console.log(`Port fermé ou inaccessible : ${url}`);
                    }
                },
                onerror: function() {
                    console.log(`Erreur lors de la connexion (considérée comme un succès) à : ${url}`);
                    window.open(url, '_blank'); // Ouvre l'URL même en cas d'erreur
                },
                ontimeout: function() {
                    console.log(`Temps de connexion dépassé pour : ${url}`);
                }
            });
        });
    }

    // Vérifier si l'URL actuelle correspond au modèle attendu
    if (window.location.href.match(/https:\/\/jupiter\.mydstny\.fr\/GestionDesNumeros\/Liste\?number=\d+/)) {
        // Extraire le numéro de l'URL
        var numeroFromUrl = window.location.href.match(/\?number=(\d+)/)[1];
        // Mettre à jour le champ value de l'input
        document.getElementById('tx_number').value = numeroFromUrl;
        // Lancer la recherche en cliquant sur le bouton "Rechercher"
        document.querySelector("[name='search']").click();
    }



if (window.location.href.includes('https://tck.mydstny.fr/Tickets')) {


        // Function to create buttons
        function createButton(id, text) {
            var button = document.createElement('button');
            button.type = 'submit';
            button.className = 'btn btn-gradient';
            button.id = id;
            button.textContent = text;
            button.style.margin = '5px';
            return button;
        }

        // Function to open links based on time criteria
        function openLinks(timeLimit) {
            var rows = document.querySelectorAll('tbody[data-tickets="all"] tr');
            rows.forEach(function(row) {
                var durationSpan = row.querySelector('td.text-center span[data-duration]');
                var duration = parseInt(durationSpan.getAttribute('data-duration'), 10);
                if (durationSpan && duration < 0 && duration >= timeLimit) {
                    var ticketLink = Array.from(row.querySelectorAll('td a[href]')).find(link => link.getAttribute('href').includes('Ticket'));
                    if (ticketLink) {
                        window.open(ticketLink.getAttribute('href'), '_blank');
                    }
                }
            });
        }




        // Find the target div
        var targetDiv = document.querySelector('.col-md-6');
        if (targetDiv) {
            // Add buttons to the target div
            targetDiv.appendChild(createButton('button-5hr', 'Ticket -05h00')).addEventListener('click', function() { openLinks(-18000); });
            targetDiv.appendChild(createButton('button-15hr', 'Ticket -15h00')).addEventListener('click', function() { openLinks(-54000); });
            targetDiv.appendChild(createButton('button-all-negative', 'Ticket négatif')).addEventListener('click', function() { openLinks(-Infinity); });
        }
}
if (window.location.href.includes('https://tck.mydstny.fr/Ticket')) {


    function retrieveRefLiaisonValue() {
        // Sélectionnez l'élément avec la classe "dl-flex"
        var dlElement = document.querySelector('.dl-flex');
        if (!dlElement) {
            console.log("Élément .dl-flex non trouvé.");
            return;
        }
        console.log("Élément .dl-flex trouvé.");

        // Trouver tous les liens dans l'élément avec la classe "dl-flex"
        var links = dlElement.querySelectorAll('a');
        var serLink = null;

        for (var i = 0; i < links.length; i++) {
            var linkText = links[i].textContent.trim();
            // Si le texte du lien commence par "SER" suivi de chiffres
            if (/^SER\d+$/.test(linkText)) {
                serLink = links[i];
                break;
            }
        }

        if (!serLink) {
            console.log("Lien SER non trouvé.");
            return;
        }
        console.log("Lien SER trouvé : " + serLink.href);

        // Utilisez l'URL du lien pour récupérer l'identifiant
        GM_xmlhttpRequest({
            method: "GET",
            url: serLink.href,
            onload: function(response) {
                console.log("Requête GET effectuée sur l'URL : " + serLink.href);

                var parser = new DOMParser();
                var doc = parser.parseFromString(response.responseText, "text/html");

                // Trouvez l'élément qui contient l'identifiant
                var tdElements = doc.querySelectorAll('td');
                var identifiant = null;
                for (var i = 0; i < tdElements.length - 1; i++) {
                    if (tdElements[i].textContent.trim() === "Identifiant") {
                        identifiant = tdElements[i + 1].textContent.trim();
                        break;
                    }
                }

                if (identifiant) {
                    console.log("Identifiant trouvé : " + identifiant);

                    // Accédez à l'URL de la deuxième page avec l'identifiant
                    var secondURL = "https://pdmanager.as48504.oip/mng-edit.php?username=" + encodeURIComponent(identifiant);
                    console.log("Accès à la deuxième URL avec l'identifiant : " + secondURL);

                    GM_xmlhttpRequest({
                        method: "GET",
                        url: secondURL,
                        onload: function(response) {
                            console.log("Requête GET effectuée sur la deuxième URL : " + secondURL);

                            var parser = new DOMParser();
                            var doc = parser.parseFromString(response.responseText, "text/html");

                            // Recherchez la valeur du champ "Ref Liaison"
                            var refLiaisonInput = doc.querySelector('input#reflien');
                            var refLiaison = null;

                            if (refLiaisonInput) {
                                refLiaison = refLiaisonInput.value;
                                console.log("Valeur du champ 'Ref Liaison' trouvée : " + refLiaison);

                                // Créez les éléments pour la valeur de "Ref Liaison"
                                var refLiaisonDtElement = document.createElement('dt');
                                refLiaisonDtElement.textContent = "Ref Liaison";

                                var refLiaisonDdElement = document.createElement('dd');
                                refLiaisonDdElement.textContent = refLiaison;

                                // Ajoutez les éléments de la valeur de "Ref Liaison" à la liste
                                dlElement.appendChild(refLiaisonDtElement);
                                dlElement.appendChild(refLiaisonDdElement);
                            }
                        }
                    });
                }
            }
        });
    }

    // Appel de la fonction principale
    retrieveRefLiaisonValue();

    function performActions7() {
        // Créer l'élément pour le DatePicker
        var $datePicker = $("<div id='datepicker'></div>").appendTo("body");

        // Initialiser le DatePicker
        $datePicker.datepicker({
            dateFormat: "dd/mm/yy",
            onSelect: function(dateText) {
                $datePicker.dialog('close');
                promptForTime(dateText);
            }
        }).dialog({
            modal: true,
            autoOpen: false,
            close: function() { $(this).remove(); }
        });

        // Ouvrir le dialogue manuellement
        $datePicker.dialog('open');
    }

function promptForTime(date) {
    $('#timepickerDialog').remove();

    // Créer un conteneur pour le Timepicker
    var $timePickerContainer = $('<div id="timepickerDialog"></div>').appendTo('body');

    // Créer et ajouter des boutons pour les heures et les demi-heures de 06h00 à 22h00
    for (var i = 6; i <= 22; i++) {
        $('<button>')
            .text(i.toString().padStart(2, '0') + ':00')
            .addClass('time-button')
            .data('time', i.toString().padStart(2, '0') + ':00')
            .on('click', function() {
                var selectedTime = $(this).data('time');
                insertMessage(date, selectedTime, calculateEndTime(selectedTime)); // Utilisez la fonction insertMessage ici
                $('#timepickerDialog').remove(); // Fermez le conteneur après la sélection
            })
            .appendTo($timePickerContainer);

        if (i < 22) {
            $('<button>')
                .text(i.toString().padStart(2, '0') + ':30')
                .addClass('time-button')
                .data('time', i.toString().padStart(2, '0') + ':30')
                .on('click', function() {
                    var selectedTime = $(this).data('time');
                    insertMessage(date, selectedTime, calculateEndTime(selectedTime)); // Utilisez la fonction insertMessage ici également pour les demi-heures
                    $('#timepickerDialog').remove(); // Fermez le conteneur après la sélection
                })
                .appendTo($timePickerContainer);
        }
    }
}

 function validateTime(time, date) {
    // Assurez-vous que l'ID 'heure' est l'ID correct du champ d'heure dans votre formulaire
    $('#heure').val(date + ' ' + time);

    // Fermez le dialogue du sélecteur d'heure après la sélection
    $('#timepickerDialog').remove();
}

    function calculateEndTime(time) {
        let [heureDebut, minute] = time.split(":");
        let heureFin = parseInt(heureDebut) + 2;
        let heureFinFormatted = heureFin.toString().padStart(2, '0') + ":" + minute;
        return heureFinFormatted;
    }

    function insertMessage(date, heure, heureFinText) {
        // Cliquez sur le bouton "Nouveau message"
        let nouveauMessageButton = document.querySelector('button[data-toggle="modal"][data-target="#addPostModal"]');
        if (nouveauMessageButton) {
            nouveauMessageButton.click();
        }

        // Attendre l'ouverture de la fenêtre modale et insérer le texte personnalisé
        setTimeout(() => {
            if (typeof CKEDITOR !== "undefined" && CKEDITOR.instances) {
                for (let editor in CKEDITOR.instances) {
                    if (CKEDITOR.instances.hasOwnProperty(editor)) {
                        CKEDITOR.instances[editor].setData(`Bonjour,<br><br>Nous vous confirmons qu'une intervention est prévue pour le ${date} entre ${heure} et ${heureFinText}.<br>Nous reviendrons vers vous suite à celle-ci.`);
                    }
                }
            }
        }, 2500);
    }

    function waitForJQuery(callback) {
        if (typeof jQuery === "undefined" || typeof jQuery.ui === "undefined") {
            setTimeout(function() {
                waitForJQuery(callback);
            }, 100);
        } else {
            callback();
        }
    }



    function performActions6() {
   GM_setValue('boutonclique', 1);
   extraitlesdonnees();
   const serviceLinkElement = document.querySelector('a[href^="https://psm.mydstny.fr/Service"]');
    if (serviceLinkElement) {
        getServiceStatus(serviceLinkElement);
    }

}

    // fonction relance 1
    function performActions() {
        // Cliquez sur le bouton "Nouveau message"
        let nouveauMessageButton = document.querySelector('button[data-toggle="modal"][data-target="#addPostModal"]');
        if (nouveauMessageButton) {
            nouveauMessageButton.click();
        }

        // Cochez le bouton radio "Public" (attente de l'apparition du bouton radio après avoir cliqué sur "Nouveau message")
        setTimeout(() => {
            let publicRadioButton = document.querySelector('input[type="radio"][id="rd_addPostVisibility_2"]');
            if (publicRadioButton) {
                publicRadioButton.checked = true;
                publicRadioButton.dispatchEvent(new Event('change', { 'bubbles': true }));
            }
        }, 1000);

        // Sélectionnez "En attente retour client" pour "État suivant" et déclenchez l'événement de changement pour afficher les choix du "Questionnaire"
        setTimeout(() => {
            let etatSuivantDropdown = document.getElementById('se_addPostNextState');
            if (etatSuivantDropdown) {
                etatSuivantDropdown.value = "12";
                etatSuivantDropdown.dispatchEvent(new Event('change', { 'bubbles': true }));
            }
        }, 1500);

        // NOTE: Après avoir déclenché l'événement de changement pour "État suivant", le "Questionnaire" devrait être visible. À ce stade, nous pouvons essayer de sélectionner "Réponse" pour le "Questionnaire".
        setTimeout(() => {
            let questionnaireDropdown = document.getElementById('se_addPostFormId');
            if (questionnaireDropdown) {
                questionnaireDropdown.value = "10243";
            }
        }, 2000);


        setTimeout(() => {
            if (typeof CKEDITOR !== "undefined" && CKEDITOR.instances) {
                for (let editor in CKEDITOR.instances) {
                    if (CKEDITOR.instances.hasOwnProperty(editor)) {
                        CKEDITOR.instances[editor].setData("Bonjour,<br><br>Avez-vous un retour à nous fournir ?");
                    }
                }
            }
        }, 2500);
    }

    // Fonction relance 2
    function performActions2() {
        // Cliquez sur le bouton "Nouveau message"
        let nouveauMessageButton = document.querySelector('button[data-toggle="modal"][data-target="#addPostModal"]');
        if (nouveauMessageButton) {
            nouveauMessageButton.click();
        }

        // Cochez le bouton radio "Public" (attente de l'apparition du bouton radio après avoir cliqué sur "Nouveau message")
        setTimeout(() => {
            let publicRadioButton = document.querySelector('input[type="radio"][id="rd_addPostVisibility_2"]');
            if (publicRadioButton) {
                publicRadioButton.checked = true;
                publicRadioButton.dispatchEvent(new Event('change', { 'bubbles': true }));
            }
        }, 1000);

        // Sélectionnez "En attente retour client" pour "État suivant" et déclenchez l'événement de changement pour afficher les choix du "Questionnaire"
        setTimeout(() => {
            let etatSuivantDropdown = document.getElementById('se_addPostNextState');
            if (etatSuivantDropdown) {
                etatSuivantDropdown.value = "12";
                etatSuivantDropdown.dispatchEvent(new Event('change', { 'bubbles': true }));
            }
        }, 1500);

        // NOTE: Après avoir déclenché l'événement de changement pour "État suivant", le "Questionnaire" devrait être visible. À ce stade, nous pouvons essayer de sélectionner "Réponse" pour le "Questionnaire".
        setTimeout(() => {
            let questionnaireDropdown = document.getElementById('se_addPostFormId');
            if (questionnaireDropdown) {
                questionnaireDropdown.value = "10243";
            }
        }, 2000);


        setTimeout(() => {
            if (typeof CKEDITOR !== "undefined" && CKEDITOR.instances) {
                for (let editor in CKEDITOR.instances) {
                    if (CKEDITOR.instances.hasOwnProperty(editor)) {
                        CKEDITOR.instances[editor].setData("Suite à notre précédent post, avez-vous un retour à nous fournir ?<br><br>Dans l'attente d'une réponse de votre part, nous restons à votre disposition pour toute nouvelle demande.");
                    }
                }
            }
        }, 2500);
    }

    // Fonction Ouverture ticket fournisseur
    function performActions3() {
        // Cliquez sur le bouton "Nouveau message"
        let nouveauMessageButton = document.querySelector('button[data-toggle="modal"][data-target="#addPostModal"]');
        if (nouveauMessageButton) {
            nouveauMessageButton.click();
        }

        // Cochez le bouton radio "Public" (attente de l'apparition du bouton radio après avoir cliqué sur "Nouveau message")
        setTimeout(() => {
            let publicRadioButton = document.querySelector('input[type="radio"][id="rd_addPostVisibility_2"]');
            if (publicRadioButton) {
                publicRadioButton.checked = true;
                publicRadioButton.dispatchEvent(new Event('change', { 'bubbles': true }));
            }
        }, 1000);

        // Sélectionnez "En attente retour client" pour "État suivant" et déclenchez l'événement de changement pour afficher les choix du "Questionnaire"
        setTimeout(() => {
            let etatSuivantDropdown = document.getElementById('se_addPostNextState');
            if (etatSuivantDropdown) {
                etatSuivantDropdown.value = "12";
                etatSuivantDropdown.dispatchEvent(new Event('change', { 'bubbles': true }));
            }
        }, 1500);

        // NOTE: Après avoir déclenché l'événement de changement pour "État suivant", le "Questionnaire" devrait être visible. À ce stade, nous pouvons essayer de sélectionner "Réponse" pour le "Questionnaire".
        setTimeout(() => {
            let questionnaireDropdown = document.getElementById('se_addPostFormId');
            if (questionnaireDropdown) {
                questionnaireDropdown.value = "10243";
            }
        }, 2000);


        setTimeout(() => {
            if (typeof CKEDITOR !== "undefined" && CKEDITOR.instances) {
                for (let editor in CKEDITOR.instances) {
                    if (CKEDITOR.instances.hasOwnProperty(editor)) {
                        CKEDITOR.instances[editor].setData("Bonjour,<br><br>Nous vous confirmons qu'une signalisation a été ouverte auprès de l'opérateur de boucle locale.<br>Nous revenons vers vous au plus vite.");
                    }
                }
            }
        }, 2500);
    }



//Bouton cloture immédiat
function performActions4() {
        // Click on the specific "Actions" dropdown
        const actionsDropdown = document.querySelector('button[aria-expanded]:not([aria-expanded="true"])');
        if (actionsDropdown && actionsDropdown.textContent.includes("Actions")) {
            actionsDropdown.click();
        }

        // Check if "Clôturer" option is present and click it
        setTimeout(() => {
            const cloturerOption = document.querySelector('a[data-target="#closingModal"]');
            if (cloturerOption) {
                cloturerOption.click();
            }

            // Actions inside the modal
            setTimeout(() => {
                // Check the radio button for "Clôture immédiate"
                const clotureImmediateRadio = document.getElementById('rd_closingType_DEFAULT');
                if (clotureImmediateRadio) {
                    clotureImmediateRadio.click();
                }

                // Check the radio button for "Oui"
                const ouiRadio = document.querySelector('input[name="closingResolution"][value="YES"]');
                if (ouiRadio) {
                    ouiRadio.click();
                }

                // Check the radio button for "Dstny"
                const dstnyRadio = document.querySelector('input[name="closingResponsibleEntity"][value="OPENIP"]');
                if (dstnyRadio) {
                    dstnyRadio.click();
                }

                // Add the closing comment
                const closingCommentTextarea = document.getElementById('ta_closingComment');
                if (closingCommentTextarea) {
                    closingCommentTextarea.value = "Merci pour votre retour, suite à ce dernier nous clôturons ce ticket.\nN'hésitez pas à revenir vers nous pour toutes nouvelles demandes.";
                }
            }, 500);  // Wait for the modal to fully appear
        }, 500);  // Wait for the dropdown to fully appear
    }


    // bouton autocloture
    function performActions5() {
        // Click on the specific "Actions" dropdown
        const actionsDropdown = document.querySelector('button[aria-expanded]:not([aria-expanded="true"])');
        if (actionsDropdown && actionsDropdown.textContent.includes("Actions")) {
            actionsDropdown.click();
        }

        // Check if "Clôturer" option is present and click it
        setTimeout(() => {
            const cloturerOption = document.querySelector('a[data-target="#closingModal"]');
            if (cloturerOption) {
                cloturerOption.click();
            }

            // Actions inside the modal
            setTimeout(() => {
                // Check the radio button for "Auto-clôture"
                const autoClotureRadio = document.getElementById('rd_closingType_AUTO_CLOSING');
                if (autoClotureRadio) {
                    autoClotureRadio.click();
                }

                // Check the radio button for "Oui"
                const ouiRadio = document.querySelector('input[name="closingResolution"][value="YES"]');
                if (ouiRadio) {
                    ouiRadio.click();
                }

                // Check the radio button for "Dstny"
                const dstnyRadio = document.querySelector('input[name="closingResponsibleEntity"][value="OPENIP"]');
                if (dstnyRadio) {
                    dstnyRadio.click();
                }

                // Click on "1 jour" button
                const unJourButton = document.querySelector('button[data-target="dt_closingDate"]');
                if (unJourButton) {
                    unJourButton.click();
                }

                // Add the closing comment
                const closingCommentTextarea = document.getElementById('ta_closingComment');
                if (closingCommentTextarea) {
                    closingCommentTextarea.value = "Suite aux informations qui vous ont été transmises, sans retour de votre part, ce ticket sera clôturer dans 24h.\nN'hésitez pas à revenir vers nous pour toutes nouvelles demandes.";
                }
            }, 500);  // Wait for the modal to fully appear
        }, 500);  // Wait for the dropdown to fully appear
    }

    // Vérifiez régulièrement si le bouton "Actions" est présent
    let intervalId = setInterval(() => {
        let actionsButtonDiv = document.querySelector('div.btn-group.text-right');
        if (actionsButtonDiv) {
            clearInterval(intervalId);  // Arrêtez l'intervalle une fois le bouton trouvé

            // Créez le nouveau bouton déroulant " Actions rapides "
            let newButtonDiv = document.createElement('div');
            newButtonDiv.className = "btn-group text-right";
            newButtonDiv.innerHTML = `
                <button type="button" class="btn btn-block btn-primary btn-gradient btn-lg dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                   Actions rapides  <span class="caret"></span>
                </button>
                <ul class="dropdown-menu dropdown-menu-right">
                    <li>
                        <a id="performActionsLink">Relance 1</a>
                    </li>
                    <li>
                        <a id="performActions2Link">Relance 2</a>
                    </li>
                    <li>
                        <a id="performActions3Link">Ouverture ticket fournisseur</a>
                    </li>
                    <li>
                        <a id="performActions7Link">Ouverture ticket fournisseur DATA</a>
                    </li>
                    <li>
                        <a id="performActions4Link">Clôture</a>
                    </li>

                    <li>
                        <a id="performActions5Link">Auto Clôture</a>
                    </li>

                    <li>
                        <a id="performActions6Link">Prend les infos fournisseur</a>
                    </li>

                </ul>
            `;

            // Insérez le nouveau bouton juste avant le bouton "Actions"
            actionsButtonDiv.parentNode.insertBefore(newButtonDiv, actionsButtonDiv);

            // Ajoutez un écouteur d'événements pour "Relance 1"
            let action1Link = document.querySelector('#performActionsLink');
            action1Link.addEventListener('click', performActions);

            let action7Link = document.querySelector('#performActions7Link');
            action7Link.addEventListener('click', performActions7);

            // Ajoutez un écouteur d'événements pour "Relance 2"
            let action2Link = document.querySelector('#performActions2Link');
            action2Link.addEventListener('click', performActions2);

            // Ajoutez un écouteur d'événements pour "Ouverture ticket fournisseur"
            let action3Link = document.querySelector('#performActions3Link');
            action3Link.addEventListener('click', performActions3);

	        // Ajoutez un écouteur d'événements pour "Clôture"
            let action4Link = document.querySelector('#performActions4Link');
            action4Link.addEventListener('click', performActions4);

            // Ajoutez un écouteur d'événements pour "Clôture"
            let action5Link = document.querySelector('#performActions5Link');
            action5Link.addEventListener('click', performActions5);

            let action6Link = document.querySelector('#performActions6Link');
            action6Link.addEventListener('click', performActions6);
        }
    }, 500);
}
   // PARTIE POUR LATTRIBUTION DES TICKET
   // PARTIE POUR LATTRIBUTION DES TICKET
    // PARTIE POUR LATTRIBUTION DES TICKET


      // Mapping des noms de techniciens à leurs IDs utilisateur
    const utilisateurIds = {
  "Adil HADDAR": "118335",
    "Romain NARGAUD": "158527",
    "Gabryël CENATIEMPO": "162131",
    "Florian VILLERET": "67387",
    "Bertrand GARGAUD": "110",
    "Clément BAHUAUD": "126139",
    "Corentin LANGLAUDE": "142291",
    "Frédéric HERDEIRO": "165811",
    "Gabryël CENATIEMPO": "162131",
    "Hugo BRUYNEEL": "73131",
    "Hugo TEILLET": "132999",
    "Hugo CHARVET": "133915",
    "ICT ICT": "143931",
    "Jean-Philippe ETIEN": "73115",
    "Kyllian Lobo": "24335",
    "Nicolas VERON": "58191",
    "Pascal RIVAULT": "75519",
    "Pedro ARAUJO PEREIRA": "151607",
    "Pierrick WOLF": "63791",
    "Rayan RAMZI": "110059",
    "Rodrigue ASSA": "73119",
    "Romain NARGAUD": "158527",
    "Soufiane KAHLAOUI": "73127",
    "Teddy LABORDE": "168339",
    "Thomas HOUX": "20890",
    "Tony GARGAUD": "142487",
    "Tristana VIANA": "101",
    "Valentin SABATIER": "52967",
    "zIncident META 1": "134919",
    "zIncident META 2": "134923",
    "zIncident META 3": "134939",
    "zIncident VOIX 1": "134943",
    "zIncident OpenSIM / FMU": "134947",
    "zIncident DATA 1": "134951",
    "zIncident DATA 2": "134955",
    "zIncident DATA 3": "134959",
    "zIncident VOIX 2": "136651"
    };

    // Fonction pour gérer la sélection d'utilisateur et effectuer une action
    function onUserClick(userId) {
   const selectElement = document.getElementById('se_assignmentUser');
        if (selectElement) {
            selectElement.value = userId;
            const event = new Event('change');
            selectElement.dispatchEvent(event);

            const submitButton = document.getElementById('assignment');
            if (submitButton) {
                submitButton.click();
            } else {
                console.error("Bouton 'Valider' non trouvé");
            }
        } else {
            console.error("Élément de sélection d'utilisateur non trouvé");
        }
    }
function processSvg(svgContent) {
    const parser = new DOMParser();
    const svgDoc = parser.parseFromString(svgContent, 'text/html');
    const svgElement = svgDoc.querySelector('svg');
    if (!svgElement) return null;

    // Supprimer la partie spécifique du SVG, si nécessaire
    const seriesGroup = svgElement.querySelector('g.highcharts-series-group');
    if (seriesGroup) seriesGroup.remove();

    // Supprimer tous les attributs 'onclick' des éléments dans le SVG
    const allElements = svgElement.querySelectorAll('*'); // Sélectionne tous les éléments dans le SVG
    allElements.forEach(element => {
        if (element.hasAttribute('onclick')) {
            element.removeAttribute('onclick'); // Supprime l'attribut 'onclick'
        }
    });

    // Décaler tous les textes sur l'axe des Y
    const textElements = svgElement.querySelectorAll('text');
    textElements.forEach(text => {
        const currentY = Number(text.getAttribute('y'));
        const newY = currentY - 100; // Décaler de 20 unités vers le haut, ajustez cette valeur selon vos besoins
        text.setAttribute('y', newY.toString());
    });

    // Décaler toutes les lignes sur l'axe des Y
    const lineElements = svgElement.querySelectorAll('line');
    lineElements.forEach(line => {
        const currentY1 = Number(line.getAttribute('y1'));
        const newY1 = currentY1 - 100; // Ajustez cette valeur selon vos besoins
        line.setAttribute('y1', newY1.toString());

        const currentY2 = Number(line.getAttribute('y2'));
        const newY2 = currentY2 - 100; // Ajustez cette valeur selon vos besoins
        line.setAttribute('y2', newY2.toString());
    });

        textElements.forEach(text => {
            const name = text.textContent.trim();
            const userId = utilisateurIds[name];
            if (userId) {
                // Supprimer les anciens événements de clic s'ils existent
                text.replaceWith(text.cloneNode(true));
                const newTextElement = svgElement.querySelectorAll('text')[Array.from(textElements).indexOf(text)];
                newTextElement.style.cursor = 'pointer';
                newTextElement.addEventListener('click', () => onUserClick(userId));
            }
        });

    // Le reste de votre traitement SVG peut continuer ici

    return svgElement;
}

if (window.location.href === 'https://tck.mydstny.fr/Tickets?refresh') {
    const svgContent = document.getElementById('js-countersChart-n1')?.outerHTML;
    if (svgContent) {
        localStorage.setItem('svgDataSiteA', svgContent);
        const now = new Date().toLocaleString();
        localStorage.setItem('dateTimeSiteA', now);
        console.log('SVG sauvegardé depuis Site A avec la date et l’heure.');
        window.close(); // Essaie de fermer l'onglet courant
    }
}

const currentUrl = window.location.href;
if (currentUrl.includes('https://tck.mydstny.fr/Ticket/')) {
    var iconElement = document.querySelector('.pull-right .btn.btn-link.btn-sm i');
    // Vérifiez si l'élément existe pour éviter des erreurs
    if (iconElement) {
        // Remplacez l'icône par l'emoji 🔄
        iconElement.parentNode.innerHTML = '⟳';
    }

    document.querySelector('.pull-right .btn.btn-link.btn-sm').addEventListener('click', (event) => {
        event.preventDefault(); // Empêche l'ouverture du lien

        // Ouverture du lien dans un nouvel onglet, en arrière-plan
        window.open('https://tck.mydstny.fr/Tickets?refresh', '_blank');

        // Récupération de la date et l'heure depuis localStorage
        const dateTime = localStorage.getItem('dateTimeSiteA');

        // Sélection de tous les éléments qui pourraient correspondre
        const panelTitles = document.querySelectorAll('.panel .panel-heading .panel-title');

        // Expression régulière pour matcher "Attribution de ticket" suivi de n'importe quel texte entre parenthèses
        const regex = /^Attribution de ticket .+\)$/;
        // Recherche d'un élément correspondant au texte "Compteurs" ou "Attribution de ticket"
        const compteurPanelTitle = Array.from(panelTitles).find(title =>
            title.textContent.trim() === 'Compteurs' || regex.test(title.textContent.trim()));

        // Vérification si compteurPanelTitle existe
        if (compteurPanelTitle) {
            // Modification du texte en incluant la date et l'heure
            compteurPanelTitle.textContent = `Attribution de ticket (${dateTime})`;

            // Recherche du corps du panneau associé pour insertion du SVG
            const panelBody = compteurPanelTitle.closest('.panel').querySelector('.panel-body');
            if (panelBody) {
                panelBody.innerHTML = ''; // Nettoyage du contenu existant
                const svgContent = localStorage.getItem('svgDataSiteA');
                if (svgContent) {
                    const svgElement = processSvg(svgContent); // Assurez-vous que cette fonction est définie correctement
                    if (svgElement) {
                        panelBody.appendChild(svgElement); // Ajout du SVG modifié au corps du panneau
                    }
                    localStorage.removeItem('svgDataSiteA'); // Nettoyage du localStorage
                    localStorage.removeItem('dateTimeSiteA');
                    console.log('SVG inséré sur Site B et cache vidé.');
                }
            } else {
                console.error("Panel body not found");
            }
        } else {
            console.error("Panel title not found");
        }
    });
}




    if (window.location.href === 'https://tck.mydstny.fr/Tickets') {
        const svgContent = document.getElementById('js-countersChart-n1')?.outerHTML;
        if (svgContent) {
            localStorage.setItem('svgDataSiteA', svgContent);
            const now = new Date().toLocaleString();
            localStorage.setItem('dateTimeSiteA', now);
            console.log('SVG sauvegardé depuis Site A avec la date et l’heure.');
        }
    } else if (currentUrl.includes('https://tck.mydstny.fr/Ticket/')) {
        const panelTitles = document.querySelectorAll('.panel .panel-heading .panel-title');
        const compteurPanelTitle = Array.from(panelTitles).find(title => title.textContent.trim() === 'Compteurs');

        if (compteurPanelTitle) {
            const dateTime = localStorage.getItem('dateTimeSiteA');
            compteurPanelTitle.textContent = `Attribution de ticket (${dateTime})`;
            const panelBody = compteurPanelTitle.closest('.panel').querySelector('.panel-body');

            if (panelBody) {
                panelBody.innerHTML = '';
                const svgContent = localStorage.getItem('svgDataSiteA');
                if (svgContent) {
                    const svgElement = processSvg(svgContent);
                    if (svgElement) {
                        panelBody.appendChild(svgElement);
                    }
                    console.log('SVG inséré sur Site B et cache vidé.');
                }
            }
        }
    }
    //fin PARTIE POUR LATTRIBUTION DES TICKET
     //fin PARTIE POUR LATTRIBUTION DES TICKET
     //fin PARTIE POUR LATTRIBUTION DES TICKET


    if (currentURL.includes('https://www.e-sav-signalisation.operateurs.orange-business.com/ipsiteTT/rdvSelectAction.do?contextRdv=0&rdvSessionId=')) {


        if (GM_getValue('boutonclique') === 1) {
    console.log("Bouton cliqué ( valeur mise à 1 )");
    LienOrangeFTTH(); // Vérifie la présence du formulaire et exécute les actions supplémentaires si présent
    LienOrangeDSL();
GM_setValue('boutonclique', 0);
} else {
    console.log("Bouton pas cliqué ( valeur pas à 1 )");
}


}

})();