salary&supply public

На странице управления персоналом

// ==UserScript==
// @name        salary&supply public
// @namespace   virtonomica
// @description    На странице управления персоналом
// @description    Облегчает установку зарплат 100% (среднегородская), 1:1 (по требуемой квалификации)
// @description    Облегчает установку обучения
// @description    Сортировка по квалификации: меньше треб., больше треб., равна требуемой.
// @description    Сортировка по зарплате: <100%, >=100%, >=150%
// @description    на основе скрипта Crocuta http://userscripts.org/scripts/show/174468
// @version        1.35
// @include        http*://virtonomic*.*/*/main/company/view/*/unit_list/employee*
// @grant       none
// ==/UserScript==


var run = function(type) {

  //globals
  var win = (typeof (unsafeWindow) != 'undefined' ? unsafeWindow : top.window);
  $ = win.$;

  var arr_envd={"Алмазы":100,"Бокситы":100,"Глина":100,"Древесина":30,"Железная руда":100,"Золото":100,"Кремний":100,"Марганец":100,"Медный колчедан":100,"Нефть":100,"Полиметаллическая руда":100,"Природные минералы":100,"Титановая руда":100,"Уголь":100,"Хром":100,"LED":20,"Авиадвигатель":10,"Авиашасси":10,"Авионика":10,"Автозапчасти":20,"Алюминий":20,"Бумага":5,"Двигатель":15,"Зеркальный лист":20,"Интерьер самолета":10,"Кожа":5,"Комплектующие":20,"Корпус яхты":15,"Косметическое масло":20,"Краска":5,"Литий":10,"Литий-ионный аккумулятор":15,"Медь":20,"Микропроцессор":20,"Натуральные лекарственные компоненты":20,"Оснащение яхты":15,"Отходы хлопчатника":10,"Парфюмерная эссенция":20,"Пластмасса":10,"Резина":10,"Рыболовная сеть":10,"Сверхлёгкий алюминиевый сплав":20,"Светочувствительная матрица":20,"Секция фюзеляжа":10,"Синтетическая ткань":5,"Синтетические лекарственные компоненты":20,"Сталь":10,"Стекло":20,"Термопластик":10,"Термоэлемент":15,"Титан":20,"Ткань":20,"Углепластик":10,"Химикаты":20,"Хлопковая ткань":20,"Хлопковое волокно":10,"Цинк":10,"Шерсть":20,"Электронные компоненты":20,"Электропривод":15,"Элементы авиакрыла":10,"Элементы авиаоперения":10,"Этанол":20,"Апельсин":5,"Воск":10,"Вощина":10,"Зерно":10,"Какао":10,"Картофель":10,"Комбикорм":10,"Кормовые культуры":10,"Кофе":10,"Кукуруза":5,"Маточное молочко":20,"Молоко":15,"Мясо":20,"Мёд":10,"Оливки":10,"Подсолнечник":15,"Помидоры":5,"Рыбная мука":10,"Сахар":10,"Соя":10,"Табак":5,"Фрукты":5,"Хлопок":10,"Цветы и эфиромасличные культуры":5,"Чайный лист":5,"Яйца":15,"Бурбон":10,"Джем":10,"Зеленый чай":10,"Зефир":15,"Кисель":10,"Колбасные изделия":15,"Кондитерские изделия":15,"Консервированная кукуруза":15,"Консервированные оливки":15,"Консервы":15,"Конфеты":10,"Красная икра":20,"Кукурузная мука":10,"Кукурузные хлопья":5,"Ликер":10,"Макаронные изделия":5,"Масло":10,"Мисо-суп":5,"Молочные продукты":10,"Мороженое":15,"Мука":10,"Натуральный кофе":20,"Оливковое масло":20,"Печень трески":15,"Пиво":10,"Продукты быстрого приготовления":5,"Прохладительные напитки":10,"Пуэр":50,"Растворимый кофе":5,"Рыбные деликатесы":20,"Рыбные консервы":15,"Соевый соус":15,"Сок":10,"Соусы":5,"Специи":5,"Спиртные напитки":10,"Суфле":15,"Сыр":10,"Сыр фета":10,"Тофу":10,"Фри":10,"Фруктовый чай":10,"Хлеб":10,"Черная икра":50,"Черный чай":10,"Чипсы":5,"Шоколад":10,"Энергетические напитки":10,"GPS-навигаторы":20,"LED-телевизоры":50,"USB-флэш-накопитель":20,"Автомобиль":100,"Автомобильное сиденье":15,"Автомобильные багажники":20,"Автомобильные диски":20,"Автосигнализация":20,"Антифриз":20,"Аудиотехника":50,"Бейсболка":20,"Бижутерия":20,"Бриллианты":30,"Бронзовый декор":30,"Бытовая химия":20,"Велосипед":20,"Верхняя одежда":20,"Внедорожник":100,"Водный скутер":30,"Газонокосилка":20,"Гироскутер":15,"Гриль для дачи":20,"Деловая одежда":20,"Детская коляска":20,"Детская кроватка":5,"Детское питание":15,"Джинсы":20,"Душевые кабинки":5,"Жемчужные украшения":50,"Заварочный чайник":20,"Зеркало":20,"Зонт":20,"Игровые консоли":50,"Игрушки":20,"Канцтовары":20,"Керамическая посуда":20,"Книги":15,"Кованая садовая мебель":30,"Ковер":20,"Кожгалантерея":20,"Коммерческий автомобиль":100,"Компьютер":30,"Компьютерные аксессуары":20,"Кондиционер":50,"Консервированный корм для животных":15,"Конструктор":20,"Косметика":15,"Кофе-машина":50,"Кузовные запчасти":20,"Кухонная мебель":20,"Кухонные плиты":50,"Мебель":20,"Мобильный телефон":20,"Моторное масло":20,"Мотоцикл":30,"Нижнее белье":20,"Носки":10,"Ноутбук":30,"Обувь":20,"Одежда":20,"Одежда для малышей":20,"Одеяло":20,"Омыватель стекол":20,"Офисная мебель":20,"Офисное кресло":20,"Парфюмерия":20,"Планшет":30,"Подарки и Сувениры":20,"Подгузники":10,"Полотенце":20,"Пончо":20,"Посуда":20,"Посудомоечные машины":50,"Пресса":15,"Принтер":30,"Пылесос":50,"Радионяня":10,"Развивающие игрушки":20,"Садовый декор":20,"Садовый инвентарь":20,"Сантехника":20,"Сапоги":20,"Светильник":20,"Светодиодная лампа":15,"Седан":100,"Сигареты":20,"Сигары":10,"Сковородки":20,"Смартфон":20,"Снюс":20,"Сомбреро":20,"Спальная мебель":20,"Спорт-кар":100,"Спортинвентарь":20,"Стиральные машины":50,"Столовое и постельное бельё":20,"Сумки и портфели":20,"Сухой корм для животных":15,"Телевизоры":50,"Товары для творчества":20,"Тренажер":20,"Утюг":20,"Фен":20,"Фольктдрект":20,"Фототехника":20,"Холодильники":50,"Цифровая видеокамера":20,"Цифровой фотоаппарат":20,"Чайник":20,"Часы":30,"Чистящие средства":20,"Шины":20,"Электроинструмент":20,"Электромобиль":100,"Элемент питания":15,"Ювелирные украшения":50,"Витамины":20,"Гормональные препараты":10,"Косметические маски":20,"Лекарственные травы":20,"Медицинский антисептик":10,"Медицинский инструментарий":20,"Никотиновый пластырь":15,"Природные лекарства":20,"Рыбий жир":20,"Синтетические лекарства":10,"Спортивное питание":10,"Средства гигиены":20,"Электронный тонометр":20,"IT-оборудование":30,"Автозаправочное оборудование":30,"Авторемонтное оборудование":30,"Гелиостат":30,"Горно-шахтное оборудование":30,"Интерьер дошкольных учреждений":30,"Коммуникационное оборудование":30,"Мазутный энергоблок":30,"Медицинское оборудование":30,"Мусороприёмное оборудование":30,"Мусоросжигательный энергоблок":30,"Парикмахерское оборудование":30,"Паровая турбина":30,"Паровой котёл":30,"Пилорама":30,"Прибор":30,"Ресторанное оборудование":30,"Рыболовецкий траулер":30,"Серверная платформа":30,"Система очистки дымовых газов":30,"Солнечный энергоблок":30,"Станок":30,"Теплообменное оборудование":30,"Топливное оборудование":30,"Топливораздаточная колонка":30,"Трактор":30,"Угольная мельница":30,"Угольный энергоблок":30,"Узкофюзеляжный самолет":10,"Жемчуг":100,"Крабы":20,"Лосось":20,"Осетр":10,"Промысловая рыба":20,"Треска":20,"Устрицы":20,"Домашняя птица":20,"Коровы":20,"Овцы":20,"Пчёлы":20,"Свиньи":20,"Арт декор":30,"Интерьер яхты":100,"Шагрень":15,"Яхта":100,"Бензин Нормаль-80":100,"Бензин Премиум-95":100,"Бензин Регуляр-92":100,"Биодизель":100,"Дизельное топливо":100,"Мазут":100};
  var realm = readCookie('last_realm');

  var today = $('#server-time').next().text();
  var shop_price = JSON.parse( window.localStorage.getItem('shop_price') );
  if (shop_price == null) shop_price =new Object();

// utils

  function f2(val) {return parseFloat(Math.floor(val *100)/100);} // "округляем" до 2х знаков

  function paging(pages){
    // добавить пагинацию
    $('.pager_options > .selected').removeClass('selected').text('').append($('.pager_options a:eq(0)').parent().html());
    var links = $('.pager_options a');
    var cookieName = /^\/\w+\/main\/company\/view\/\d+\/unit_list$/.test(location.pathname) ? 'mainUPP' : 'UPP';
    var upp = readCookie(cookieName);
    if (upp == null) {upp = 50;}
    links.each(function (i) {
      var a = $(this);
      a.attr('href', a.attr('href').replace(pages[i][0], pages[i][1]));
      a.text(pages[i][1]);
    });
  } //end of paging

    function APIgetSummary(href,refresh){ //считать данныепо предприятию через API
        var reg = new RegExp('(\\S+\\/)('+realm+')\\/.+?(\\d+)');
        var re = reg.exec(href);
        var id = RegExp.$3;
        var apiSummaryUrl = RegExp.$1 + 'api/%realm%/main/unit/summary'.replace('%realm%',RegExp.$2);
        var apiToken = RegExp.$1 + 'api/%realm%/main/token'.replace('%realm%',RegExp.$2);
        var apiRefresh = RegExp.$1 + 'api/%realm%/main/unit/refresh'.replace('%realm%',RegExp.$2);

        if (refresh){
            var token;
            $.ajax({
                type:'GET',
                async:false,
                url:apiToken,
                success:function(data){token = data;}
            });

            $.ajax({ // сброс кэша
                type:'POST',
                async:false,
                url:apiRefresh,
                data:{id:id,token:token}
            })
        };
        var summary = {};
        $.ajax({
            url: apiSummaryUrl,
            dataType: 'json',
            async: false,
            data: {id:id},
            success: function(data){summary = data;}
        })
        return summary;
    }

  function wall(title,total){
    typeof(total) != 'undefined' ? total = '/'+total : total = 'анализ';
    $('<div id="js-wall" style="position: fixed; top: 0px; left: 0px; background-color: black; z-index: 100000; opacity: 0.2;" />').height($(window).height()).width($(window).width()).prependTo('body');
    $('<div id="js-progress" style="color: black; top: ' + $(window).height() / 2 + 'px; position: fixed; z-index: 10000; font-size: 40pt; text-align: center;" >Выполнено '+title+': <span id="js-curr"></span>' + total + '</div>').width($(window).width()).prependTo('body');
  }// end of wall()

  function remove_wall(){
    $('#js-progress').remove();
    $('#js-wall').remove();
  }//end of remove_wall()

  function doit(arr, action, title, process) {
    try {
      wall(title,arr.length);
      promise = $.when();
      $.each(arr, function (index, obj) {
        promise = promise.then(function () {
          $('#js-curr').text(index);
          process(obj, action);
          return;
        });
      });
      remove_wall();
      return;
    } catch (ex) {
      alert(ex);
    }
  } //end of doit()

  function setPriceENVD(workCell,action){
    var UnitType = $('td:eq(2)',workCell).attr('class');
    var UnitHref = $('td:eq(2)>a',workCell).attr('href');
    switch(UnitType){
      case "u-c i-service_light":UnitType="services_light";break;
      case "u-c i-restaurant":UnitType="services";break;
      case "u-c i-medicine":UnitType="services";break;
      case "u-c i-shop":UnitType="shop";break;  //магазин
      case "u-c i-power":UnitType="i-power";break;  //электростанция
      case "u-c i-orchard":UnitType="production";break;  //плантация
      case "u-c i-fishingbase":UnitType="production";break;  //рыбная база
      case "u-c i-farm":UnitType="production";break;  //землеферма
      case "u-c i-animalfarm":UnitType="production";break;  //животноводческая ферма
      case "u-c i-mill":UnitType="production";break;  //мельница
      case "u-c i-workshop":UnitType="production";break;  //завод
      case "u-c i-sawmill":UnitType="production";break;  //лесопилка
      case "u-c i-mine":UnitType="production";break;  //рудник
      case "u-c i-repair":UnitType="services";break;
      case "u-c i-fuel":UnitType="shop";break;  //Заправка
    }
    if (UnitType == "production") {
      $.ajax({
        type:"GET",
        async: false,
        url:UnitHref+'/sale',
        success:function(data){
          var page = $(data);
          var setPrice = false;
          $('.grid>tbody>tr:gt(0)',page).each( function () {
            var sellOption = $('[selected="selected"]',this).val();  // 3=только своей компании
            if (sellOption==3) { //ставим цену автоматом, только если продаем сами себе
              var altt=$('td[title*="маркетинг"]>a>img',this).attr('alt');
              var sbst=$('td.nowrap td:contains("Себестоимость")',this).next().prop('textContent').replace(/[^\d\.]/g,'');
              var newPrice = (sbst*(1+arr_envd[altt]/100)).toFixed(2);
              var price = parseFloat($('.money:eq(0)',this).val().replace(/[^\d\.]/g,'')).toFixed(2);
              if (price != newPrice && newPrice > 0) {$('.money:eq(0)',this).prop("value",newPrice);setPrice=true;}
            }
          });
          if (setPrice) {
            var postData = $('form[name="storageForm"]',page).serialize();
            $.ajax({
              type:"POST",
            	async: false,
              url:UnitHref+'/sale',
              data:postData
            });
          }
        }
      });
    }

    var id_shop = /(\d+)/.exec(UnitHref)[0];
    if (shop_price[id_shop] == null) shop_price[id_shop] = new Object();

    if (UnitType == "shop" && shop_price[id_shop] != today) {
      console.log("setting prices in shop " + id_shop);
      var recalcPrice=$('#recalcPrice:checked').val()=="X"?"X":""; //полный пересчет цен
      $.ajax({
        type:"GET",
        async: false,
        url:UnitHref+'/trading_hall',
        success:function(data){
          var page = $(data);
          var setPrice = false;
          $('.grid tr input[type="text"]',page).each( function() {
            var sell = parseFloat($(this).val().replace(/[^\d\.]/g,''));
            var buy = parseFloat($(this).parent().prev().text().trim().replace(/[^\d\.]/g,''));
            var share = parseFloat($(this).parent().next().text().trim().replace(/[^\d\.]/g,'').replace('%',''));
            var vol_sold = parseFloat($(this).parent().prevAll('td:eq(5)').text().replace(/[^\d\.]/g,''));
            var last_lot = parseFloat(/(\d+)\[(\d+)]/.exec($(this).parent().prevAll('td:eq(4)').text().replace(/\s/g,''))[2]);
            var warehouse = parseFloat($(this).parent().prevAll('td:eq(3)').text().replace(/[^\d\.]/g,''));
            var good = $(this).parent().prevAll('td:eq(6)').attr('title').replace(' (кликните для просмотра подробного маркетингового отчёта)',''); //Автомобиль, Автозапчасти...
            if (!isNaN(buy)) {
              if (sell < buy || recalcPrice=='X') {var newPrice = 1.02*buy;$(this).val(f2(newPrice));setPrice=true;} // продавать надо дороже, чем купили
              else {
//                if (good == 'Автомобиль') {var newPrice = 1.02*buy;$(this).val(newPrice);setPrice=true;} // продаем по себестоимости

                // остальное исходя из доли рынка
                if (share > 50) {var newPrice = Math.max(sell*1.10,sell+1.00);$(this).val(f2(newPrice));setPrice=true;} // если доля рынка больше 50% поднимаем цену, шаг 10% или 100с
                else if (share > 20) {var newPrice = Math.max(sell*1.05,sell+0.10);$(this).val(f2(newPrice));setPrice=true;} // если доля рынка больше 10% поднимаем цену, шаг 5% или 10с
                else if (share > 10 ) {var newPrice = Math.max(sell*1.01,sell+0.01);$(this).val(f2(newPrice));setPrice=true;} // если доля рынка больше 3% поднимаем цену, шаг 1% или 1с
                else if (share < 5 && last_lot != warehouse) {var newPrice = Math.max(Math.min(sell*0.95,sell-0.01),buy+0.01);$(this).val(f2(newPrice));setPrice=true;} // если доля рынка близка к нулю опускаем цену, шаг 1% или 1с. Не ниже чем сс
              }
            }
          });

          if (setPrice) {
            $('form[name="tradingHallForm"] input[name="action"]',page).val("setprice");
            var postData = $('form[name="tradingHallForm"]',page).serialize();
            $.ajax({
              type:"POST",
              async: false,
              url:UnitHref+'/trading_hall',
              data:postData
            });
          }
        }
      });
      shop_price[id_shop] = today;
      window.localStorage.setItem( 'shop_price',  JSON.stringify( shop_price ) );  //запишем, что уже обработали магазин
    }
  }//end function setPriceENVD

  function setSuply(workCell,action){
        if ($('td:eq(10)>a',workCell).length > 0) return; //не обрабатывать предприятия в отпуске
        var UnitType = $('td:eq(2)',workCell).attr('class');
        var UnitCode = $('td:eq(0)>input',workCell).attr('value');
        var UnitName = $('td:eq(2)>a',workCell).text();
        var UnitHref = $('td:eq(2)>a',workCell).attr('href');
        var UnitWorkers = $('td:eq(4)>input',workCell).attr('value');
        var UnitWorkersTotal = $('td:eq(5)>input',workCell).attr('value');
        var UnitSalary = parseFloat($('td:eq(6)',workCell).text());
        var UnitSalaryTotal = $('td:eq(7)>input',workCell).attr('value');
        var UnitQuantity = $('td:eq(8)>input',workCell).attr('value');
        var UnitQuantityTotal = parseFloat($('td:eq(9)',workCell).text());

        switch(UnitType){
            case "u-c i-restaurant":UnitType="services";break;
            case "u-c i-medicine":UnitType="services";break;
            case "u-c i-shop":UnitType="shop";break;
            case "u-c i-power":UnitType="production";break;
            case "u-c i-animalfarm":UnitType="animalfarm";break;
            case "u-c i-mill":UnitType="production";break;
            case "u-c i-workshop":UnitType="production";break;
            case "u-c i-repair":UnitType="services";break;
            case "u-c i-fuel":UnitType="shop";break; //Заправка
            case "u-c i-educational":UnitType="services";break;
        }

        if (!((UnitType == 'production')||(UnitType == 'animalfarm')||(UnitType == 'shop')||(UnitType == 'services'))) return false;
        $.ajax({
            type:"GET",
            async: false,
            url:UnitHref+'/supply',
            success:function(data){
                var severity = 0; // ошибки
                var postData = ''; //формируем post-строку
                var field = '';
                var max_pos = 0;
                switch (UnitType){
                    case 'services': // посещаемость сервисных предприятий
                        var summary = APIgetSummary(UnitHref,true);
                        if (summary.equipment_count === 0 || summary.employee_count === 0) return;
                        var k_max = summary.equipment_count / summary.equipment_max * Math.min(summary.employee_required_by_equipment,summary.employee_count) / summary.employee_required_by_equipment;
                        k_max = isNaN(k_max)?1:k_max;
                        var pos = '';
                        $.ajax({
                            type:"GET",
                            async: false,
                            url:UnitHref,
                            success:function(data){pos = $("td.title:contains('Количество посетителей')",data).next().text().replace(/\s+/g,'').match(/\d+/g);}
                        });
                        max_pos = (pos[1]*k_max);
                        max_pos = isNaN(max_pos)?summary.employee_count:max_pos;
                        field = 'Расход';
                        break;
                    case 'shop': // в торговой точке
                        field = 'Продано';
                        break;
                    default:
                        field = 'Требуется';
                        break;
                }
                $("tr[id^='product_row']",data).each( function() { // Требуется
                    var sales = parseInt ( $('tr:contains("'+field+'"):last', this).text().replace(/\D+/g,'') );
                    var warehouse = parseInt ( $('tr:contains("Количество"):last', this).text().replace(/\D+/g,'') );
                    var purchase = parseInt ( $('tr:contains("Закупка"):last', this).text().replace(/\D+/g,'') );
                    var material = $("th [alt]",this).attr("alt");
                    var max_sales = 0;
                    switch (UnitType){
                        case 'services':
                            var sales_per_pos = parseInt ( $('tr:contains("Расх. на клиента"):last', this).text().replace(/\D+/g,'') );
                            max_sales = sales_per_pos * max_pos;
                            break;
                        case 'shop':
                            max_sales = parseInt( (sales<10?10:sales) * 1.25 );break; // максимальный расход в ход. если оборот маленький, то закупка 10ед
                       default:
                            max_sales = parseInt( sales );break; // максимальный расход в ход
                    }
                    if ((UnitType == 'animalfarm')&&(sales > warehouse)) severity=2; // если остатков не хватает для питания
                    var max_available = 0; // доступный остаток для заказа
                    var limit = 0;
                    var suppliers = 0;
                    var order = 0;
                    var good = $(this);
                    var good_id = /\d+-?\d+/.exec(good.attr('id'))[0];
                    var good_id_ = good_id;
                    do{
                        if ($('td:last',this).text()=='Выбрать поставщика') break; //поставщики отсутствуют
                        max_available = $('tr:contains("Свободно"):last', good).text().replace(/\D+/g,'');
                        max_available = parseInt ( (max_available=='')?999999999999:max_available ); //Неогр. = 99999...
                        limit = parseInt($('td[id^="quantityField"] input[name^="supplyContractData"]', good).next().next().text().replace(/\D+/g,''));
                        limit = isNaN(limit)?999999999999:limit; // если лимита поставки нет, то лимит = 99999...
                        max_available = Math.min(max_available,limit);
                        // определим сколько закупается сейчас
                        order = order + Math.min(max_available,parseInt ( $('td[id^="quantityField"] input[name^="supplyContractData"]', good).val() ));
                        ++suppliers;
                        good = $(good).next();
                        good_id_ = /\d+-?\d+/.exec(good.attr('id'));
                        good_id_ = (good_id_ === null)?-1:good_id_[0];
                    }while (good_id_ == good_id);
                    if (suppliers != 1) { //поставщиков нет или несколько
                        if ((max_sales + sales > warehouse + order)||(suppliers == 0)) severity = 2; //если не достаточно товара, поставим ссылку
                        return; // let's check next material
                    }
                    var OrderQuantity=0;
//                    console.log(material+': sales='+sales+', warehouse='+warehouse+', purchase='+purchase+', order='+order+', max_sales='+max_sales);
                    switch(action){
                        case 'x1': //поставка с учетом остатков на один день x1
                            if (UnitType=='shop' || UnitType=='services') {
                                if (warehouse <= purchase * 1.02) sales = Math.max(sales,purchase,order); //если все распродали, то требуется закупить не меньше, чем заказывали ранее
                            }
                            OrderQuantity = Math.max(max_sales + sales - warehouse,0); // Закупка с учетом остатков на складе
                            OrderQuantity = Math.min(OrderQuantity,max_sales); // Закупка не больше, чем может понадобиться
                            break;
                        case '1:1': //поставка по требованию 1:1
                            OrderQuantity = max_sales;
                            break;
                    }
                    if (OrderQuantity > max_available) severity=1; // если остатков не хватает для поставки
                    if (OrderQuantity != order){ // меняем данные, если они изменились
                        var lVal='';
                        $("select[name^='supplyContractData']", this).each( function() {
                            lVal = $(this).attr('name').indexOf('party_quantity') > 0 ? OrderQuantity : $(this).val();
                            postData = postData + $(this).attr('name') + '=' + lVal + "&";
                        });
                        $("input[name^='supplyContractData']", this).each( function() {
                            lVal = $(this).attr('name').indexOf('party_quantity') > 0 ? OrderQuantity : $(this).val();
                            postData = postData + $(this).attr('name') + '=' + lVal + "&";
                        });
                    }
                });
                switch(severity){
                    case 1:var obj1 = $('<a href="'+UnitHref+'/supply'+'">').append($('<img>').attr({'src': '/img/unit_indicator/unit_possible_shortage_material.gif', 'height': 16, 'width': 16}));break; // возможен недостаток товара
                    case 2:obj1 = $('<a href="'+UnitHref+'/supply'+'">').append($('<img>').attr({'src': '/img/unit_indicator/unit_insufficient_supply_material.gif', 'height': 16, 'width': 16}));break; // не хватает для питания
                    default:obj1 = $('<a href="https://virtonomica.ru/vera/main/user/privat/persondata/pay_service/list">').append('<div class="lock">');break;
                }
                if (postData.length>0){ //отправим на сервер, только если что-то надо менять
                    $('td:eq(11)',workCell).empty().append($('<img>').attr({'src': 'http://s3.devels.info/load.gif', 'height': 16, 'width': 16}));
                    $.ajax({
                        type:"POST",
                        async: false,
                        url:UnitHref+'/supply',
                        data:postData + 'applyChanges=Изменить',
                        success:function(){
                            $('td:eq(11)',workCell).attr('class','nowrap').empty().append(obj1);
                            if (severity > 0) $('td:eq(11)',workCell).attr('class','highLight');
                        }
                    });
                }
                else if(severity > 0) {$('td:eq(11)',workCell).attr('class','nowrap').empty().append(obj1);$('td:eq(11)',workCell).attr('class','highLight');}
            }
        });
  } // End of function SetSupply()

  function setAll(){
   var qualification=$('input[name="qualification"]:checked').val();
   var supply=$('input[name="supply"]:checked').val();
   var setPrice=$('input[name="setPrice"]:checked').val()=="X"?"X":"";
   var arr = new Array();
   arr.length=0;
   $('table.list>tbody>tr>th:eq(0)>input').attr('checked',false); //uncheck group flag
   $('table.list>tbody>tr:gt(0):has(:checkbox) input:checked').each(function(){
     $(this).attr('checked',false); //uncheck
     var objCell = $(this).parent().parent();
     arr[arr.length] = objCell;
   })
   if(supply!="")          doit(arr,supply,' (setSuply'+supply+')',function(objCell,action){setSuply(objCell,action);});
   if(setPrice!="")        doit(arr,'',' (setPrice)',function(objCell,action){setPriceENVD(objCell,action);});
   return false;
  } //end of setAll()

    // Добавить кнопку фиксс. цен для магазина
    $("table.list tr:gt(0):has(:checkbox)").each(function(){
      var unit_id = /(\d+)/.exec($('td:eq(2)>a',this).attr('href'))[0];
      if (shop_price[unit_id] == today) {
	      var container = $("td:eq(2)", this);
        container.append($('<img id="' + unit_id + '" border="0" align="middle" style="margin-right: 1px" title="отменить фиксацию цен" src="/img/smallX.gif">').click(function(){
          delete shop_price[unit_id];
          window.localStorage.setItem( 'shop_price',  JSON.stringify( shop_price ) );
          $('#' + unit_id).remove();
        }));
      }
    });

    // Добавить фильтр поставок
    var sup = false;
    $('table.list>tbody>tr:eq(0) th:contains("Персонал")').attr('colspan',7);
    $('table.list>tbody>tr:eq(0)').append($('<th>Пост.</th>').click(function(){
      sup = ~sup;
      $('table.list>tbody>tr:gt(2):not([id*="steward"]):not(:last)>td [class="lock"]').parent().parent().parent().each(function(){sup?$(this).css('display','none'):$(this).css('display','table-row')});
    }));

    var m_block = $('<td width="235" id="id_unitsManage"><fieldset style="height: 110px;"><legend>"Управление"</legend>'
                +'<table><tbody>'
                   +'<tr>'
                      +'<td height="10" title="автоматический расчет поставок на предприятия, в магазинах, ресторанах и медцентрах">Sup</td>'
                      +'<td><input type="radio" value="" name="supply">X</td>'
                      +'<td><input type="radio" value="1:1" name="supply">1:1</td>'
                      +'<td><input type="radio" checked="true" value="x1" name="supply">x1</td>'
                    +'</tr>'
                   +'<tr>'
                      +'<td>'
                         +'<table><tbody>'
                            +'<tr>'
                               +'<td><input type="checkbox" value="X" name="setPrice" id="setPrice" title="автоматически перечистать цены в магазинах, ресторанах и сервисных предприятиях">Цены</td>'
                            +'</tr>'
                            +'<tr>'
                               +'<td><input type="checkbox" value="X" name="recalcPrice" id="recalcPrice" title="При авто установке цен, цены в магазинах будут пересчитаны для ВСЕХ позиций">rePrice</td>'
                            +'</tr>'
                            +'<tr>'
                               +'<td></td>'
                            +'</tr>'
                         +'</tbody></table>'
                      +'</td>'
                      +'<td colspan="2" align="center"><input type="button" id="btn_calc" value="Расчет"></td>'
                    +'</tr>'
                   +'</tbody></table>'
               +'</fieldset></td>');

    $('legend:contains("Управление персоналом выбранных подразделений")').parent().parent().after(m_block);
    $('#btn_calc').click(function(){setAll();});

    var pages = [[10,10],[25,25],[50,200],[100,400],[200,800],[400,1000]];
    paging(pages);
} // end of run()

// Хак, что бы получить полноценный доступ к DOM >:]
var script = document.createElement("script");
script.textContent = '(' + run.toString() + ')();';
document.documentElement.appendChild(script);