Greasy Fork is available in English.

eRepublik Licenses and taxes

Table with licenses and taxes in the inventory. Scan for prices in sortable table. Also checks for the old license bug, when aliens are on top of the list of sellers. Now with job offers.

// ==UserScript==
// @name		eRepublik Licenses and taxes
// @version		0.3.4
// @include		*www.erepublik.com/*/main/inventory*
// @description Table with licenses and taxes in the inventory. Scan for prices in sortable table.  Also checks for the old license bug, when aliens are on top of the list of sellers. Now with job offers.
// @require     https://code.jquery.com/jquery-3.5.1.min.js
// @require     https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.18.3/js/jquery.tablesorter.min.js
// @namespace   https://greasyfork.org/users/2402
// ==/UserScript==

var $ = jQuery;

function AddStyle(t) {
    $("head").append("<style>" + t + "</style>");
}

function getObjects(obj, key, val) {
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getObjects(obj[i], key, val));
        } else if (i == key && obj[key] == val) {
            objects.push(obj);
        }
    }
    return objects;
}

function getCountryInfo(countryId, countryName) {
    var price = 0;
    var taxes = 0;
    var stock = 0;
    var cost = 0;

    function e(c, i, q, cn) {
        q = isNaN(q) ? 1 : q;
        return '<a href="//www.erepublik.com/' + erepublik.settings.culture + "/economy/marketplace#" + c + "/" + i + "/" + q + '" target="_blank"> ' + cn + "</a>";
    }
    var url = "/" + erepublik.settings.culture + "/economy/marketplaceAjax";
    $.ajax({
        url: url,
        type: "POST",
        data: { countryId: countryId, industryId: industry, quality: quality, orderBy: "price_asc", currentPage: 1, ajaxMarket: 1, _token: SERVER_DATA.csrfToken, },
        success: function(offers) {
        var i = 1;
        try {
            $(offers.offers).each(function(id, offer) {
                var stockr = parseInt(offer.amount);
                var pricer = parseFloat(offer.priceWithTaxes);
                if (price === 0) {
                    stock = stockr;
                    price = pricer;
                } else {
                    if (pricer > price) {
                        return false;
                    } else {
                        stock = stock + stockr;
                        i++;
                    }
                }
            });
        } catch (err) {
            console.log(err.message);
        }
        var country = scope.settings.countries[countryId];
        var war = country.war == 1 ? " war" : "";
        var embargo = country.embargo == 1 ? " embargo" : "";
        var conquered = country.isConquered == 1 ? " conquered" : "";
        var taxes = country.taxes[industry].valueAddedTax + country.taxes[industry].importTax;
        var local = scope.settings.myCountry == countryId ? " local" : "";
        var cost = price / (1 + taxes / 100);
        var coeff = [0, 2, 4, 6, 8, 10, 12, 20];
        var pricePerHP = price / coeff[quality];
        var foodHP = industry == 1 ? '<td class="pricescell ' + local + '">' + pricePerHP.toFixed(3) + "</td>" : "";
        taxes += " %";
        var image = "//www.erepublik.net/images/flags_png/M/" + countryName + ".png";
        var license = (getObjects(licensesObj, 'countryId', countryId).length == 1) ? ' license' : '';
        if (stock > 0) {
            stock = i == 10 ? "&gt;" + stock : stock;
            $("#inventory_overview .pricesTable table tbody").append("<tr>" + '<td style="text-align: left;" class="pricescell ' + conquered + war + embargo + local + '">' + '<img style="vertical-align: top;" src="' + image + '"> ' + e(countryId, industry, quality, countryName) + "</td>" + '<td class="pricescell' + local + license + '">' + taxes + "</td>" + '<td class="pricescell ' + local + '">' + stock + "</td>" + '<td class="pricescell ' + local + '"><span id="prc' + countryId + '">' + price.toFixed(2) + "</span></td>" + '<td class="pricescell ' + local + '">' + cost.toFixed(4) + '</td>' + foodHP + "</tr>");
        }
        var ww = Math.round(ct / ctl * 100);
        $('#ctProgress div').css("width", ww + "%").text(ww + "%");
        if (ct == ctl) {
            setTimeout(function() {
                $("#marketPrices").tablesorter({
                    sortList: [
                        [3]
                    ]
                });
            }, 1e3);
        }
        ct++;
    }
    })
}

