// ==UserScript==
// @name Virtonomica:Заполнение склада
// @namespace virtonomica
// @description Помощник по заполнению склада
// @author UnclWish
// @include http*://*virtonomic*.*/*/main/unit/view/*
// @include http*://*virtonomic*.*/*/main/unit/view/*#
// @version 2.9
// ==/UserScript==
var run = function()
{
//----------------------------------------------------------------
var win = (typeof(unsafeWindow) != 'undefined' ? unsafeWindow : top.window);
var $ = win.$;
//---------------------------------------------------------------------
// работа с локальным хранилищем
//---------------------------------------------------------------------
/**
* записать данные в локальное хранилище, с проверкой ошибок
*/
function ToStorage(name, val)
{
try {
window.localStorage.setItem(name, JSON.stringify(val));
} catch(e) {
var out = "Ошибка добавления в локальное хранилище";
console.log(out);
}
}
//---------------------------------------------------------------------
// end of работа с локальным хранилищем
//---------------------------------------------------------------------
var wc_info = $("<div id=v_info></div>");
var wc_link = $("<div id=v_link></div>");
// Проверим ссылку что это игровое поле
var href = location.href;
if ((href).slice(-1)=="#") href = (href).slice(0,-1);
if ((href).slice(-3)=="old") href = (href).slice(0,-4);
var realm = href.replace('https://virtonomica.ru/','');
realm = realm.substr(0,4);
var tm_info_link = `https://virtonomica.ru/${realm}/window/globalreport/tm/info`;
var tm_api_link = `https://virtonomica.ru/api/${realm}/main/brandname/browse?pagesize=10000`;
var vl_info_link = `https://virtonomica.ru/${realm}/main/industry/unit_type/info/2011/volume`;
var title=$('#wrapper > div.metro_header > div > div.picture').attr('class');
if (title.search('unit-header-warehouse') == -1) return; // Выход если не склад
var a1=$('div.title').text().trim();
//var a2=a1.slice(0,5);
//if(a2 != "Склад") return; // Выход если не склад
var a3=(href).slice(-3);
//console.log(a3);
if (isNaN(a3)) return; //Выход если не главная страница
//console.log(a3);
if (a1.indexOf("Офис") == -1 ) return; //Выход если главная страница не нашей компании
$("table.infoblock").after(wc_info);
$("table.grid").after(wc_link);
function getValsArray() {
var vals_array = new Object();
$.ajax({
url: vl_info_link,
async: false, //то самое плохое место с синхронными запросами. Зато работает без дополнительных проверок. Но лучше избегать, конечно.
success: function(data){
var table = $("#mainContent > div.table-responsive.table-warehouse > table", data);
//console.log('table = ' + table.length);
//alert ('table = ' + table.length);
var tr = $("tbody > tr", table);
//console.log('tr = ' + tr.length);
for (var i=0; i<tr.length; i++){
//var th = $("th", tr.eq(i) );
var th = $("td>span>button>span>i", tr.eq(i) );
//var td = $("td", tr.eq(i) );
var td = $("td>span>span", tr.eq(i) );
var img = $("td>span>button", tr.eq(i) ).attr('data-link');
//console.log('img = ' + img.length);
//var src = img.attr('href');
for(var j=0; j< td.length; j++){
//var code = src.replace('https://virtonomica.ru/'+realm+'/main/product/info/','');
var arrayimg = img.split("&tpl");
arrayimg.pop();
//var imageName = array.join("");
var code = arrayimg[0].replace('https://virtonomica.ru/api/'+realm+'/main/product/info?id=','');
//var name = th.eq(j).text();
var name = th.eq(j).attr('data-content');
var vals = td.eq(j).text();
//vals = parseFloat( vals.replace('$', '').replace(' ', '').replace(' ', '').replace(' ', '') );
vals = parseFloat( vals.replace(/\u00A0/g, ''));
//console.log (vals);
vals_array[name] = new Object();
vals_array[code] = new Object();
vals_array[name].name = name;
vals_array[code].code = code;
vals_array[name].vals = vals;
vals_array[code].vals = vals;
}
}
ToStorage('vals_array', vals_array);
},
//ajaxError:
//$("#v_info").append("<br>" + np + " - нет данных по объемам хранения. Если товар не ТМ, сохраните данные на странице по <a href=https://virtonomica.ru/"+realm+"/main/industry/unit_type/info/2011/volume>ссылке</a>").css('color', 'red')
});
}
function getArrayTM() {
var arrayTM = new Object();
$.ajax({
url: tm_api_link,
async: false, //то самое плохое место с синхронными запросами. Зато работает без дополнительных проверок. Но лучше избегать, конечно.
success: function(TM){
var TMdata = TM.data;
//console.log(TMdata);
for (var key in TMdata) {
var symbolTM = TMdata[key].symbol;
var nameTM = TMdata[key].name;
var name = TMdata[key].product_name;
arrayTM[symbolTM] = new Object();
//ic_array[code] = new Object();
arrayTM[symbolTM].name = name;
//ic_array[code].code = code;
arrayTM[symbolTM].nameTM = nameTM;
//ic_array[code].vals = ic;
}
ToStorage('arrayTM', arrayTM );
},
//ajaxError:
//$("#v_info").append("<br>" + np + " - нет данных по объемам хранения. Если товар не ТМ, сохраните данные на странице по <a href=https://virtonomica.ru/"+realm+"/main/industry/unit_type/info/2011/volume>ссылке</a>").css('color', 'red')
});
}
function getArrayTMold() {
var arrayTM = new Object();
$.ajax({
url: tm_info_link,
async: false, //то самое плохое место с синхронными запросами. Зато работает без дополнительных проверок. Но лучше избегать, конечно.
success: function(data){
var tmimg_data = $("td>img[src*='/img/products']",data);
//console.log (tmimg_data);
//var tm_data = $("td>img[src*='/img/products']",data).parent().next();
for (var i=0; i<tmimg_data.length; i++) {
var tm_data = tmimg_data.eq(i).parent().next();
var code = tmimg_data.eq(i).attr('src');
//console.log(code);
var tm_name = tm_data.text();
tm_name = tm_name.split('\n');
tm_name = tm_name[2].trim();
//np = tm_name;
var name = tm_name;
//console.log(name);
arrayTM[name] = new Object();
arrayTM[code] = new Object();
arrayTM[name].name = name;
arrayTM[name].code = code;
arrayTM[code].name = name;
}
ToStorage('arrayTM', arrayTM );
},
//ajaxError:
//$("#v_info").append("<br>" + np + " - нет данных по объемам хранения. Если товар не ТМ, сохраните данные на странице по <a href=https://virtonomica.ru/"+realm+"/main/industry/unit_type/info/2011/volume>ссылке</a>").css('color', 'red')
});
}
function num(num, x){
//num = num.toFixed(2);
var parts = num.split('.');
parts[0] = parts[0].substr(0, parts[0].length%3)+parts[0].substr(parts[0].length%3).replace(/(\d{3})/g,' \$1');
if (parts[0].length%4 == 0) parts[0] = parts[0].slice(1);
if (x) return parts.join('.');
else return parts[0];
}
function UpdateValsStorage() {
// удаляем данные по объемам хранения и обновляем страницу
window.localStorage.removeItem('vals_array');
getValsArray();
location.reload();
}
var vals_array = JSON.parse(window.localStorage.getItem('vals_array'));
if (vals_array == null) {
getValsArray();
vals_array = JSON.parse(window.localStorage.getItem('vals_array'));
}
//var UpdateVals = $('<input type=submit class=button100 id=bsave value="Обновить">').unbind('click').click(function() {
var UpdateVals = $('<button id=bsave>Обновить</button>').unbind('click').click(function() {
UpdateValsStorage();
});
$("#v_info").html("Вы можете обновить значения объемов хренения, если они изменились ").css('color', 'blue').append(UpdateVals);
// -------------------------- определяем размер склада
var valskl = $("table.infoblock td.title:eq(0)").next().text();
var typeskl = $("table.infoblock td.title:eq(1)").next().text();
var valskl2 = valskl.slice(-10).slice(0,1);
valskl = parseFloat(valskl) * 1000;
//console.log (valskl);
//console.log (valskl2);
if (valskl2 == "н") valskl = valskl * 1000;
//console.log (typeskl);
if (typeskl == "Загоны для животных") valskl = valskl * 10
// -------------------------------------------------------------------------------------------------
/// -------------------------- добавляем столбцы, расчитываем и выводим новое заполнение склада
var r = 0;
var sumproc = 0; // суммарный процент заполнения
$("table.grid tbody tr[class]").each( function(){
var nameprod = $("td:eq(0)",this).text();
//console.log(nameprod);
//if ((nameprod).slice(-8) == "(устар.)") {nameprod = nameprod.replace(' (устар.)','')};
var imgprod = $("td:eq(0)>img",this).attr('src');
var symbol = imgprod.replace('/img/products/','');
symbol = symbol.replace('.gif','');
//console.log(symbol);
var nowqual = $("td:eq(1)",this).text().trim().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '');
var nowsale = $("td:eq(5)",this).text().trim().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '');
var nowzak = $("td:eq(6)",this).text().trim().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '');
var newqual = nowqual - nowsale;
if (newqual < 0) newqual = 0;
newqual = newqual + nowzak * 1;
var sklproc = Get_skl_procent(symbol, imgprod, nameprod, valskl, newqual);
/*if (isNaN(sklproc)) { // Если нет в базе, т.е. ТМ-ка, пробуем расчитать по складской процентовке, иначе считаем "0"
var nowproc=$("td:eq(9)",this).text();
nowproc=parseFloat(nowproc)*1;
sklproc=0;
if (nowproc!=0) {
sklproc=nowproc*newqual/nowqual;
}
}*/
sklproc = sklproc.toFixed(2);
var tcolor = "green";
if (sklproc > 69.99) tcolor = "orange";
if (sklproc > 89.99) tcolor = "red";
var txt = "<td align=right class=nowrap style=color:"+tcolor+">"+sklproc+" %</td>";
if (r == 0) $(this).prev().append('<th>Будет %</th><th>');
r = r + 1;
sumproc = sumproc + sklproc * 1;
$(this).append(txt);
});
// -------------------------- добавляем сведения о доставках на склад -----------------------------------
var prod_name = [];
var prod_qual = [];
//var prod_img1;
var prod_img = [];
var symbol = [];
var new_url = href+"/delivery";
//console.log(new_url);
var u = 0;
var a = 0;
var b = 0;
$.get(new_url, function(data) {
//$('#mainContent>table.list>tbody>tr[class]>td',data).each(function() {
$('#mainContent > div.table-responsive > table > tbody > tr > td',data).each(function() {
switch (u){ // Доставляемый товар и количество
case 0:
prod_name[a] = $(this,data).text().trim();
//prod_img[a] = $("img[src*='/img/products']",this).attr('src');
//prod_img1 = $("i[class*='ico pr-ico']",this).attr('class').split(/\s/g);
prod_img[a] = $("i[class*='ico pr-ico']",this).attr('class');
//prod_img[a] = prod_img1[2];
//prod_img1 = prod_img1[2].split("-");
//prod_img[a] = "/img/products/"+prod_img1[1]+".gif";
//console.log(prod_img[a]);
a = a + 1;
break;
case 1:
prod_qual[b] = $(this,data).text().trim().replace(/\u00A0/g, '').replace(/\s/g, '');
b = b + 1;
break;
}
//console.log(prod_name[a], prod_qual[a]);
u = u + 1;
if (u==3) u = 0;
});
//console.log(prod_name, prod_qual);
if (u==0) var valdos = 0;
var dossum = AfterLoad (valskl, prod_name, prod_qual, prod_img);
sumproc = sumproc + dossum * 1;
sumproc = sumproc.toFixed(2);
var tcolor2 = "green";
if (sumproc > 69.99) tcolor2 = "orange";
if (sumproc > 89.99) tcolor2 = "red";
$("table.grid tbody").append("<tr><td style=color:blue>Просмотр <a href="+vl_info_link+">объемов хранения</a> и <a href="+tm_info_link+">списка ТМ</a><td><td><td><td><td><td><td><td><td>Итого:</td><td align=right class=nowrap style=color:"+tcolor2+">"+sumproc+" %</td></tr>");
});
//-------------------------------------------------------------------------------------------------------------
// -------------------------- расчет процента заполнения склада-------------------------------------------------
function Get_skl_procent(spi, ip, np, vs, vp){
if (vals_array[np] == null ) {
var arrayTM = JSON.parse(window.localStorage.getItem('arrayTM'));
if (arrayTM == null) {
getArrayTM();
arrayTM = JSON.parse(window.localStorage.getItem('arrayTM'));
}
//console.log(np,spi,ip);
if (arrayTM[spi] == null) {
$("#v_info").append('Объемы хранения товара "'+np+'" не найдены, возможно новый товар. Обновляем базу объёмов складируемой продукции...').css('color', 'red').css('font-size', '8pt');
getValsArray();
vals_array = JSON.parse(window.localStorage.getItem('vals_array'));
if (vals_array[np] == null ) {
$("#v_info").append('Объемы хранения товара "'+np+'" не найдены, возможно новый товар с ТМ. Обновляем базу объёмов складируемой продукции ТМ...').css('color', 'red').css('font-size', '8pt');
getArrayTM();
arrayTM = JSON.parse(window.localStorage.getItem('arrayTM'));
np = arrayTM[spi].name;
//console (np, name);
}
}
else np = arrayTM[spi].name;
}
var proc = vp / vals_array[np].vals * 10000 / vs * 100;
return proc;
}
// -------------------------- расчет процента доставки на склад-------------------------------------------------------
function AfterLoad (vs, p_n, p_q, p_i){
var sp = 0;
for (var y=0; y<p_n.length; y++) {
var np = p_n[y];
var vp = p_q[y];
var ip = p_i[y];
var dosproc = Get_skl_procent (ip, ip, np, vs, vp);
var tcolor3 = "green";
if (dosproc > 69.99) tcolor3 = "orange";
if (dosproc > 89.99) tcolor3 = "red";
dosproc = dosproc.toFixed(2);
var vpnum = num (vp, false);
//$("table.grid tbody").append("<tr style='BACKGROUND-COLOR : #d0f0c0'><td><img src='"+ip+".svg' alt='"+np+"' width='25' align=middle style='margin-right: 10px' border=0>"+np+"<td><td><td><td><td><td><td align=right>"+vpnum+"<td><td>Доставка :</td><td align=right class=nowrap style=color:"+tcolor3+">"+dosproc+" %</td></tr>");
$("table.grid tbody").append("<tr style='BACKGROUND-COLOR : #d0f0c0'><td><i class='"+ip+"' data-container='body' data-trigger='hover' data-placement='right' data-content='"+np+"' data-original-title title></i>"+np+"<td><td><td><td><td><td><td align=right>"+vpnum+"<td><td>Доставка :</td><td align=right class=nowrap style=color:"+tcolor3+">"+dosproc+" %</td></tr>");
sp = sp + dosproc * 1;
}
sp = sp.toFixed(2);
tcolor3 = "green";
if (sp > 69.99) tcolor3 = "orange";
if (sp > 89.99) tcolor3 = "red";
if (sp == 0) $("table.grid tbody").append("<tr><td><td><td><td><td><td><td><td><td><td>Доставок нет</td><td align=right class=nowrap style=color:"+tcolor3+"></td></tr>");
else $("table.grid tbody").append("<tr><td><td><td><td><td><td><td><td><td><td>Доставка всего:</td><td align=right class=nowrap style=color:"+tcolor3+">"+sp+" %</td></tr>");
return sp;
}
};
var script = document.createElement("script");
script.textContent = '(' + run.toString() + ')();';
document.documentElement.appendChild(script);