GOG Orders history prices summary

Sum paid and original prices on orders history pages and get your total saved money on sales. Add new button (SUM ORDERS on this page) on Orders history page in settings.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name           GOG Orders history prices summary
// @version        1.52
// @namespace      XcomeX
// @author         XcomeX
// @license        Copyleft (Ɔ) GPLv3
// @description    Sum paid and original prices on orders history pages and get your total saved money on sales. Add new button (SUM ORDERS on this page) on Orders history page in settings.
// @include        https://www.gog.com/account/settings/orders
// @grant          GM_addStyle
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js
// ==/UserScript==


var targBtnLocation = document.getElementsByClassName("_search orders-header__search")[0].parentNode;

var zNode       = document.createElement ('div');
zNode.innerHTML = '<button id="sumPageButton" type="button">SUM THIS Page</button> <button id="sumAllButton" type="button">SUM ALL ORDERS</button>';
zNode.setAttribute ('id', 'sumContainer');
targBtnLocation.appendChild (zNode);

var xNode       = document.createElement ('div');
xNode.setAttribute ('id', 'sumResultsContainer');
targBtnLocation.appendChild (xNode);

var yNode       = document.createElement ('div');
yNode.setAttribute ('id', 'totalSumContainer');
targBtnLocation.appendChild (yNode);

document.getElementById ("sumPageButton").addEventListener (
    "click", SumPageButtonClickAction, false
);
document.getElementById ("sumAllButton").addEventListener (
    "click", SumAllPagesButtonClickAction, false
);

$( ".pagin" ).click(function() {
  window.scrollTo(0, 0);
});

GM_addStyle ( "                                    \
    #sumContainer  {                               \
        float:               right;                \
    }                                              \
    .sumRow  {                                     \
        font-weight:         100;                  \
    }                                              \
    .priceSum  {                                   \
        width:               51px;                 \
        display:             inline-block;         \
    }                                              \
    #sumAllButton, #sumPageButton {                \
        color:               #262626;              \
        font-weight:         600;                  \
        font-size:           14px                  \
        line-height:         1.5;                  \
        position:            relative;             \
        top:                 10px;                 \
        background:          #E0E0E0;              \
        border:              none;                 \
        padding-top: 3px;                          \
    }                                              \
    #sumAllButton {                                \
        color:               #ffffff;              \
        background:          #337ab7;              \
    }                                              \
    .deleteSumRowButton {                          \
        color:               gray;                 \
        font-size:           11px;                 \
        line-height:         1.5;                  \
        background:          none;                 \
        border:              none;                 \
        bottom:              2px;                  \
        position:            relative;             \
    }                                              \
    #sumAllButton:hover {                          \
        background:          #286090;              \
    }                                              \
    #sumPageButton:hover  {                        \
        background:          #EBEBEB;              \
    }                                              \
    .deleteSumRowButton:hover                  {   \
       text-decoration: underline;                 \
    }                                              \
    #sumResultsContainer, #totalSumContainer {     \
        text-align:          right;                \
    }                                              \
" );

async function SumNextPageAction() {
    var page = getCurrentPage();
    var totalPages = getTotalPages();
    if (page == totalPages) {
        return;
    } else {
        $(".pagin__next").click();
        sleep(800).then(() => {
            SumPageAction();
            SumNextPageAction();
        })
    }
}

function SumAllFromFirstPageAction() {
    $(".pagin__prev").click();
    sleep(500).then(() => {
        var page = getCurrentPage();
        if (page == "1") {
            SumPageAction();
            SumNextPageAction();
            return;
        }
        SumAllFromFirstPageAction();
    })
}

function SumPageButtonClickAction (zEvent) {
    SumPageAction();
}

function SumAllPagesButtonClickAction (zEvent) {
    SumAllFromFirstPageAction();
}

// ---------------------------------------------------------------------------------

function SumPageAction () {
    $("#sumResultsContainer").append(SumRow());

    $(".deleteSumRowButton").each(function( index ) {
        $(this).click(function() {
              $(this).closest('div').remove();
              $("#totalSumContainer").html(TotalSumRow());
            });
       });

    $("#totalSumContainer").html(TotalSumRow());
}

function SumRow() {
    purchasePrice = SumPurchasePrices().toFixed(2);
    originalPrice = SumOriginalPrices().toFixed(2);
    saved = (originalPrice - purchasePrice).toFixed(2);
    currency = "";
    page = pad(getCurrentPage());
    totalPages = getTotalPages();
    
    sumRow = 
        "<div id='sumRow" + page + "' class='sumRow'>" 
          + "ORDERS HISTORY PAGE " + page + " of " + totalPages + " | "
          + " Paid: " + currency + "<span class='priceSum sumPurchasePrice'>" + purchasePrice + "</span>"
          + " | Original price: " + currency + "<span class='priceSum sumOriginalPrice'>" + originalPrice + "</span>"
          + " | Saved: " + currency + "<span class='priceSum sumSaved'>" + saved + "</span>"
          + '<button class="deleteSumRowButton" type="button">remove</button>' 
        + "</div>"
    return sumRow;
}

function TotalSumRow () {
    var purchasePricesSum = 0.00;   
    $(".sumPurchasePrice").each(function( index ) {
       var price = $(this).text();    
        purchasePricesSum = purchasePricesSum + parseFloat(price || 0.0);
    });    

    var originalPricesSum = 0.00;   
    $(".sumOriginalPrice").each(function( index ) {
       var price = $(this).text();    
        originalPricesSum = originalPricesSum + parseFloat(price || 0.0);
    });    
    
    var savedSum = 0.00;   
    $(".sumSaved").each(function( index ) {
       var price = $(this).text();    
        savedSum = savedSum + parseFloat(price || 0.0);
    });        
    
    currency = getCurrencySymbol();
    totalSumRow = 
        "<div id='totalSumRow'>" 
          + "TOTAL"
          + " | Paid: " + currency + purchasePricesSum.toFixed(2)
          + " | Original price: " + currency + originalPricesSum.toFixed(2)
          + " | Saved: " + currency + savedSum.toFixed(2)
        + "</div>";
    return totalSumRow;
}

function SumPurchasePrices () {
    var sum = 0.00;
    tagWalletOrders();
    $(":not('.order-item__wallet').order-item__products [ng-bind='product.price.amount']").each(function( index ) {
       var price = 
          $(this)
           .clone()    //clone the element
           .children() //select all the children
           .remove()   //remove all the children
           .end()  //again go back to selected element
           .text();    
        sum = sum + parseFloat(price || 0.0);
    });    

    return sum;
}

function SumOriginalPrices () {
    var sum = 0.00;   
    $(".order-item__products [ng-bind='product.price.baseAmount']").each(function( index ) {
       var price = $(this).text();    
        sum = sum + parseFloat(price || 0.0);
    });    
    
    return sum;
}

function tagWalletOrders() {
    var wallet = $('span:contains("Wallet funds")');
    var walletOrders = wallet.closest(".order-item__products");
    walletOrders.addClass("order-item__wallet");
}

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

function pad (str) {
  str = str.toString();
  var max = getTotalPages().length;
  return str.length < max ? pad("0" + str, max) : str;
}

function getCurrencySymbol() {
    var priceText = $(".order-item__products [ng-bind='product.price.amount']").get(0);
    var symbol = window.getComputedStyle(priceText,':before').content.replace(/\"/g, '').trim();
    return symbol;
}

function getCurrentPage() {
    var currentPage = $(".pagin__input:first").val();    
    return currentPage;
}

function getTotalPages() {
    var totalPages = $(".pagin__total:first").text();    
    return totalPages;
}