DC - AutoStock (channel Beta)

Permet le réajustement des stocks en vente ou les prix dans l'usine de production pour DC.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         DC - AutoStock (channel Beta)
// @namespace    http://tampermonkey.net/
// @version      1.2.1.Beta
// @description  Permet le réajustement des stocks en vente ou les prix dans l'usine de production pour DC.
// @author       Mochizuki Kaneda Amane [Amane-Mochizuki #75956]
// @match        https://www.dreadcast.net/Main
// @icon         https://www.google.com/s2/favicons?sz=64&domain=dreadcast.net
// @grant        none
// @license      CC-BY-NC-SA-4.0
// ==/UserScript==

// CC-BY-NC-SA-4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
// Sous brevet impérial à CDL.
// [Changelog]
// 1.0.0
// - Version initiale
//
// 1.1.0 :
// - mode ouverture/fermeture automatique (corrige également le bug de dupplication du menu)
// - correction bug saisie de données
// - détection de l'interface ouverte. si non compatible affichage d'un message (sera retiré dans la version stable)
// - préparatif du développement pour "boutique"
//
// 1.2.0 :
// - création fonction export prix usine
// - création fonction import prix usine
// - correction bug : mise en vente stock usine > plante si la réserve est défini sur "zéro"
// - correction bug : changer prix usine > prix de vente des articles ancienne génération. > la ligne est désormais ignoré et demandera un traitement manuel. Un avertissement est affiché dans le journal
//
// 1.2.1 :
// - masquer le message d'avertissement sur les stock non géré (banque, agence immobilières...). Celui ci reste présent pour les boutiques de vente sous la forme
// "AutoStock : Boutique à venir."
//
// Bug Connu :
//
// Roadmap :
// - création version boutique
// - création fonction permettant de "vider la vitrine" d'une boutique
//



                                                       //Initialisation et GUI
var versionAutoStock = "1.2.1.Beta"

var Global_GUIActive = false
var UnStock
var TypeUI
var htmlstockclass
var NombrestockScann

// détection event d'ouverture fermeture d'un stock
$(document).ajaxSuccess(function (e, xhr, opt) {
    if (document.getElementById("modif_stocks_form") != null && Global_GUIActive == false )
    {
        htmlstockclass = document.getElementById("modif_stocks_form").getElementsByClassName("stock");

        if ( $(htmlstockclass).length > 0 )
        {
            //alert("stock détecté, scan en cours")
            TypeUI = DetectionUiStock(CleanHtml(htmlstockclass[0].outerHTML))
            //alert("scan fini, " + TypeUI)
        }
        else
        {
            //alert("pas de stock détecté")
            TypeUI = "Inconnu"
        }

        console.log("AutoStock : ouvert sur profil " + TypeUI)
        // alert("AutoStock : ouvert sur profil " + TypeUI)


        if (TypeUI == "Usine")
        {
            AfficherAutoStockUsine();
        }
        else
        {
            if (TypeUI == "Boutique")
            {
                AfficherAutoStockBoutique();
            }
            else
            {
            //alert("interface inconnue");
                AfficherAutoStockInconnu();
            }
        }

        Global_GUIActive = true
    }
  });

$(document).ajaxSuccess(function (e, xhr, opt) {
    if (document.getElementById("modif_stocks_form") == null && Global_GUIActive == true )
    {
        console.log("AutoStock : fermé")
        Global_GUIActive = false
    }
  });


//function AfficherAutoStock (zEvent) {

function AfficherAutoStockInconnu () {

    var menu = document.createElement ('div');
    menu.innerHTML = '<span style="left:135px;"></span>';
    menu.setAttribute ('id', 'AutoStockMenu');

    document.getElementById("modif_stocks_form").appendChild(menu);

}

function AfficherAutoStockBoutique () {

    var menu = document.createElement ('div');
    menu.innerHTML = '<span style="left:135px;">AutoStock : Boutique à venir.</span>';
    menu.setAttribute ('id', 'AutoStockMenu');

    document.getElementById("modif_stocks_form").appendChild(menu);

}

