Virtomomica: IC

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

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

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

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

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

你需要先安裝一款使用者腳本管理器擴展,比如 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);
}