function getPrices() {
    var img = $("#sell_product").attr("src");
    var thHP = industry == 1 ? '<th style="text-align: center;">$/HP</th>' : '';
    $("#sell_offers").after('<div class="pricesTable" style="display: block;">' + '<table width="100%" id="marketPrices" class="tablesorter">' + "<thead>" + "<tr>" + '<th style="height: 40px; text-align: center; padding-left: 5px;"> <img src=' + img + ' alt=""><div id="ctProgress"><div></div></div></th>' + '<th style="height: 40px; text-align: center; padding-left: 0px; width: 135px;">  Taxes (import+vat) </th>' + '<th style="height: 40px; text-align: center; padding-left: 0px; width: 100px;"> Stock (total) </th>' + '<th style="height: 40px; text-align: center; padding-left: 0px; width: 90px;"> Sell price </th>' + '<th style="height: 40px; text-align: center; padding-left: 0px; width: 115px;"> Price w.o. taxes </th>' + thHP + "</tr>" + "</thead>" + "<tbody></tbody>" + "</table>" + "</div>");
    ct = 1;
    $.each(countries, function(n, countryObj) {
        if (typeof countryObj.countryId != 'undefined') {
            getCountryInfo(countryObj.countryId, countryObj.permalink);
        }
    });
}

function getJobInfo(countryId, countryName) {
    var price = 0,
        taxes = 0,
        stock = 0;

    function e(c, cn) {
        return '<a href="//www.erepublik.com/' + erepublik.settings.culture + "/economy/job-market/" + c + '" target="_blank"> ' + cn + "</a>";
    }
    $.ajax({
        url: "/" + erepublik.settings.culture + "/economy/job-market-json/" + countryId + "/1/desc/",
        success: function(t) {
        var i = 1;
        if (t.jobs.length > 0) {
            var bestOffer = 0,
                company = '';
            for (var cs = 0; cs < t.jobs.length; cs++) {
                if (t.jobs[cs].netSalary > bestOffer) {
                    bestOffer = t.jobs[cs].netSalary.toFixed(2);
                    company = t.jobs[cs].companyName;
                }
            }
            var wage = t.jobs[0].salary.toFixed(2);
            var conquered = "";
            var local = countryId == countryId ? " local" : "";
            var image = "//www.erepublik.net/images/flags_png/M/" + countryName + ".png";
            var times = parseInt(t.jobs[0].salaryLimit.toFixed(2) / wage);
            if (!isNaN(wage)) {
                $("#inventory_overview .pricesTable table tbody").append("<tr>" + '<td style="text-align: left;" class="pricescell ' + conquered + local + '">' + '<img style="vertical-align: top;" src="' + image + '"> ' + e(countryId, countryName) + "</td>" + '<td class="pricescell' + local + '">' + company + "</td>" + '<td class="pricescell' + local + '">' + wage + "</td>" + '<td class="pricescell' + local + '">' + bestOffer + '</td><td class="pricescell' + local + '">' + times + "</td>" + "</tr>");
            }
            var ww = Math.round(ct / ctl * 100);
            $('#ctProgress div').css("width", ww + "%").text(ww + "%");
            if (ct == ctl) {
                setTimeout(function() {
                    $("#marketPrices").tablesorter({
                        sortList: [
                            [3, 1]
                        ]
                    });
                }, 500);
            }
        }
        ct++;
    }
    })
}