function AfficherAutoStockUsine () {

    var menu = document.createElement ('div');
    menu.innerHTML = '<span id="AutoStockRootMenu" style="left:25px;"><a id="MettreEnVenteUsine" style="cursor:pointer;">Mettre en vente</a> | <a id="ChangePrixUsine" style="cursor:pointer;">Changer prix</a> | <a id="ExportPrixUsine" style="cursor:pointer;">Exporter prix</a> | <a id="ImportPrixUsine" style="cursor:pointer;">Importer prix</a></span>'
                   + '<div id="AutoStockListAnchor" style="left:515px; top:-498px; width:1px; height:1px; background-color:red">'
                   + '<div id="AutoStockLog" style="height:518px; width:500px; background-color:#0B4E64; overflow: auto;">Autostock v'+versionAutoStock+' par Amane-Mochizuki<br />journal de traitement :</div></div>';
    menu.setAttribute ('id', 'AutoStockMenu');

    document.getElementById("modif_stocks_form").appendChild(menu);

    document.getElementById("MettreEnVenteUsine").addEventListener ( "click", MettreEnVenteUsine, false);
    document.getElementById("ChangePrixUsine").addEventListener ( "click", ChangePrixUsine, false);
    document.getElementById("ExportPrixUsine").addEventListener ( "click", ExportPrixUsine, false);
    document.getElementById("ImportPrixUsine").addEventListener ( "click", ImportPrixUsine, false);
}


                                                      // Fonctions de modifications stock USINE

function MettreEnVenteUsine (zEvent) {

    OutputLog('<span style="color:black;">------------------ Traitement de mise en vente ------------------</span>')
    var htmlNode
    var elements = document.getElementById("modif_stocks_form").getElementsByClassName("stock");
    var Unobjet_Scannee
    var UnObjet_ID
    var UnObjet_Type
    var UnObjet_Nom
    var UnObjet_StockDispo
    var UnObjet_PrixProd
    var UnObjet_StockVente
    var UnObjet_PrixVente
    var OutputString
    var MaxStockVente

    var InputBoxAChanger

    var ReserveStock = prompt('Autostock : \n Seuil de réserve exclue de la vente pour produits standard \n champs vide = 0')
    if (ReserveStock == null){
        OutputLog('<span style="color:black;">Paramètre de réserve standard : </span> Opération annulée')
        OutputLog('<span style="color:black;">---------------- Fin Traitement de mise en vente ----------------</span>')
        return 0
    }

    if (ReserveStock == ""){
        ReserveStock = 0
    }

    if (isdigit(ReserveStock) || ReserveStock == 0)
    {
        OutputLog('<span style="color:black;">Paramètre de réserve standard : </span>' + ReserveStock)
    }
    else
    {
        OutputLog('<span style="color:black;">Paramètre de réserve standard invalide : </span>' + ReserveStock)
        OutputLog('<span style="color:black;">---------------- Fin Traitement de mise en vente ----------------</span>')
        return 0
    }


    var ReserveStockAliments = prompt('Autostock : \n Seuil de réserve exclue de la vente pour produits alimentaires \n champs vide = 0')
    if (ReserveStockAliments == null){
        OutputLog('<span style="color:black;">Paramètre de réserve aliments : </span> Opération annulée')
        OutputLog('<span style="color:black;">---------------- Fin Traitement de mise en vente ----------------</span>')
        return 0
    }
    if (ReserveStockAliments == ""){
        ReserveStockAliments = 0
    }
    
    if (isdigit(ReserveStockAliments) || ReserveStockAliments == 0 )
    {
        OutputLog('<span style="color:black;">Paramètre de réserve aliments : </span>' + ReserveStockAliments)
    }
    else
    {
        OutputLog('<span style="color:black;">Paramètre de réserve aliments invalide : </span>' + ReserveStockAliments)
        OutputLog('<span style="color:black;">---------------- Fin Traitement de mise en vente ----------------</span>')
        return 0
    }

    for(var i = 0; i < elements.length; i++)
    {
        OutputString = ''
        Unobjet_Scannee = ScanHtmlUnObjetUsine(elements[i].outerHTML) ;

        UnObjet_ID = Unobjet_Scannee[0]
        UnObjet_Type = Unobjet_Scannee[1]
        UnObjet_Nom = Unobjet_Scannee[2]
        UnObjet_StockDispo = Unobjet_Scannee[3]
        UnObjet_PrixProd = Unobjet_Scannee[4]
        UnObjet_StockVente = Unobjet_Scannee[5]
        UnObjet_PrixVente = Unobjet_Scannee[6]

        var htmlinput

        if (UnObjet_Type == "Stock de 10 aliments") {

            MaxStockVente = UnObjet_StockDispo - ReserveStockAliments
            if (MaxStockVente < 0 ) {
                MaxStockVente = 0
            }

           InputBoxAChanger = 'champ_cpt_' + UnObjet_ID
           htmlinput = document.getElementById(InputBoxAChanger);
           htmlinput.value = MaxStockVente;
           htmlinput.className = "champ";

            OutputLog('<span style="color:#fff;">' + UnObjet_Nom + '</span> en vente : <span class="couleur5">' + UnObjet_StockVente + '</span> > <span class="couleur1">' +
                      MaxStockVente + '</span> sur total <span class="couleur0">' + UnObjet_StockDispo + '</span> (réserve ' + ReserveStockAliments + ')' )
        }
        else
        {
            MaxStockVente = UnObjet_StockDispo - ReserveStock
            if (MaxStockVente < 0 ) {
                MaxStockVente = 0
            }
            OutputLog('<span style="color:#fff;">' + UnObjet_Nom + '</span> en vente : <span class="couleur5">' + UnObjet_StockVente + '</span> > <span class="couleur1">' +
                      MaxStockVente + '</span> sur total <span class="couleur0">' + UnObjet_StockDispo + '</span> (réserve ' + ReserveStock + ')' )

           InputBoxAChanger = 'champ_cpt_' + UnObjet_ID
           htmlinput = document.getElementById(InputBoxAChanger);
           htmlinput.value = MaxStockVente;
           htmlinput.className = "champ";

        }


    }
    OutputLog('<span style="color:black;">---------------- Fin Traitement de mise en vente ----------------</span>')
}

