Greasy Fork is available in English.

Torn company stock order

Automatically calculate stock percent based on sale and enter the order amount to order up to max capasity.

// ==UserScript==
// @name         Torn company stock order
// @version      0.2.11
// @description  Automatically calculate stock percent based on sale and enter the order amount to order up to max capasity.
// @author       Nemithrell
// @match        https://www.torn.com/companies.php*
// @run-at       document-start
// @grant        none
// @namespace    Nemithrell
// ==/UserScript==

    window.onload = function() {

        //add CSS for API key entry
        var style_api = document.createElement("style");
        style_api.type = "text/css";
        style_api.innerHTML = `
         #apiKey {
        height: 18px;
        font-size: 1.5em;
        width: 400px;
        font-family: Verdana;
        letter-spacing: .05em;
        margin-left: 5px;
        margin-bottom: 5px;
        padding: 5px;
        }
.d .manage-company .stock .stock-list-title>li.name, .d .manage-company .stock .stock-list .name {
    width: 185px;
}
.d .manage-company .stock .stock-list-title>li.stock, .d .manage-company .stock .stock-list .stock {
    width: 96px;
}

.d .manage-company .stock .stock-list-title>li.sold-daily, .d .manage-company .stock .stock-list .sold-daily {
    width: 70px;
}
        `
        document.head.appendChild(style_api);
        if (document.getElementById("stock").getElementsByClassName("stock-list-wrap").length != 0) {
            if (addUI()){
                run();
            }
        }

        //Add observer to triger when the stock tab is selected
        var targetNode = document.getElementById("stock");
        var config = { attributes: true, childList: true, subtree: true };
        var callback = function(mutationsList) {
            for(var mutation of mutationsList) {
                if (mutation.type == 'childList') {
                    if (addUI()){
                        run();
                    }
                }
            }
        };
        // Create an observer instance linked to the callback function
        var observer = new MutationObserver(callback);

        // Start observing the target node for configured mutations
        observer.observe(targetNode, config);

}

function addUI (){
    if ( document.getElementsByClassName("StockAutoFill").length == 0 ){
        var div_api = document.createElement("div");
        div_api.className = "StockAutoFill";
        var apiKey = document.createElement("input");
        apiKey.type = "text";
        apiKey.id = "apiKey";
        apiKey.placeholder = "Enter API key here";
        apiKey.value = localStorage.getItem("_apiKey") ? localStorage.getItem("_apiKey") : "";
        div_api.appendChild(apiKey);

        var button_save = document.createElement("button");
        button_save.type = "button";
        button_save.innerText = "Save";
        button_save.id = "btn_save";
        div_api.appendChild(button_save);

        var cw = document.getElementById("stock").getElementsByClassName("stock-list-wrap");
        cw[0].parentNode.insertBefore(div_api, cw[0]);

//         var ms = document.getElementById("stock").querySelectorAll("div.info-wrap.left");
//         console.log(ms);
//         for(var i = 0; i < ms.length; ++i){
//             var div_maxStock = document.createElement("div");
//             div_maxStock.id = "maxStock";
//             div_maxStock.className = "delivery";
//             var span_maxStock = document.createElement("span");
//             span_maxStock.innerText = "";
//             div_maxStock.appendChild(span_maxStock);
//             ms[i].insertBefore(div_maxStock, ms[i].lastElementChild);
//         }

        document.getElementById("btn_save").addEventListener("click", function() {
            var key = document.getElementById("apiKey");
            if(localStorage.getItem("_apiKey") != key.value){
                localStorage.setItem("_apiKey", key.value);
                run();
            }
        });
        return true;
    }
    else{
        return false;
    }
}

function run(){
    var urlStock = 'https://api.torn.com/company/?selections=stock&key=';
    var urlStorage = 'https://api.torn.com/company/?selections=detailed&key=';
    urlStock += localStorage.getItem("_apiKey") ? localStorage.getItem("_apiKey") : '';
    urlStorage += localStorage.getItem("_apiKey") ? localStorage.getItem("_apiKey") : '';
    var storage

    fetch(urlStorage)
        .then(function(response) {
        if(response.ok) {
            return response.json();
        }
        throw new Error('Network response was not ok.');
    })
        .then(function(myJson) {
        if (myJson.error){
            throw new Error(myJson.error.error);
        }
        storage = myJson.company_detailed.upgrades.storage_space;
    });

    fetch(urlStock)
        .then(function(response) {
        if(response.ok) {
            return response.json();
        }
        throw new Error('Network response was not ok.');
    })
        .then(function(myJson) {
        if (myJson.error){
            throw new Error(myJson.error.error);
        }

        var totalSold = 0;
        var totalStock = 0;
        var availableStock = 0;
        var totalNeededStock = 0;
        var maxStock = 0;
        for (var key1 in myJson.company_stock) {
            totalSold += myJson.company_stock[key1].sold_amount;
            totalStock += myJson.company_stock[key1].in_stock;
            totalStock += myJson.company_stock[key1].on_order;
        }

        availableStock = storage - totalStock;
        for (var key2 in myJson.company_stock) {
            maxStock = 0;
            maxStock = storage * (myJson.company_stock[key2].sold_amount/totalSold);
            totalNeededStock += maxStock - (myJson.company_stock[key2].on_order + myJson.company_stock[key2].in_stock) > 0 ?  maxStock - (myJson.company_stock[key2].on_order + myJson.company_stock[key2].in_stock) : 0;
        }

        $( ".stock-list-title.bold.t-hide" ).find(".name")[0].firstChild.after(" (MaxStock)");
        $( ".stock-list-title.bold.t-hide" ).find(".stock")[0].firstChild.after(" (+order)");

        for (var key in myJson.company_stock) {
            if (myJson.company_stock.hasOwnProperty(key)) {
                var orderPercent = myJson.company_stock[key].sold_amount/totalSold
                var orderAmount = 0;
                maxStock = 0;
                maxStock = storage * (myJson.company_stock[key].sold_amount/totalSold);
                var neededStock = maxStock - (myJson.company_stock[key].on_order + myJson.company_stock[key].in_stock)
                var neededPercent = neededStock > 0 ? neededStock/totalNeededStock : 0;
                //var maxOrderAmount = Math.floor((storage * orderPercent) - myJson.company_stock[key].in_stock - myJson.company_stock[key].on_order);
                //var orderOfAvailable = Math.floor(availableStock * orderPercent);

                orderAmount = Math.floor(availableStock * neededPercent);
                //orderAmount = maxOrderAmount > 0 ? orderOfAvailable > 0 ? orderOfAvailable > maxOrderAmount ? maxOrderAmount : orderOfAvailable : 0 : 0;

//                 $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find("#maxStock").find("span").text(Math.floor(maxStock));
                $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").append(" (" + new Intl.NumberFormat('en-US').format(Math.floor(maxStock)) + ")");
                $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find(".stock").append(" (" + new Intl.NumberFormat('en-US').format(myJson.company_stock[key].on_order + myJson.company_stock[key].in_stock) + ")");
//                $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find(".cost").append(" (" + new Intl.NumberFormat('en-US').format(myJson.company_stock[key].sold_amount) + ")");
                if(orderAmount != 0)
                {
                    $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find(".quantity").find("input").val(orderAmount);
                }
                $( ".stock-list.fm-list.t-blue-cont.h" ).find("div:contains("+key+")").parent().find(".quantity").find("input").trigger('keyup');
            }
        }
    }).catch(function(error) {
        console.log('There has been a problem with your fetch operation: ', error.message);
    });
}