Virtomomica: IC

Индикативные цены - автопарсинг и отображение на вкладке "Сбыт"

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Virtomomica: IC
// @namespace   virtonomica
// @description Индикативные цены - автопарсинг и отображение на вкладке "Сбыт"
// @match       http*://virtonomica.ru/*/main/unit/view/*/sale*
// @version     2.2
// @author      UnclWish
// ==/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=p_info></div>");
	var ic_info = $("<div id=ic_info></div>");

	// Проверим ссылку что это игровое поле
	var href = location.href;
	var realm = href.replace('https://virtonomica.ru/','');
	realm = realm.substr(0,4);
	var country = $("div.title a[href*='/main/geo/regionlist/']").attr('href');
	country = /(\d+)/.exec(country)[0];
	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 ic_info_link = `https://virtonomica.ru/api/${realm}/main/geo/country/duty?app=adapter_vrt&format=html&country_id=423475&sort=category_name%2Fasc%2Cproduct_name%2Fasc&tpl=geo%2Fcountry%2Fduty`;
	var ic_api_link = `https://virtonomica.ru/api/${realm}/main/geo/country/duty?country_id=${country}`;

	var a1=$('div.title').text().trim();
	if (a1.indexOf("Офис") == -1 ) return; //Выход если главная страница не нашей компании

	var title=$('#wrapper > div.metro_header > div > div.picture').attr('class');
	if (title.search('unit-header-network') != -1) return; // Выход если Сеть коммуникационных вышек

	//console.log( href );
	/*if (href.indexOf('countrydutylist') > 0) {
		//console.log('parsing....');
		var wc_parsing = $("<li><div id=parsing style='float:left;cursor:pointer; color: white;'> <img title='Запомнить ИЦ' alt='Запомнить ИЦ' src='http://www.iconsearch.ru/uploads/icons/snowish/32x32/document-save-as.png'> </div>");

		//var container = $('#topblock').next();
        var container = $('li.la').parent();
		//container = $("li:last", container).prev().parent();
        container.append( wc_parsing ) ;

		$("table.list").before( wc_info );

		$("#parsing").click( function() {
			var ic_array = new Object();

			var table = $("table.list");
			//console.log('table = ' + table.length);
			var tr = $("tr.odd, tr.even", table);
			//console.log('tr = ' + tr.length);
			for (var i=0; i<tr.length; i++){
				var td = $("td > img", tr.eq(i) );
				//console.log('td = ' + td.length);
				for(var j=0; j< td.length; j++){
					var src = td.eq(j).attr('src');
					//console.log( src );
					var name = td.eq(j).parent().next().text();
					//alert (name);
                    //console.log( name );
					var ic = td.eq(j).parent().next().next().next().next().text();
					ic = parseFloat( ic.replace('$', '').replace(' ', '').replace(' ', '').replace(' ', '') );
					//console.log( ic );
					ic_array[ src ] = new Object();
					ic_array[ src ].name = name;
					ic_array[ src ].ic = ic;
				}

			}

			//console.log( JSON.stringify( ic_array ) );
			ToStorage('ic_array', ic_array );
			$("#p_info").html("Запомнили значения ИЦ").css('color', 'green');

		});
	}*/

	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 getICArray() {
		var ic_array = new Object();
		$.ajax({
		url: ic_api_link,
		async: false, //то самое плохое место с синхронными запросами. Зато работает без дополнительных проверок. Но лучше избегать, конечно.
		success: function(IC){
					var ICdata = IC.data;
					for (var key in ICdata) {
					var name = ICdata[key].product_name;
					var ic = ICdata[key].min_cost;
					ic_array[name] = new Object();
					//ic_array[code] = new Object();
					ic_array[name].name = name;
					//ic_array[code].code = code;
					ic_array[name].ic = ic;
					//ic_array[code].vals = ic;
				}
			ToStorage('ic_array', ic_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 getICArray2() {
		var ic_array = new Object();
		$.ajax({
		url: ic_info_link,
		async: false, //то самое плохое место с синхронными запросами. Зато работает без дополнительных проверок. Но лучше избегать, конечно.
		success: function(data){
			var table = $('.table', data);
			//console.log('table = ' + table.length);
			//alert ('table = ' + table.length);
			var tr = $("td", table);
			//console.log('tr = ' + tr.length);
			for (var i=1; i<tr.length; i+=5){
				var th = $(tr.eq(i));
				var td = $(tr.eq(i+3));
				//var img = $("a", tr.eq(i) );
				//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 name = th.text();
					var ic = td.text();
					var icm = 1;
					if (ic.search('K')>0) icm = 1000;
					if (ic.search('M')>0) icm = 1000000;
					ic = parseFloat(ic.replace('©', '').replace(' ','').replace(' ','').replace(/\u00A0/g, '')) * icm;
					ic = num (ic, false);
					ic_array[name] = new Object();
					//ic_array[code] = new Object();
					ic_array[name].name = name;
					//ic_array[code].code = code;
					ic_array[name].ic = ic;
					//ic_array[code].vals = ic;
				//}
			}
			ToStorage('ic_array', ic_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);
            var table = $('#tm-list-browse > div.tm-listing > div:nth-child(1)',data);
            //console.log (table);
            var tmimg_data = $("div[class='item']",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 UpdateICStorage() {
		// удаляем данные по объемам хранения и обновляем страницу
		window.localStorage.removeItem('ic_array');
		getICArray();
		location.reload();
	}

	//console.log('start IC');

	var UpdateIC = $('<button id=bsave>Обновить</button>').unbind('click').click(function() {
		UpdateICStorage();
	});

	$("table.grid").before(wc_info);

	$("#p_info").html("Вы можете обновить Индикативные цены, возможно они изменились ").css('color', 'blue').css('font-size', '10pt').append(UpdateIC);

	//  Все остальные страницы
	var ic_array = JSON.parse(window.localStorage.getItem('ic_array'));
	if (ic_array == null ) {
		getICArray();
		ic_array = JSON.parse(window.localStorage.getItem('ic_array'));
	}

	//console.log(arrayTM);
	//console.log(ic_array['Молоко'].ic);


		//$("#p_info").html("Не удалось получить значения ИЦ из локального хранилища").css('color', 'red');
	//} else{
		//$("#p_info").html( JSON.stringify( ic_array ) );
	//}

	// сбыт
	if (href.indexOf('sale') > 0) {

		var table = $("table.grid");

		//var tr = $("tr[class*='even'], tr[class*='odd'], tr[class*='selected']", table);
		var tr = $("tr[class]", table);
		//console.log('tr = ' + tr.length);
		for (var i=0; i<tr.length; i++){
			var td = $("td > a > img", tr.eq(i));
			//console.log (td.length);
            switch (td.length) {
                case 3: td = td.eq(2); break;
                case 2: td = td.eq(1); break;
                default: td = td.eq(0); break;
                }
            //if ( td.length == 2) td = td.eq(1);
			//else td = td.eq(0);

			//console.log("td= " + td.parent().html() );
			var src = td.attr('src');
            var symbol = src.replace('/img/products/','');
            symbol = symbol.replace('.gif','');
			//var id_item = td.parent();
			//var id = /(\d+)/.exec(id_item.attr('href'))[0];
			var name = td.attr('alt');
                //if ((name).slice(-8) == "(устар.)") {name = name.replace(' (устар.)','')};
			//console.log(id, id_item);
            //console.log(name, src, symbol);
            //Брендовые товары
            /*switch (src) {
                case "/img/products/vera/brand/lambardy.gif": src = "/img/products/showercubicle.gif"; break;
                case "/img/products/brand/krakow.gif": src = "/img/products/sausages.gif"; break;
                case "/img/products/vera/brand/abibas.gif": src = "/img/products/shoes.gif"; break;
                case "/img/products/vera/brand/v-times.gif": src = "/img/products/press.gif"; break;
                case "/img/products/vera/brand/0909/pbp.gif": src = "/img/products/instant.gif"; break;
                case "/img/products/vera/brand/vaz2106.gif": src = "/img/products/car.gif"; break;
                case "/img/products/brand/car_sedan_fr1.gif": src = "/img/products/car_sedan.gif"; break;
                case "/img/products/vera/brand/1466876.gif": src = "/img/products/car.gif"; break;
                case "/img/products/vera/brand/1916457.gif": src = "/img/products/sweet.gif"; break;
            }*/
            //console.log (src);
			//console.log(ic_array);
			if (ic_array[name] == null) {
				//console.log('Похоже, ТМ', name);
				var arrayTM = JSON.parse(window.localStorage.getItem('arrayTM'));
				if (arrayTM == null ) {
					//console.log('Обновляем ТМ');
					getArrayTM();
					arrayTM = JSON.parse(window.localStorage.getItem('arrayTM'));
				}
				if (arrayTM[symbol] == null) {
					$("#p_info").append('<br>ИЦ товара "'+name+'" не найдена, возможно новый товар. Обновляем базу ИЦ...').css('color', 'red').css('font-size', '8pt');
					//console.log('А нет, не ТМ', name);
					getICArray();
					ic_array = JSON.parse(window.localStorage.getItem('ic_array'));
					if (ic_array[name] == null) {
						$("#p_info").append('<br>ИЦ товара "'+name+'" не найдена, возможно новый товар с ТМ. Обновляем базу ИЦ ТМ...').css('color', 'red').css('font-size', '8pt');
						//console.log('Обновляем ИЦ', name);
						getArrayTM();
						arrayTM = JSON.parse(window.localStorage.getItem('arrayTM'));
                        name = arrayTM[symbol].name;
                        //console.log(src, name);
					}
				}
				else name = arrayTM[symbol].name;
				//console.log(src, name);
				//$("#p_info").append("<br>" + td.attr('alt') + " - нет данных по ИЦ").css('color', 'red');
				//continue;
			}
			var inp = $("input[name*='[price]']", tr.eq(i));
			//if (inp.length == 3) inp = inp.eq(1);

			//console.log("inp = " + inp.length);
			inp.before( "ИЦ: " + ic_array[name].ic + "©<br>" );
			//td.parent().next().next().next().next().next().before( "ИЦ: " + ic_array[src]['ic'] + "$<br>" );
		}
	}

	//console.log('end IC');
};
if(window.top == window) {
    var script = document.createElement("script");
    script.textContent = '(' + run.toString() + ')();';
    document.documentElement.appendChild(script);
}