function ChangePrixUsine (zEvent) {
    OutputLog('<span style="color:black;">---------------- Traitement de changement prix ----------------</span>')
    var htmlNode
    var elements = document.getElementById("modif_stocks_form").getElementsByClassName("stock");
    var Unobjet_Scannee
    var UnObjet_ID
    var UnObjet_Type
    var UnObjet_Nom
    var UnObjet_StockDispo
    var UnObjet_PrixProd
    var UnObjet_StockVente
    var UnObjet_PrixVente
    var OutputString
    var NouveauPrixVente

    var InputBoxAChanger
    var MargeAppliquerbis

    var MargeAppliquer = prompt('Autostock : \n Marge a appliquer sur le prix de production (en %) \n champs vide = 0%')
    if (MargeAppliquer == null){
        OutputLog('<span style="color:black;">Paramètre de marge a appliquer: </span> Opération annulée')
        OutputLog('<span style="color:black;">---------------- Fin Traitement de changement prix ----------------</span>')
        return 0
    }

    if (MargeAppliquer == ""){
        MargeAppliquer = 0
    }


    MargeAppliquerbis = (MargeAppliquer / 100)
    MargeAppliquerbis = (1 + MargeAppliquerbis)



    OutputLog('<span style="color:black;">Paramètre de marge a appliquer : </span>' + MargeAppliquer + '%')


    for(var i = 0; i < elements.length; i++)
    {
        OutputString = ''
        Unobjet_Scannee = ScanHtmlUnObjetUsine(elements[i].outerHTML) ;

        UnObjet_ID = Unobjet_Scannee[0]
        UnObjet_Type = Unobjet_Scannee[1]
        UnObjet_Nom = Unobjet_Scannee[2]
        UnObjet_StockDispo = Unobjet_Scannee[3]
        UnObjet_PrixProd = Unobjet_Scannee[4]
        UnObjet_StockVente = Unobjet_Scannee[5]
        UnObjet_PrixVente = Unobjet_Scannee[6]

        var htmlinput

        //NouveauPrixVente = ()
        NouveauPrixVente = Math.trunc(UnObjet_PrixProd * MargeAppliquerbis)

       // alert(NouveauPrixVente + 'prod ' + UnObjet_PrixProd + '*marge ' +MargeAppliquerbis)

        if (UnObjet_PrixProd != 0)
        {

           InputBoxAChanger = 'champ_stock_' + UnObjet_ID
           htmlinput = document.getElementById(InputBoxAChanger);
           htmlinput.value = NouveauPrixVente;
           htmlinput.className = "champ";

            OutputLog('<span style="color:#fff;">' + UnObjet_Nom + '</span> prix de vente : <span class="couleur5">' + UnObjet_PrixVente + '</span> > <span class="couleur1">' +
                      NouveauPrixVente + '</span> (marge ' + MargeAppliquer + ')' )
        }
        else
        {
            OutputLog('<span style="color:#ff0;">/!\\ Modification ignoré car le prix de prod. est de 0¢r (Ancienne Génération ?)')
            OutputLog('<span style="color:#ff0;">--> </span> '+ UnObjet_Nom + '</span>' )
        }
    }
    OutputLog('<span style="color:black;">---------------- Fin Traitement de mise en vente ----------------</span>')
}

