Esketit - Add Net Return to Statement

Proving to others that it's important

目前为 2024-10-20 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Esketit - Add Net Return to Statement
  3. // @namespace http://esketit.com/
  4. // @version 2024-10-20
  5. // @description Proving to others that it's important
  6. // @author rs232
  7. // @match https://esketit.com/investor/account-statement
  8. // @icon https://www.google.com/s2/favicons?sz=32&domain_url=https%3A%2F%2Fwww.esketit.com
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. // Store previous values to track changes
  16. let previousValues = {
  17. interestReceived: "0,00",
  18. bonusReceived: "0,00",
  19. referralBonusReceived: "0,00",
  20. secondaryMarketIncome: "0,00",
  21. secondaryMarketExpense: "0,00"
  22. };
  23.  
  24. // Function to check if any value has changed
  25. function checkValues() {
  26. let interestReceived = document.querySelector(".panel-row:nth-child(10) > .text-right");
  27. let bonusReceived = document.querySelector(".panel-row:nth-child(11) > .text-right");
  28. let referralBonusReceived = document.querySelector(".panel-row:nth-child(12) > .text-right");
  29. let secondaryMarketIncome = document.querySelector(".panel-row:nth-child(13) > .text-right");
  30. let secondaryMarketExpense = document.querySelector(".panel-row:nth-child(14) > .text-right");
  31.  
  32. // Check if any of the values have changed from their previous state
  33. if (
  34. (interestReceived && interestReceived.textContent.trim() !== previousValues.interestReceived) ||
  35. (bonusReceived && bonusReceived.textContent.trim() !== previousValues.bonusReceived) ||
  36. (referralBonusReceived && referralBonusReceived.textContent.trim() !== previousValues.referralBonusReceived) ||
  37. (secondaryMarketIncome && secondaryMarketIncome.textContent.trim() !== previousValues.secondaryMarketIncome) ||
  38. (secondaryMarketExpense && secondaryMarketExpense.textContent.trim() !== previousValues.secondaryMarketExpense)
  39. ) {
  40. // Delay to allow for data stabilization
  41. setTimeout(doMe, 500); // Adjust the timeout as needed
  42.  
  43. // Update previous values after displaying alerts
  44. previousValues.interestReceived = interestReceived ? interestReceived.textContent.trim() : "0,00";
  45. previousValues.bonusReceived = bonusReceived ? bonusReceived.textContent.trim() : "0,00";
  46. previousValues.referralBonusReceived = referralBonusReceived ? referralBonusReceived.textContent.trim() : "0,00";
  47. previousValues.secondaryMarketIncome = secondaryMarketIncome ? secondaryMarketIncome.textContent.trim() : "0,00";
  48. previousValues.secondaryMarketExpense = secondaryMarketExpense ? secondaryMarketExpense.textContent.trim() : "0,00";
  49. }
  50. }
  51.  
  52. function formatCurrency(value) {
  53. // Format the number with dots as thousand separators and two decimal places
  54. return value.toString().replace('.', ',').replace(/\B(?=(\d{3})+(?!\d))/g, '.');
  55. }
  56.  
  57. function doMe() {
  58. // Get values and strip out the Euro sign and unwanted spaces
  59. let interestReceived = parseFloat(document.querySelector(".panel-row:nth-child(10) > .text-right").textContent.replace('€', '').replace(/\s/g, '').replace(',', '.')) || 0;
  60. let bonusReceived = parseFloat(document.querySelector(".panel-row:nth-child(11) > .text-right").textContent.replace('€', '').replace(/\s/g, '').replace(',', '.')) || 0;
  61. let referralBonusReceived = parseFloat(document.querySelector(".panel-row:nth-child(12) > .text-right").textContent.replace('€', '').replace(/\s/g, '').replace(',', '.')) || 0;
  62. let secondaryMarketIncome = parseFloat(document.querySelector(".panel-row:nth-child(13) > .text-right").textContent.replace('€', '').replace(/\s/g, '').replace(',', '.')) || 0;
  63.  
  64. // For secondary market expense, we assume it's already a negative number
  65. let secondaryMarketExpense = parseFloat(document.querySelector(".panel-row:nth-child(14) > .text-right").textContent.replace('€', '').replace(/\s/g, '').replace(',', '.')) || 0;
  66.  
  67. // Calculate Net Interest (adding all variables including negative expense)
  68. let netInterest = interestReceived + bonusReceived + referralBonusReceived + secondaryMarketIncome + secondaryMarketExpense;
  69.  
  70. // Format the net interest for display
  71. const formattedNetInterest = formatCurrency(netInterest.toFixed(2));
  72.  
  73. // Create or update the Net Interest display div
  74. let netInterestDiv = document.getElementById('net-interest-display');
  75.  
  76. if (!netInterestDiv) {
  77. // Create new div if it doesn't exist
  78. netInterestDiv = document.createElement('div');
  79. netInterestDiv.id = 'net-interest-display';
  80. netInterestDiv.style.display = 'flex'; // Use flexbox for layout
  81. netInterestDiv.style.justifyContent = 'space-between'; // Space between items
  82. netInterestDiv.style.marginTop = '10px'; // Add some spacing above
  83. netInterestDiv.style.color = 'darkgreen'; // Set text color to dark green
  84. netInterestDiv.style.fontWeight = 'bold'; // Make text bold
  85.  
  86. const referenceLabel = document.createElement('div');
  87. referenceLabel.innerText = 'Net Interest';
  88.  
  89. const valueLabel = document.createElement('div');
  90. valueLabel.innerText = `€ ${formattedNetInterest}`;
  91.  
  92. netInterestDiv.appendChild(referenceLabel);
  93. netInterestDiv.appendChild(valueLabel);
  94.  
  95. // Insert the new div after the specified element
  96. const targetElement = document.querySelector('.mt-3');
  97. targetElement.parentNode.insertBefore(netInterestDiv, targetElement.nextSibling);
  98.  
  99. } else {
  100. // Update existing div with new Net Interest value
  101. netInterestDiv.children[1].innerText = `€ ${formattedNetInterest}`;
  102. }
  103. }
  104.  
  105. const targetElement = document.body; // Observe the whole body for changes
  106.  
  107. // Create a MutationObserver to watch for changes in the target element
  108. const observer = new MutationObserver((mutationsList) => {
  109. mutationsList.forEach(mutation => {
  110. // Call checkValues whenever there is a mutation
  111. checkValues();
  112. });
  113. });
  114.  
  115. // Configure the observer to watch for child nodes and character data changes
  116. observer.observe(targetElement, {
  117. childList: true,
  118. subtree: true,
  119. characterData: true
  120. });
  121.  
  122. // Initial check when the page loads
  123. window.addEventListener('load', checkValues);
  124. })();