GN_MoveEventCalc

Расчет прибыли для сопровождения караванов

  1. // ==UserScript==
  2. // @name GN_MoveEventCalc
  3. // @namespace Gradient
  4. // @description Расчет прибыли для сопровождения караванов
  5. // @include /^https{0,1}:\/\/(www\.heroeswm\.ru|178\.248\.235\.15)\/move_event\.php/
  6. // @version 1.0.2
  7. // @grant none
  8. // ==/UserScript==
  9.  
  10. //----------------------------------------------------------------------------//
  11.  
  12. "use strict";
  13.  
  14. //----------------------------------------------------------------------------//
  15.  
  16. var script_name = 'GN_MoveEventCalc'; // Enter your script name here
  17.  
  18. //----------------------------------------------------------------------------//
  19.  
  20. (function(){ try{ // wrapper start
  21. //----------------------------------------------------------------------------//
  22. var select = null;
  23. prepare_page();
  24. //----------------------------------------------------------------------------//
  25.  
  26. function prepare_page(){
  27. draw_difference_column();
  28. select = document.querySelector('select[name="sec_id"]');
  29. select.addEventListener('change', start_work);
  30. }
  31. //----------------------------------------------------------------------------//
  32. function draw_difference_column(){
  33. var img_td = document.querySelector('img[src*="move_event.jpg"]');
  34. var needed_trs = img_td.parentNode.parentNode.lastChild.firstChild.firstChild.childNodes;
  35. for(var i = 0, e = needed_trs.length; i < e; ++i){
  36. var childs = needed_trs[i].childNodes;
  37. var anchor_column = childs[childs.length - 2];
  38. if(!i){
  39. var header = anchor_column.cloneNode(true);
  40. header.textContent = 'Разница на 1 т. (зависит от сектора)';
  41. anchor_column.parentNode.insertBefore(header, anchor_column.nextSibling);
  42. continue;
  43. }
  44.  
  45. var content = anchor_column.cloneNode(true);
  46. content.textContent = '';
  47. anchor_column.parentNode.insertBefore(content, anchor_column.nextSibling);
  48. }
  49. }
  50. //----------------------------------------------------------------------------//
  51. function start_work(){
  52. var selected = +select.options[select.selectedIndex].value;
  53. var products = fill_products_table(selected);
  54. if(!products) //empty option
  55. return;
  56. var res = parse_caravan_table(products);
  57.  
  58. if(!res)
  59. return;
  60.  
  61. var profit = 0;
  62. products.forEach(function(current){
  63. profit += (current.sell_price - current.buy_price)*current.count;
  64. });
  65.  
  66. var input = document.getElementById('GN_MoveEventProfitInput');
  67. if(!input){
  68. input = document.createElement('input');
  69. input.id = 'GN_MoveEventProfitInput';
  70. input.type = 'text';
  71. input.style.width = '200px';
  72. input.setAttribute('disabled', '');
  73. res.caravan.parentNode.insertBefore(input, res.caravan.nextSibling);
  74. res.caravan.parentNode.insertBefore(document.createElement('br'), input.nextSibling);
  75. }
  76. input.value = 'Сумма прибыли: ' + profit.toFixed(0) + (res.has_errors ? ', есть ошибки при парсинге' : '');
  77. }
  78. //----------------------------------------------------------------------------//
  79. function parse_caravan_table(products){
  80. var unload = document.querySelector('input[value="unload"]');
  81.  
  82. if(!unload)
  83. return null;
  84.  
  85. var caravan = unload.parentNode.parentNode.querySelector('table');
  86. var tds = caravan.querySelectorAll('td');
  87. var unknown = false;
  88.  
  89. for(var i = 0; i < tds.length; i += 2){
  90. var img = tds[i].firstChild.getAttribute('src');
  91. var product = get_product(products, img);
  92. if(!product){
  93. unknown = true;
  94. continue;
  95. }
  96. product.count = +tds[i+1].textContent;
  97. console.log('test' + product.count)
  98. }
  99.  
  100. return { caravan: caravan, has_errors: unknown };
  101. }
  102. //----------------------------------------------------------------------------//
  103. function fill_products_table(selected){
  104.  
  105. var img_td = document.querySelector('img[src*="move_event.jpg"]');
  106. var needed_trs = img_td.parentNode.parentNode.lastChild.firstChild.firstChild.childNodes;
  107. var products = [];
  108.  
  109. for(var i = 1; i < needed_trs.length; ++i){ // 0 - header
  110. var childs = needed_trs[i].childNodes;
  111. var diff_column = childs[childs.length - 2];
  112. if(!selected){
  113. diff_column.textContent = '';
  114. continue;
  115. }
  116.  
  117. var img = childs[0];
  118. var weight = childs[1];
  119. var buy_price = childs[2];
  120. var sell_price = childs[3 + selected - 1];
  121.  
  122. var weight_n = weight.textContent.replace(',', '');
  123. var buy_price_n = buy_price.textContent.replace(',', '');
  124. var sell_price_n = sell_price.textContent.replace(',', '');
  125. var img_src = img.firstChild.getAttribute('src');
  126.  
  127. var difference = (+sell_price_n - +buy_price_n)/+weight_n;
  128. diff_column.textContent = difference.toFixed(2);
  129. products.push({img: img_src, weight: weight_n, buy_price: buy_price_n, sell_price: sell_price_n, count: 0});
  130. }
  131. return products.length > 0 ? products : null;
  132. }
  133. //----------------------------------------------------------------------------//
  134. function get_product(array_, img){
  135. var product = null;
  136. array_.forEach(function(current){
  137. if(current.img == img)
  138. product = current;
  139. });
  140.  
  141. return product;
  142. }
  143. //----------------------------------------------------------------------------//
  144. } catch(e){
  145. alert('Ошибка в скрипте ' + script_name + ', обратитесь к разработчику:\n' + e);
  146. throw e;
  147. }}()); // wrapper end
  148.  
  149. //----------------------------------------------------------------------------//