function ExportPrixUsine (zEvent) {

    OutputLog('<span style="color:black;">--------------- Traitement pour export des prix --------------</span>')
    var uneligne = ''
    var csv = 'ProductID;Designation;Prix\n'

    // début du process

    var elements = document.getElementById("modif_stocks_form").getElementsByClassName("stock");
    var Unobjet_Scannee
    var UnObjet_ID
    var UnObjet_Type
    var UnObjet_Nom
    var UnObjet_StockDispo
    var UnObjet_PrixProd
    var UnObjet_StockVente
    var UnObjet_PrixVente

    for(var i = 0; i < elements.length; i++)
    {
        uneligne = ''
        Unobjet_Scannee = ScanHtmlUnObjetUsine(elements[i].outerHTML) ;

        UnObjet_ID = Unobjet_Scannee[0]
        UnObjet_Type = Unobjet_Scannee[1]
        UnObjet_Nom = Unobjet_Scannee[2]
        UnObjet_StockDispo = Unobjet_Scannee[3]
        UnObjet_PrixProd = Unobjet_Scannee[4]
        UnObjet_StockVente = Unobjet_Scannee[5]
        UnObjet_PrixVente = Unobjet_Scannee[6]

        uneligne = UnObjet_ID +";"+UnObjet_Nom+";"+UnObjet_PrixVente+"\n"

        csv = csv + uneligne

    }
    OutputLog('Données exportées à sauvegarder pour la fonction Importer prix')
    // affichage du resultat strings
    var htmlNode
    htmlNode = document.createElement('p');
    htmlNode.innerHTML = '<textarea disabled name="PrixExport" cols="55" rows="16">'+csv+'</textarea>'
    document.getElementById("AutoStockLog").appendChild(htmlNode);

   OutputLog('<span style="color:black;">------------- Fin Traitement pour export des prix -------------</span>')
}

