// ==UserScript==
// @name Virtonomica:GosSnab
// @namespace virtonomica
// @version 1.75
// @include https://*virtonomic*.*/*/main/unit/view/*/supply*
// @include https://igra.aup.ru/*/main/unit/view/*/supply
// @description Добавляет кнопки автоматического выставления количества заказываемого товара
// ==/UserScript==
var run = function() {
// Версия минимального снабжения (прописать цифру 1)
var minimal = 0;
// особые условия закупки при занятии данной доли рынка
var limit = 10;
// Заводы: запас комплектующих впересчетах
var factory_store = 2;
// минимальная закупка при старте продаж с нуля
var start_shtuk = 100;
var win = (typeof(unsafeWindow) != 'undefined' ? unsafeWindow : top.window);
$ = win.$;
//---------------------------------------------------------------------
// работа с локальным хранилищем
//---------------------------------------------------------------------
/**
* записать данные в локальнео хранилище, с проверкой ошибок
*/
function ToStorage(name, val)
{
try {
window.localStorage.setItem( name, JSON.stringify( val ) );
} catch(e) {
out = "Ошибка добавления в локальное хранилище";
//console.log(out);
}
}
function getFromStorage(obj, id_shop)
{
if (obj[id_shop] == null) return '';
return JSON.stringify(obj[id_shop]);
}
/**
* Добавить заметку к предприятию
*/
function addNotes( msg ){
// объект для хранения сообщений
notes = JSON.parse( window.localStorage.getItem('notes') );
if ( notes == null ) notes = new Object();
// Идентификатор подразделения
var id = /(\d+)/.exec(location.href)[0];
// дизайно 16.10.2017
var title = $("div.title h1").text();
var type = $.trim( $('ul.tabu li').eq(1).text() );
if ( notes[id] == null ) notes[id] = new Object();
var d = new Date();
if ( notes[id]['text'] != null) {
// сообщение для этого подраздления уже есть
msg = notes[id]['text'] + "<br>" + msg;
}
notes[id]['text'] = msg;
// Количество миллисекунд
notes[id]['time'] = d.getTime();
notes[id]['name'] = title;
notes[id]['type'] = type;
ToStorage('notes', notes);
}
function SetAmount( up) {
var n_row = 0;
var change = 0;
var up_count = 0;
var down_count = 0;
var prc_count = 0;
$("tr.product_row, tr[id^='r']").each( function() {
var el_info = $("td:eq(3)", this);
img = $("img[src*='/img/products']", this);
//alert(" !!! " + img.attr("src") + "("+market[ img.attr("src") ] + ")" );
// на складе
var col = parseInt ( $("tr td:contains('Количество')", this).next().text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
//продано в магазине
var sale = parseInt ( $("tr td:contains('Продано')", this).next().text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
// зауплено в этот ход
var amount = parseInt ( $("td:eq(15)", this).text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
// Свободно на складе
var free = parseInt ( $("tr td:contains('Свободно')", this).next().text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
console.log("COL= " +col + " SALE = "+ sale + " AMOUNT = " + amount + " free = " +free);
// поле для ввода количества заказываемого товара
var input = $("input[name^='supplyContractData']:eq(1), input[id^='qc']", this);
// если больше одного поставщика, то пропускаем
var test = $("td[id^='name']",this).attr('id');
pos = test.indexOf('_');
pos2 = test.indexOf('_', pos+1);
var id = test.substr(pos+1, pos2-pos -1);
if ( gaMaterialProduct[ id ]['subRowCount'] > 1) {
//нашли несколько строк
return;
}
set = sale; // закупить то, что было продано
console.log ("1.set = "+ set);
// если нет двухкратного запаса
if ( col/2 < sale) {
set = Math.round( sale*1.2);
}
if ( col < sale ) {
set = sale * up;
}else if ( col > sale*14) {
// если продажи не существенные
set = 0;
} else if ( col > sale*8) {
// если продажи не существенные
set = Math.round( sale /4);
} else if ( col > sale*4) {
// если запасы слишком большие
set = Math.round( sale /2);
} else if ( col > sale*3) {
set = Math.round( sale *0.8);
} else if ( col > sale*2) {
set = Math.round( sale *0.95);
} else if ( col > sale*1.5) {
set = Math.round( sale *up / (col/ sale ) );
} else if ( col > sale ) {
set = Math.round( (up+1)*sale - col );
}
console.log ("2.set = "+ set);
// попробовать пробную партию
if ( (sale == 0) && (col == 0) && (amount==0) ){
// пробная закупка
set = 1;
console.log ("new.set = "+ set);
}
if( !( (sale == 0) && (amount==0) ) ) {
// если на складе запас равен закупке, то значит, все что было продано, уменьшать нельзя
if ( amount == col) {
set = amount;
if ( sale > amount) set = sale * up ; // если продали больше чем купили, то делаем запас на будущее
if ( sale <= amount) set = amount * up;
}
// первая закупка
if ((sale == 0) && (col == amount)){
set = amount;
}
console.log ("3.set = "+ set);
// Версия минимального снабжения
if (minimal == 1){
if ( sale == col) {
if (sale <= amount) set = sale;
if (sale > amount) set = Math.round(amount*1.25);
}
if (amount > sale) {
if (col <= sale) {
set = Math.round(sale*1.25);
//alert("2 sale = " + sale);
}
}
if (sale < col*0.8) {
set1 = Math.round(sale*0.8);
set2 = Math.round(set*0.8);
if (set1 > set2) set = set2;
else set = set1;
}
if (sale < col*0.5) {
set1 = Math.round(sale*0.2);
set2 = Math.round(set*0.2);
if (set1 > set2) set = set2;
else set = set1;
}
if ( amount == col) {
set = Math.round(sale*1.25);
}
}
console.log ("4.set = "+ set + " limit = "+ limit);
if ( (sale == 0) && (amount < start_shtuk) ){
// пробная закупка
set = start_shtuk;
console.log ("new.set.2 = "+ set);
}
if (limit > 0) {
prc = market[ img.attr("src") ];
if (prc > 50) addNotes('<img src=' + img.attr("src")+ ' width=16px>' + 'Доля рынка: ' + prc + "%");
var sum = price[ img.attr("src") ];
var s2;
var s1 = my_price[ img.attr("src") ] ;
if (prc < 100) {
s2 = (100*sum - prc*s1)/(100 - prc);
} else {
s2 = s1;
}
if (s2 > s1 ){
addNotes('<img src=' + img.attr("src")+ ' width=16px>' + ' проверить цену');
}
console.log ("6.set = "+ set);
if (prc > limit) {
prc_count++;
all = Math.round(100*sale/prc);
// Не закупать больше рынка
if (set > all*1.1) {
set = Math.round(all*1.1);
} else if ( (col+set -sale) > all*1.1 ) {
// прогноз тгго, что будет на складе через персчет
new_sklad = col+set - sale;
if (new_sklad > all*14) {// ух ты запасов хватит еще на 2 недели торговли
set = 0;
} else if (new_sklad > all*8) {
set = Math.round( sale /4);
} else if (new_sklad > all*4) {
set = Math.round( sale /2);
} else if (new_sklad > all*2) {
set = Math.round( sale *0.75);
} else if (new_sklad > all) {
set = Math.round( sale *0.9);
} else {
// не держать запасов больше рынка
set = Math.round(all*1.1 - col +sale);
if (set <0) set = 0;
}
}
// уменьшить прирост закупок до 25% если превышен лимит рынка
if ( amount != col) {
if ( set/sale > 1.25) {
set = Math.round(sale*1.25);
}
} else {
set = Math.round(amount*1.25);
}
}
}
console.log ("5.set = "+ set);
}
if (set != input.attr("value") ) {
change++;
if ( set > input.attr("value") ){
up_count ++;
} else {
down_count ++;
}
}
if (set > free) {
//console.log(img.attr("src"));
if ( !(free==0 && set ==1) ) {
addNotes("<img width=16px src="+ img.attr("src") + "> Нехватка товара у поставщика ("+ free +" вместо "+ set + ")" );
}
}
input.attr("value", set) ; // пишем новое значение
n_row++;
});
$("#gossnab").append("Обработано строк: " + n_row + ", изменено: "+ change+ " (up:" + up_count + "; down:" + down_count+ ")");
if ( (limit > 0) && (prc_count >0) ){
$("#gossnab").append("<br>Больших долей рынка: " + prc_count+ "");
}
}
function ClearAmount( ) {
var n_row = 0;
$("tr[id^='product_'], tr[id^='r']").each( function() {//Магазины
var input = $("input[name^='supplyContractData']:eq(1), input[id^='qc']", this);
input.attr("value", 0);
n_row++;
});
//$("tr[id^='r']").each(function(){ //Заводы
// var input = $("input[id^='qc']", this);
// $(input).val(0);
// n_row++;
//});
$("#gossnab").append("Обнулили: " + n_row );
}
function SetFactory( mode ) {
var n_row = 0;
$("tr[id^='product_row'], tr[id^='r']").each( function() {
// Требуется
var require = parseInt ( $("tr td:contains('Требуется')", this).next().text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
if(!require)
require = 0;
var warehouse = parseInt ( $("tr td:contains('Количество')", this).next().text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
if(!warehouse)
warehouse = 0;
// поле для ввода количества заказываемого товара
var input = $("input[name^='supplyContractData']:eq(1), input[id^='qc']", this);
console.log(input);
// если больше одного поставщика, то пропускаем
var test = $("td[id^='name']",this).attr('id');
if(test){
pos = test.indexOf('_');
pos2 = test.indexOf('_', pos+1);
var id = test.substr(pos+1, pos2-pos -1);
if ( gaMaterialProduct[ id ]['subRowCount'] > 1) {
//нашли несколько строк
return;
}
}
k_zak = 0;
switch ( mode )
{
case 1:
set = require; // закупить то, что требуется
break;
case 2:
k_zak = 1;
set = 2 * require - warehouse;
if (set < 0) set =0;
if (warehouse < require) set = require;
break;
case 3:
k_zak = 2;
break;
case 4:
k_zak = 2.5;
break;
}
if (k_zak > 0){
set = (k_zak +1) * require - warehouse;
if (set < 0) set =0;
if (warehouse < require) set = k_zak * require;
}
set = Math.round( set );
input.attr("value", set) ; // пишем новое значение
n_row++;
});
$("#gossnab").append("Обработано строк: " + n_row );
}
var out = '<td><span id=gossnab style="color:yellow"></span>';
var input_clear = $('<button id=b_clear>Clear</button>').click(function() {
ClearAmount();
});
// данные Для магазинов
var tr; // здесь будет список товаров
var table; // таблица с товарами
// данные по одному товару
var col; // на складе
//var col = parseInt ( $("tr td:contains('Количество')", this).next().text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
var sale; //продано в магазине
//var sale = parseInt ( $("tr td:contains('Продано')", this).next().text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
var amount; // зауплено в этот ход
//var amount = parseInt ( $("td:eq(15)", this).text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') );
var item_name; // название товара
var item_img; // картинка товара
var free; // количство свободного товара
var input_item; //оля для ввода заказ
var error_str = ""; // строка с описанием ошибки
var prc_count = 0;
//======================================
// Shop
// а также базовые функции для выборки данных
//======================================
// Контрол для магазинов
var wc_shop = $("<li><div id=shop_supply style='float:left;cursor:pointer; color: white;'> <img width=32px title='Рассчитать снабжение' alt='Расчет снабжения' src=https://cdn4.iconfinder.com/data/icons/48x48-free-object-icons/48/Lorry.png> </div>");
// Получить список товаров
function getItemList()
{
table = $("table.list");
// список товаров на заказ
tr = $("tr[id^='product_row']", table);
console.log("product_row = " + tr.length);
}
// Получить имя и картинку товара
// @param row - строка с данными по товару
function getItemName( row )
{
// название товара и его картинка
img = $("img[src^='/img/products']", row );
item_name = img.attr('alt') ;
item_img = img.attr('src') ;
//console.log( item_name + ": " + item_img );
}
// Получить данные о продажах или о том, сколько товара требуется
// @param row - строка с данными по товару
function getItemCol( row )
{
table2 = $("td:contains('Количество')", row );
td = $("td:contains('Количество')", table2 ).next();
// сколько есть на складе
col = parseInt( td.text().replace(" ", "").replace(" ", "").replace(" ", "").replace(" ", "").replace(" ", "").replace(" ", "") );
//console.log("col = " + col);
}
// Выделить данные о продажах товара
// @param row - строка с данными по товару
function getItempSale( row, pattern )
{
table2 = $("td:contains('" + pattern + "')", row );
td = $("td:contains('" + pattern + "')", table2 ).next();
// сколько было продано
sale = parseInt( td.text().replace(" ", "").replace(" ", "").replace(" ", "").replace(" ", "").replace(" ", "").replace(" ", "") );
//console.log("sale = " + sale);
}
// Получить идентификаторы заказов
// @param row - строка с данными по товару
function getSubId( row )
{
tr_id = row.attr('id') ;
console.log( "tr_id = " + tr_id);
tr_sub_id = tr_id.replace("product_row", "product_sub_row");
console.log( "tr_sub_id = " + tr_sub_id);
return "tr[id^='" + tr_sub_id + "']";
}
function getInput( row )
{
input_item = $("input[name^='supplyContractData[party_quantity]'], input[id^='qc']", row );
}
// Получить данные о том сколько можнот заказать
// @param row - строка с данными по товару
// @partam add - сколько товара надо заказать
// @return false - наличие ошибок
function getFree( row, add )
{
console.log( "-----getFree" );
error_str = "";
free = 0; // по умолчанию считаем что свободного ничего нет
//free = $("td[id^='free']", row );
free_td = $("td:contains('Свободно')", row).next();
console.log( "FREE = " + free_td.text() );
if ( free_td.text() == "Не огр."){
free = -1; // очень много
} else {
free = parseInt( free_td.text().replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","") );
}
if ( isNaN(free) ) {
error_str = "<img src=" + item_img + " width=16> Отсутствует поставщик";
//addNotes( "<font color=red>" + error_str +"</font>" );
console.log( error_str );
return false;
}
console.log( "FREE = " + free);
// независимый поставщик
if ( free == -1 ) return true;
// ограничение про заказу со склада
max = 0;
max_info = $("span:contains('Max:')", row );
if (max_info.length > 0) {
// Выбираем минимум из свободного и огранияения по поставке
if ( max > free ) free = max;
max = parseInt( max_info.text().replace("Max:","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","") );
console.log( "max_info = " + max );
if ( max > free ) free = max;
}
if ( (add > free) || ( (add > max) && (max > 0) ) ) {
error_str = "<img src=" + item_img + " width=16> Недостаточно свободного товара у поставщика";
//addNotes( "<font color=red>" + error_str +"</font>" );
console.log( error_str );
return false;
}
return true;
}
// Получить число свобонго товара, прописав 0 - если поставщика нет
function getFreeExt( row, add )
{
getFree( row, add );
out = free;
if (free < 0) out = 0;
return out;
}
// Вычислить сколько надо заказывать
function calculateAdd( up )
{
set = sale; // закупить то, что было продано
console.log ("1.set = "+ set);
// если нет двухкратного запаса
if ( col/2 < sale) {
set = Math.round( sale*1.2);
}
if ( col < sale ) {
set = sale * up;
}else if ( col > sale*14) {
// если продажи не существенные
set = 0;
} else if ( col > sale*8) {
// если продажи не существенные
set = Math.round( sale /4);
} else if ( col > sale*4) {
// если запасы слишком большие
set = Math.round( sale /2);
} else if ( col > sale*3) {
set = Math.round( sale *0.8);
} else if ( col > sale*2) {
set = Math.round( sale *0.95);
} else if ( col > sale*1.5) {
set = Math.round( sale *up / (col/ sale ) );
} else if ( col > sale ) {
set = Math.round( (up+1)*sale - col );
}
console.log ("2.set = "+ set);
// попробовать пробную партию
if ( (sale == 0) && (col == 0) && (amount==0) ){
// пробная закупка
set = 1;
console.log ("new.set = "+ set);
}
if( !( (sale == 0) && (amount==0) ) ) {
// если на складе запас равен закупке, то значит, все что было продано, уменьшать нельзя
if ( amount == col) {
set = amount;
if ( sale > amount) set = sale * up ; // если продали больше чем купили, то делаем запас на будущее
if ( sale <= amount) set = amount * up;
}
// первая закупка
if ((sale == 0) && (col == amount)){
set = amount;
}
console.log ("3.set = "+ set);
// Версия минимального снабжения
if (minimal == 1){
if ( sale == col) {
if (sale <= amount) set = sale;
if (sale > amount) set = Math.round(amount*1.25);
}
if (amount > sale) {
if (col <= sale) {
set = Math.round(sale*1.25);
//alert("2 sale = " + sale);
}
}
if (sale < col*0.8) {
set1 = Math.round(sale*0.8);
set2 = Math.round(set*0.8);
if (set1 > set2) set = set2;
else set = set1;
}
if (sale < col*0.5) {
set1 = Math.round(sale*0.2);
set2 = Math.round(set*0.2);
if (set1 > set2) set = set2;
else set = set1;
}
if ( amount == col) {
set = Math.round(sale*1.25);
}
} // Версия минимального снабжения
console.log ("4.set = "+ set);
if (limit > 0) {
prc = market[ img.attr("src") ];
if (prc > limit) {
prc_count++;
all = Math.round(100*sale/prc);
// Не закупать больше рынка
if (set > all*1.1) {
set = Math.round(all*1.1);
} else if ( (col+set -sale) > all*1.1 ) {
// прогноз тгго, что будет на складе через персчет
new_sklad = col+set - sale;
if (new_sklad > all*14) {// ух ты запасов хватит еще на 2 недели торговли
set = 0;
} else if (new_sklad > all*8) {
set = Math.round( sale /4);
} else if (new_sklad > all*4) {
set = Math.round( sale /2);
} else if (new_sklad > all*2) {
set = Math.round( sale *0.75);
} else if (new_sklad > all) {
set = Math.round( sale *0.9);
} else {
// не держать запасов больше рынка
set = Math.round(all*1.1 - col +sale);
if (set <0) set = 0;
}
}
console.log ("6.set = "+ set + ", sale=" + sale);
// уменьшить прирост закупок до 25% если превышен лимит рынка
if ( amount != col) {
if ( set/sale > 1.25) {
set = Math.round(sale*1.25);
}
} else if ( sale < amount ){
set = Math.round(amount*1.25);
}
}
}
console.log ("5.set = "+ set);
}
//input.attr("value", set) ; // пишем новое значение
//n_row++;
return set;
}
// Обработка многократных заказов
// @param row - строка с данными по товару
function processMulti( row, sr_tr, add )
{
console.log("processMulti(" + add + ")");
// несколько поставщиков
var stat = new Array(); // массив с данными поставщика
stat[0] = new Object();
//var inp = new Array(); // массив с полями для ввода данных
stat[0]['add'] = 0; // сколько надо заказать
stat[0]['free'] = getFreeExt( row, add );
getInput( row );
stat[0]['inp'] = input_item;
amount = input_item.val();
//inp[0] = input_item;
//console.log(inp[0].val() + " = " + inp[0].length);
// цикл по поставщикам
for(j=0; j<sr_tr.length; j++){
//console.log( "--- J=" +j + "----");
stat[j+1] = new Object();
stat[j+1]['add'] = 0; // сколько надо заказать
stat[j+1]['free'] = getFreeExt( sr_tr.eq(j), add );
getInput( sr_tr.eq(j) );
stat[j+1]['inp'] = input_item;
//inp[0] = input_item;
} // цикл по поставщикам
//console.log( JSON.stringify(stat) );
// простейший вариант - первый попавшийся поставщик выбирается по максимуму штук
add_left = add ;
for(j=0; j<stat.length; j++) {
if ( add_left <= stat[j]['free'] ) {
stat[j]['add'] = add_left;
add_left = 0;
break;
}
stat[j]['add'] = stat[j]['free'];
add_left -= stat[j]['free'];
}
//console.log( JSON.stringify(stat) + " = " + add_left);
// выставляем цифры в интерфейс
for(j=0; j<stat.length; j++) {
stat[j]['inp'].val( stat[j]['add'] );
console.log( stat[j]['inp'].attr("name") );
}
if ( add_left > 0) {
error_str = "<img src=" + item_img + " width=16> Нехватка товара у поставщиков (мультизаказ) ";
//addNotes( "<font color=red>" + error_str +"</font>" );
}
}
//================
wc_shop.click( function() {
getItemList();
for(i=0; i<tr.length; i++) {
getItemName( tr.eq(i) );
getItemCol( tr.eq(i) );
getItempSale( tr.eq(i), "Продано" );
console.log("-----------------");
console.log( item_name + ": " + item_img );
console.log("col = " + col + " sale = " + sale );
// сколько надо заказать товара
var add = sale;
getInput( tr.eq(i) );
amount = parseInt( input_item.parent().prev().prev().text().replace(" ", '').replace(" ", '').replace(" ", '').replace(" ", '').replace(" ", '').replace(" ", '') );
console.log("amount = " + amount );
add = calculateAdd( 2 );
sr_tr = $( getSubId( tr.eq(i) ), table );
if (sr_tr.length == 0) { // У нас только один поставщик
// проверить свободные
if ( getFree( tr.eq(i), add ) == false) continue;
console.log("add = " + add );
input_item.val(add);
continue;
}
console.log("много поставщиков");
processMulti( tr.eq(i), sr_tr, add );
}// цикл по товарам (компонентам)
});
function checkShop( )
{
// кривой способ определения типа юнита по названию вкладки
var title = $.trim( $('ul.tabu li').eq(1).text() );
//console.log( title );
if ( title == 'Магазин' ) return true;
//if ( img =='<img src="/img/v2/units/shop') return true;
//if ( img =='<img src="/img/v2/units/fuel') return true;
return false;
}
//var img = $("#unitImage").html();
//img = img.substr(0,img.length-8);
// Проверить, что это магазин
//if ( img =='<img src="/img/v2/units/shop') {
if ( checkShop( ) ) {
// кнопки
var input_2 = $('<button id=b2>1:1 up2</button>').click(function() {
SetAmount(2);
});
var input_5 = $('<button id=b5>1:1 up4</button>').click(function() {
SetAmount(4);
});
var container = $('div.metro_header');
container.append( $('<table><tr>').append('<td>').append(input_2).append('<td>').append(input_5).append('<td>').append(input_clear).append( out) );
container = $('ul.tabu');
container = $("li:last", container).prev().parent();
container.append(wc_shop) ;
//$("table.infoblock").before("<span id=factory_supply_info></span>");
// найти "свободно"
/*
$("td[id^='free']").attr('title','Закупить весь остаток').live('dblclick', function(){
var free = $(this).text().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', '') ;
var td = $("td[id^='quantityField']", $(this).parent().parent().parent().parent().parent() ) ;
var input = $("input[name^='supplyContractData']:eq(0)", td );
input.attr("value", free) ;
});
*/
var market = new Array();
var price = new Array();
var my_price = new Array();
if (limit > 0) {
// Формируем ссылку на торговый зал
var url = /^https:\/\/virtonomic[as]\.(\w+)\/\w+\//.exec(location.href)[0];
//var id = /\/unit\/view\/(\d+)/.exec(location.href)[0];
var id = /\/unit\/view\/(\d+)/.exec(location.href)[0];
url = url + "main" + id + "/trading_hall";
//alert(url);
$.get(url, function(data) {
//alert("read");
var td = $("td:contains('%')", data);
for (i=1; i< td.length; i++) {
td_pr = td.eq(i);
tr = td_pr.parent();
img = $("img[src*='/img/products']", tr);
// Наша доля на рынке
market[ img.attr('src') ] = parseFloat( td_pr.text().replace('%', '') );
//Цена продажи в магазинах города
price[ img.attr('src') ] = parseFloat( td_pr.next().text().replace('$', '').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','') );
//console.log(price[ img.attr('src') ]);
// моя цена продажи
}
var inp = $("input[name^='productData[price]']", data);
console.log("inp = "+ inp.length);
for(var i=0; i<inp.length; i++){
img = $("img[src*='/img/products']", inp.eq(i).parent().parent() );
//console.log( img.attr('src') + "===" + inp.eq(i).val() );
my_price[ img.attr('src') ]= parseFloat( inp.eq(i).val() );
}
});
//alert('post read');
}
}
// Проверить не завод ли это
function checkType()
{
// кривой способ определения типа юнита по названию вкладки
var title = $.trim( $('ul.tabu li').eq(1).text() );
//console.log( title );
if ( title == 'Завод' ) return true;
if ( title == 'Мельница' ) return true;
if ( title == 'Ферма' ) return true;
if ( title == 'Предприятие дошкольного образования' ) return true;
if ( title == 'Ресторан' ) return true;
if ( title == 'Авторемонтная мастерская' ) return true;
if ( title == 'Оператор мобильной связи' ) return true;
if ( title == 'Медицинский центр' ) return true;
/*
var head = $("#unitImage");
var img = $("img", head);
link = img.attr('src');
n = link.indexOf('workshop');
if (n > 0) return true;
n = link.indexOf('mill');
if (n > 0) return true;
n = link.indexOf('animalfarm');
if (n > 0) return true;
*/
return false;
}
//======================================
// Factory
//======================================
// Вычислить сколько надо заказывать
// @param k - Коэффициент заказа
function calculateFactoryAdd( k )
{
return sale * k - col;
}
var wc_factory = $("<li><div id=factory_supply style='float:left;cursor:pointer; color: white;'> <img width=32px title='Рассчитать снабжение' alt='Расчет снабжения' src=https://cdn4.iconfinder.com/data/icons/48x48-free-object-icons/48/Lorry.png> </div>");
// Обработчик для завода-
wc_factory.click( function() {
getItemList(); // аналогично магазину
for(i=0; i<tr.length; i++) {
getItemName( tr.eq(i) );
getItemCol( tr.eq(i) );
getItempSale( tr.eq(i), "Требуется" );
console.log("-------w----------");
console.log( item_name + ": " + item_img );
console.log("col = " + col + " sale = " + sale );
getInput( tr.eq(i) );
// сколько надо заказать товара
var add = add = calculateFactoryAdd( factory_store );;
console.log("add=" +add);
sr_tr = $( getSubId( tr.eq(i) ), table );
if (sr_tr.length == 0) { // У нас только один поставщик
// проверить свободные
if ( getFree( tr.eq(i), add ) == false) continue;
add = calculateFactoryAdd( factory_store );
console.log("add = " + add );
input_item.val(add);
continue;
}
console.log("--------много поставщиков");
processMulti( tr.eq(i), sr_tr, add );
}// цикл по товарам (компонентам)
$("input[name='applyChanges']").click();
});
if ( checkType() == true ){
// кнопки
var input_100 = $('<button id=b100>1:1</button>').click(function() {
SetFactory(1);
});
var input_200 = $('<button id=b200>х1</button>').click(function() {
SetFactory(2);
});
var input_х2 = $('<button id=bх2>х2</button>').click(function() {
SetFactory(3);
});
var input_х25 = $('<button id=bх25>х2.5</button>').click(function() {
SetFactory(4);
});
var container = $('div.metro_header');
container.append( $('<table><tr>').append('<td>').append(input_100) .append('<td>').append(input_200).append('<td>').append(input_х2).append('<td>').append(input_х25).append('<td>').append(input_clear).append( out) );
container = $("li:last", $("ul.tabu")).prev().parent();
container.append(wc_factory) ;
$("table.infoblock").before("<span id=factory_supply_info></span>");
}
// склады
var wc_warehouse = $("<li><div id=factory_supply style='float:left;cursor:pointer; color: white;'> <img width=32px title='Рассчитать снабжение' alt='Расчет снабжения' src=https://cdn4.iconfinder.com/data/icons/48x48-free-object-icons/48/Lorry.png> </div>").click( function() {
var table = $("table.list");
// список товаров на заказ
var tr = $("tr.p_title, tr.odd, tr.even", table);
console.log("TR = " + tr.length);
var all = 0;
var require = 0;
var left = 0; // осталось
for(i=0; i<tr.length; i++) {
row = tr.eq(i);
//console.log("row = " + row.html() );
if (row.hasClass('p_title') ) {
// Начало нового товра
console.log("----------\nNEW" );
title = $("td.p_title_l", row);
all = $("td:contains('На складе:')", title ).next().text();
all = parseInt( all.replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","") );
console.log("all = " + all );
require = $("td:contains('по контрактам')", title ).next().text();
require = parseInt( require.replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","") );
console.log("require = " + require );
left = require;
continue;
}
td = $("td.num:last", row);
str = $("span" , td);
n = str.html().indexOf("<br>");
// такого быть не должно
if (n ==0 ) continue;
free = parseInt( str.html().substring(0, n).replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","").replace(" ","") );
console.log("free = " + free );
// поле для ввода
input = $("input", row);
add = free;
if (left < free) add = left;
input.val(add);
left -= add;
}
});
// warehouse
head = $("#unitImage");
img = $("img", head);
link = img.attr('src');
n = link.indexOf('warehouse');
if (n > 0) {
container = $('#topblock').next();
container = $("li:last", container).prev().parent();
container.append(wc_warehouse) ;
}
};
// Хак, что бы получить полноценный доступ к DOM >:]
var script = document.createElement("script");
script.textContent = '(' + run.toString() + ')();';
document.documentElement.appendChild(script);