function getJobOffers() {
    $("#sell_offers").after('<div class="pricesTable" style="display: block;">' + '<table width="100%" id="marketPrices" class="tablesorter">' + "<thead>" + "<tr>" + '<th style="height: 40px; text-align: center; padding-left: 5px;"> <div id="ctProgress"><div></div></div></th>' + '<th style="height: 40px; text-align: center; padding-left: 0px; width: 135px;">  Company name </th>' + '<th style="height: 40px; text-align: center; padding-left: 0px; width: 135px;">  Wage </th>' + '<th style="height: 40px; text-align: center; padding-left: 0px; width: 135px;">  Net wage </th><th>Limit</th>' + "</tr>" + "</thead>" + "<tbody></tbody>" + "</table>" + "</div>");
    ct = 1;
    $.each(countries, function(n, countryObj) {
        if (typeof countryObj.countryId != 'undefined') {
            getJobInfo(countryObj.countryId, countryObj.permalink);
        }
    });
}


var scope = angular.element('.offers_market').scope();
var countries = scope.settings.countries;
var licensesObj = scope.data.owned;
var industry;
var quality;
var ct = 0;
var ctl = Object.keys(countries).length - 4;


(function() {
    'use strict';
    AddStyle("#inventory_overview #sell_offers table th span#netPriceG,#inventory_overview #sell_offers table th span#netPrice, #inventory_overview #sell_offers table th span#totalNetPriceG,#inventory_overview #sell_offers table th span#totalNetPrice { float: left; height: 14px; clear: both; padding: 8px 0px; padding-left: 5px; color: #88AFC9;  font-size: 12px;  font-weight: bold; }");
    AddStyle("#inventory_overview #sell_offers table td.total_net_price { text-align: right; padding-right: 25px; padding-left: 0; }");
    AddStyle("#inventory_overview .taxTable { background-color: #BAE7F9; float: left; width: 730px; position: relative; -moz-border-radius: 5px; -webkit-border-radius: 5px;border-radius: 5px; margin-top: 11px; margin-left: 15px; }");
    AddStyle("#inventory_overview .taxTable table { width: 718px; border: 1px solid #95D4ED; background: white; margin: 5px auto; }");
    AddStyle("#inventory_overview .taxTable table th { background: #F7FCFF; }");
    AddStyle("#inventory_overview .taxTable table tbody td { border-top: 1px solid #E2F3F9; color: #5E5E5E; padding: 5px 0 5px 25px; }");
    AddStyle("#inventory_overview .taxTable table tbody tr:hover td { background-color: #FFFFE7; }");
    AddStyle("#inventory_overview .taxTable table .taxLink { cursor: pointer; }");
    AddStyle("#inventory_overview .taxTable table .taxLink .taxLinkHolder { border: 2px solid #CFEFFB; border-radius: 3px; -moz-border-radius: 3px; position: absolute; margin-top: -7px; display: none; z-index: 100; }");
    AddStyle("#inventory_overview .taxTable table .taxLink:hover .taxLinkHolder { display: block; }");
    AddStyle("#inventory_overview .taxTable table .taxLink .taxLinkHolder .taxLinkItemTransparent { background: none repeat scroll 0 0 transparent; text-align: center; height: 25px; }");
    AddStyle("#inventory_overview .taxTable table .taxLink .taxLinkHolder .taxLinkItem { background-color: #FFFFE7; text-align: center; }");
    AddStyle("#inventory_overview .taxTable table .taxLink .taxLinkHolder .taxLinkItem:hover { background-color: #F7FCFF !important; }");
    AddStyle("#inventory_overview .pricesTable { background-color: #BAE7F9; float: left; width: 730px; position: relative; -moz-border-radius: 5px; -webkit-border-radius: 5px;border-radius: 5px; margin-top: 11px; margin-left: 15px; }");
    AddStyle("#inventory_overview .pricesTable table { width: 718px; border: 1px solid #95D4ED; background: white; margin: 5px auto; }");
    AddStyle("#inventory_overview .pricesTable table th { background: #F7FCFF; cursor: pointer; }");
    AddStyle("#inventory_overview .pricesTable table tbody td { border-top: 1px solid #E2F3F9; color: #5E5E5E; padding: 5px 0 5px 25px; }");
    AddStyle("#inventory_overview .pricesTable table tbody tr:hover td { background-color: #FFFFE7; }");
    AddStyle("#inventory_overview .pricesTable .conquered { text-decoration: line-through; }");
    AddStyle("#inventory_overview .pricesTable .war, #inventory_overview .pricesTable .embargo { color: red; }");
    AddStyle("#inventory_overview .pricesTable .license { color: #1E9E1E; }");
    AddStyle(".tablesorter-headerUnSorted { background: transparent url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==) no-repeat center right !important; }");
    AddStyle(".tablesorter-headerDesc { background: transparent url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7) no-repeat center right !important; }");
    AddStyle(".tablesorter-headerAsc { background: transparent url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7) no-repeat center right !important; }");
    AddStyle("#inventory_overview .pricesTable .local { background-color: #efefef; }");
    AddStyle("#inventory_overview .pricesTable .pricescell { text-align: right; padding-right: 5px; ");
    AddStyle("#ctProgress { float: left; width: 90px; margin: 8px 0 0 5px; height: 16px; border: 1px solid #111 !important; background-color: #292929 !important; }");
    AddStyle("#ctProgress div { height: 100%; color: #fff; text-align: right; line-height: 16px; width: 0; background-color: #0099ff !important; }");
    AddStyle(".prcgreen { color: green !important; }");
    AddStyle(".newfield {float: left; min-height: 54px; margin-left: 11px; padding: 3px 10px 0 10px; border-radius: 5px 5px 5px 5px; background: rgba(231,247,253,1); background: -moz-linear-gradient(top, rgba(231,247,253,1) 0%, rgba(186,231,249,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(231,247,253,1)), color-stop(100%, rgba(186,231,249,1))); background: -webkit-linear-gradient(top, rgba(231,247,253,1) 0%, rgba(186,231,249,1) 100%); background: -o-linear-gradient(top, rgba(231,247,253,1) 0%, rgba(186,231,249,1) 100%); background: -ms-linear-gradient(top, rgba(231,247,253,1) 0%, rgba(186,231,249,1) 100%); background: linear-gradient(to bottom, rgba(231,247,253,1) 0%, rgba(186,231,249,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e7f7fd', endColorstr='#bae7f9', GradientType=0 );}");
    AddStyle(".jobsfield {width: 120px;}");
    AddStyle(".newfield button {border:1px solid #999; border-radius: 5px 5px 5px 5px; -moz-border-radius: 5px 5px 5px 5px; -webkit-border-radius: 5px 5px 5px 5px; margin: 3px 0;}");
    AddStyle("#pitanka, #bugchk, #jobs, #housepack {cursor: pointer;}");
    AddStyle("#donate {clear: both; padding: 10px 0 0 15px; text-transform: uppercase;}");
    $("#sell_offers").after('<div id="myTest"><div ng-controller="MyController"></div></div>');
    $("#sell_offers").before("<span class='newfield'><button id='pitanka'>check prices</button></span>");
    $("#sell_offers").before("<span class='newfield jobsfield'><button id='jobs'>check job offers</button></span>");

    $("#pitanka").click(function() {
        $(".pricesTable").remove();
        industry = scope.inputs.selectedIndustry;
        quality = scope.inputs.selectedQuality;
        getPrices();
    });
    $("#jobs").click(function() {
        $(".pricesTable").remove();
        getJobOffers();
    });

    $('.offers_product .head_select').click(function() {
        angular.element('div[ng-controller="ErpkSellItemsController"]').scope().data.inventory = {1: {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1}, 2: {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1}, 3: {1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, 4: {1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, 23: {1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, }
    })

})();