function ImportPrixUsine (zEvent) {

    OutputLog('<span style="color:black;">--------------- Traitement pour import des prix --------------</span>')
    var uneligne = ''
    var csv = 'ProductID;Designation;Prix\n'

    // début du process

    var elements = document.getElementById("modif_stocks_form").getElementsByClassName("stock");
    var Unobjet_Scannee
    var UnObjet_ID
    var UnObjet_Type
    var UnObjet_Nom
    var UnObjet_StockDispo
    var UnObjet_PrixProd
    var UnObjet_StockVente
    var UnObjet_PrixVente

    OutputLog('saisir les données pour importer les prix')
    // affichage du resultat strings
    var htmlNode
    htmlNode = document.createElement('p');
    htmlNode.innerHTML = '<span class="ZonePrixImport"><textarea id="PrixImport" cols="55" rows="6"></textarea></span><br /><span class="ConfirmerImport"><a id="AnnulerImportUsine" style="cursor:pointer;">Annuler</a> | <a id="ValiderImportUsine" style="cursor:pointer;">Valider</a></span>'
    document.getElementById("AutoStockLog").appendChild(htmlNode);

    $("#AutoStockRootMenu").children().prop('hidden',true);
    document.getElementById("AnnulerImportUsine").addEventListener ( "click", AnnulerImportUsine, false);
    document.getElementById("ValiderImportUsine").addEventListener ( "click", ValiderImportUsine, false);


}

     function AnnulerImportUsine (zEvent) {

         $( ".ConfirmerImport" ).empty();
         document.getElementById('PrixImport').disabled = true
         document.getElementById('PrixImport').id = 'PrixImportAnnule'
         $("#AutoStockRootMenu").children().prop('hidden',false);

         OutputLog("Processus d'importation annulé")
         OutputLog('<span style="color:black;">------------ Fin traitement pour import des prix -------------</span>')
     }

     function ValiderImportUsine (zEvent) {
         var GUIerror = "/!\\"
         var UneLigneImporte
         var DonneeUneLigne
         var idTrouve

         var UnProductID
         var UneDesignation
         var UnPrix

         var Unobjet_Scannee
         var UnObjet_ID
         var UnObjet_Type
         var UnObjet_Nom
         var UnObjet_StockDispo
         var UnObjet_PrixProd
         var UnObjet_StockVente
         var UnObjet_PrixVente
         var InputBoxAChanger
         var htmlinput


         $( ".ConfirmerImport" ).empty();
         var DataInput = document.getElementById('PrixImport').value;


         document.getElementById('PrixImport').disabled = true
         document.getElementById('PrixImport').id = 'PrixImportValide'



         //alert(DataInput)


         var elements = document.getElementById("modif_stocks_form").getElementsByClassName("stock");


         var LignesImporte = DataInput.split('\n');


         for(var i = 0; i < LignesImporte.length; i++)
         {
             UneLigneImporte = LignesImporte[i]

             DonneeUneLigne = UneLigneImporte.split(';');

             if (DonneeUneLigne[0] != undefined && DonneeUneLigne[1] != undefined && DonneeUneLigne[2] != undefined ) {

                 UnProductID = DonneeUneLigne[0]
                 UneDesignation = DonneeUneLigne[1]
                 UnPrix = DonneeUneLigne[2]

                 if ( UnProductID == 'ProductID' && UneDesignation == 'Designation' && UnPrix == 'Prix' && i == 0 )
                 {
                     OutputLog("démarrage de l'importation : la structure semble cohérente.")
                 }
                 else
                 {
                     if (i != 0)
                     {

                         idTrouve = false

                         for(var y = 0; y < elements.length; y++)
                         {
                             Unobjet_Scannee = ScanHtmlUnObjetUsine(elements[y].outerHTML) ;

                             UnObjet_ID = Unobjet_Scannee[0]
                             UnObjet_Type = Unobjet_Scannee[1]
                             UnObjet_Nom = Unobjet_Scannee[2]
                             UnObjet_StockDispo = Unobjet_Scannee[3]
                             UnObjet_PrixProd = Unobjet_Scannee[4]
                             UnObjet_StockVente = Unobjet_Scannee[5]
                             UnObjet_PrixVente = Unobjet_Scannee[6]


                             if (UnObjet_ID == UnProductID)
                             {
                                 idTrouve = true
                                 if (UnObjet_Nom == UneDesignation)
                                 {

                                     // traitement
                                     InputBoxAChanger = 'champ_stock_' + UnProductID

                                     htmlinput = document.getElementById(InputBoxAChanger);
                                     htmlinput.value = UnPrix
                                     htmlinput.className = "champ";

                                     OutputLog('<span style="color:#fff;">' + UneDesignation + '</span> prix de vente : <span class="couleur5">' + UnObjet_PrixVente + '</span> > <span class="couleur1">' + UnPrix + '</span>' )
                                 }
                                 else
                                 {

                                     // id trouvé, nom incohérent

                                     OutputLog('<span style="color:#f00;">' + GUIerror + " Erreur l'ID produit " + UnObjet_ID + " a été trouvé avec un autre nom (ligne ignorée) :</span>" )
                                     OutputLog('<span style="color:#f00;">--> </span> importé : <span style="color:#fff;">'+ UneDesignation + '</span> / stock : <span style="color:#fff;">'+ UnObjet_Nom + '</span>')
                                 }
                             }

                         }
                         if (idTrouve == false)
                         {
                             // id absent

                             OutputLog('<span style="color:#ff0;">' + GUIerror + " L'ID produit " + UnProductID + " n'a pas été trouvé dans le stock et à été ignoré")
                             OutputLog('<span style="color:#ff0;">--> </span> Stock manquant : <span style="color:#fff;">'+ UneDesignation + '</span>' )
                         }

                     }
                     else
                     {
                         // format de fichier incorect, entete manquant
                         OutputLog('<span style="color:#f00;">' + GUIerror + " Erreur de structure sur données, l'entête de contrôle est absent ou invalide.</span>" )
                         OutputLog("Annulation de l'opération")
                         i = 999999
                     }

                 }

             }
             else
             {
                 if (UneLigneImporte == '')
                 {
                     //OutputLog('---------------------------------------------------------------------')
                    // OutputLog('<span style="color:#ff0;">' + GUIerror + ' Ligne de données vide ignorée')
                   //  OutputLog('---------------------------------------------------------------------')
                 }
                 else
                 {
                     //OutputLog('---------------------------------------------------------------------')
                     OutputLog('<span style="color:#f00;">' + GUIerror + " Erreur de structure sur ligne : l'entrée suivante a été ignoré.")
                     OutputLog('<span style="color:#f00;">--> </span>' + UneLigneImporte)
                     //OutputLog('---------------------------------------------------------------------')
                 }
             }


         }






         
         $("#AutoStockRootMenu").children().prop('hidden',false);

         OutputLog("Processus d'importation terminé")
         OutputLog('<span style="color:black;">------------ Fin traitement pour import des prix -------------</span>')
     }

                                                      // zone librairie de fonction utiles...


