您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Permet le réajustement des stocks en vente ou les prix dans l'usine de production pour DC.
// ==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 }