// détection du type de stock ouvert (boutique, immobilier, banque, usine....
function DetectionUiStock(stringhtmlStock) {
    var resultat = "Inconnu"
    if (stringhtmlStock.includes('Stock de') && stringhtmlStock.includes('<input id="champ_cpt_') && stringhtmlStock.includes('<input id="champ_stock_') )
    {
        resultat = "Usine"
    }
    else
    {
        if (stringhtmlStock.includes('<td id="prix_unitaire_') && stringhtmlStock.includes('<input id="champ_stock_'))
        {
            resultat = "Boutique"
        }
    }

    return resultat
    //alert(stringhtmlStock);
}


// Ecriture dans le journal de sortie
function OutputLog(HTMLstring){
var htmlNode
    htmlNode = document.createElement('p');
    htmlNode.innerHTML = HTMLstring
    htmlNode.setAttribute('style', 'font-family:"Trebuchet MS",Verdana,Arial,sans-serif; color: #00e1ed; font-variant: small-caps; font-size: 13px;')
    document.getElementById("AutoStockLog").appendChild(htmlNode);
}


//Fonction permettant d'extraire les données d'un objet DC sur le modèle de stock USINE
function ScanHtmlUnObjetUsine(html) {
    var unitem = html
    var unitem_temp = ''
    var unitem_type = ''
    var unitem_nom = ''
    var unitem_id = ''
    var unitem_stockdispo = ''
    var unitem_prixprod = ''
    var unitem_stockvente = ''
    var unitem_prixvente = ''
    var result = new Array();
    unitem_temp = Extractsubstring(unitem, '<div class="nom_item">', '</div>');
    unitem_temp = CleanHtml(unitem_temp)

    unitem_id = Extractsubstring(unitem, '<div id="up_cpt_', '" class="btnUp">');

    unitem_type = Extractsubstring(unitem_temp, 'Stock de', '<span class="couleur4">');
    unitem_type = 'Stock de ' + unitem_type

    unitem_nom = Extractsubstring(unitem_temp, '<span class="couleur4">', '</span>');

    unitem_stockdispo = Extractsubstring(unitem, '<td class="quantite_vente type2" style="height:20px;width:50px;">', '</td>');
    unitem_prixprod = Extractsubstring(unitem, '<td id="prix_unitaire_'+ unitem_id +'" class="prix type2" style="padding-left:20px;width:75px;">', '</td>');
    unitem_stockvente = Extractsubstring(unitem, 'name="cpt_'+ unitem_id +'" value="', '">');
    unitem_prixvente = Extractsubstring(unitem, 'name="stock_'+ unitem_id +'" value="', '">');


    unitem_prixprod = unitem_prixprod.replace(/\s/g, ''); // suppression regex des espaces nécessaire pour calcul sur la fonction de change prix 25 000Cr => 25000Cr
    unitem_prixprod = unitem_prixprod.replace('Cr', ''); // suppression regex des espaces nécessaire pour calcul sur la fonction de change prix 25000Cr => 25000
    return [unitem_id, unitem_type, unitem_nom, unitem_stockdispo, unitem_prixprod, unitem_stockvente, unitem_prixvente]
}

// fonction nettoyant les sauts de ligne et espaces du html pour traitement facilité
function CleanHtml (SringANettoyer) {
    var newPageTxt = SringANettoyer
        .split("\n")
        .map((line) => line.trim())
        .join(" ");
    newPageTxt = newPageTxt.replaceAll('\n', '');
    return newPageTxt
}

// Fonction permettant d'extraire certains éléments d'une string, délémité entre le préfix et le suffix : exemple Extractsubstring ("Bonjour tout le monde", "Bonjour", "monde") retourne "tout le"
function Extractsubstring (s, prefix, suffix) {
	//var s = string;
	var i = s.indexOf(prefix);
	if (i >= 0) {
		s = s.substring(i + prefix.length);
	}
	else {
		return '';
	}
	if (suffix) {
		i = s.indexOf(suffix);
		if (i >= 0) {
			s = s.substring(0, i);
		}
		else {
		  return '';
		}
	}
    s = s.trim()
	return s;
}


// Fonction vérifiant si la variable est un nombre entier
const isdigit=(value)=>{
    const val=Number(value)?true:false
    //console.log(val);
    return val
}