1
Changeset c473971 – MultiMag

Changeset c473971


Ignore:
Timestamp:
Feb 10, 2015, 11:11:36 PM (8 years ago)
Author:
Blacklight <blacklight@…>
Branches:
master
Children:
63901be
Parents:
97cf442
Message:
  • Добавлен модуль начисления зарплаты кладовщику #672
  • В модуль начисления зарплаты продавцу добавлена возможность учёта ликвидности и начисления ответственному #673
  • Добавлена возможность выводить информацию о резервах в номенклатурной таблице документов #670
  • Доработана вкладка *аналоги* редкатора наименования
  • В контекстное меню наименования добавлен пункт *аналоги*
  • Добавлена возможность расчёта ликвидности индивидуально для каждой группы товаров - $CONFIGsite?liquidity_per_group?
  • Исправлены ошибки в отчёте по заявкам покупателя
Files:
2 added
13 edited

Legend:

Unmodified
Added
Removed
  • common/async/dbcheck.php

    r97cf442 rc473971  
    6666                                        $db->query("INSERT INTO `doc_base_cnt` (`id`, `sklad`, `cnt`)   VALUES ('$pline[0]', '$sline[0]', '0')");
    6767                        }
     68                }
     69               
     70                $this->SetStatusText("Поиск проведённых документов с пометкой на удаление...");
     71                // Поиск проведённых документов с пометкой на удаление
     72                $res = $db->query("SELECT `id`, `altnum`, `subtype`
     73                    FROM `doc_list`
     74                WHERE `ok`>0 AND `mark_del`>0
     75                ORDER BY `date`");
     76                while ($nxt = $res->fetch_assoc()) {
     77                    $text = "Проведённый документ ID {$nxt['id']} ({$nxt['altnum']}{$nxt['subtype']}) помечен на удаление!\n";
     78                    echo $text;
     79                    $this->mail_text .= $text;
    6880                }
    6981               
     
    106118
    107119                // ============== Расчет ликвидности ===================================================
    108                 if (@$CONFIG['auto']['liquidity_interval'])
    109                         $dtim = time() - 60 * 60 * 24 * $CONFIG['auto']['liquidity_interval'];
    110                 else    $dtim = time() - 60 * 60 * 24 * 365;
    111                 $starttime = time();
    112                 $this->SetStatusText("Расчет ликвидности...");
    113                 $res = $db->query("SELECT `doc_list_pos`.`tovar`, COUNT(`doc_list_pos`.`tovar`) AS `aa`
    114                 FROM `doc_list_pos`, `doc_list`
    115                 WHERE `doc_list_pos`.`doc`= `doc_list`.`id` AND (`doc_list`.`type`='2' OR `doc_list`.`type`='3') AND `doc_list`.`date`>'$dtim'
    116                 GROUP BY `doc_list_pos`.`tovar`
    117                 ORDER BY `aa` DESC");
    118                 if ($res->num_rows) {
    119                         $nxt = $res->fetch_row();
    120                         $max = $nxt[1] / 100;
    121                         $db->query("CREATE TEMPORARY TABLE IF NOT EXISTS `doc_base_likv_update` (
    122                         `id` int(11) NOT NULL auto_increment,
    123                         `likvid` double NOT NULL,
    124                         UNIQUE KEY `id` (`id`)
    125                         ) ENGINE=Memory  DEFAULT CHARSET=utf8;");
    126 
    127                         $res->data_seek(0);
    128                         while ($nxt = $res->fetch_row()) {
    129                                 $l = $nxt[1] / $max;
    130                                 $db->query("INSERT INTO `doc_base_likv_update` VALUES ( $nxt[0], $l)");
    131                         }
    132 
    133                         $db->query("UPDATE `doc_base`,`doc_base_likv_update` SET `doc_base`.`likvid`=`doc_base_likv_update`.`likvid`  WHERE `doc_base`.`id`=`doc_base_likv_update`.`id`");
    134                         echo" сделано!\n";
    135                 }
    136 
     120                $this->SetStatusText("Расчет ликвидности...");
     121                $a_likv = getLiquidityOnDate(time());
     122                $db->query("CREATE TEMPORARY TABLE IF NOT EXISTS `doc_base_likv_update` (
     123                `id` int(11) NOT NULL auto_increment,
     124                `likvid` double NOT NULL,
     125                UNIQUE KEY `id` (`id`)
     126                ) ENGINE=Memory  DEFAULT CHARSET=utf8;");
     127
     128                foreach($a_likv as $pos_id => $likv) {
     129                    $db->query("INSERT INTO `doc_base_likv_update` VALUES ($pos_id, $likv)");
     130                }
     131
     132                $db->query("UPDATE `doc_base`,`doc_base_likv_update` SET `doc_base`.`likvid`=`doc_base_likv_update`.`likvid`
     133                    WHERE `doc_base`.`id`=`doc_base_likv_update`.`id`");
     134               
    137135                // ================ Проверка, что у всех перемещений установлен не нулевой склад назначения ===================
    138136                $res = $db->query("SELECT `doc_list`.`id`, `doc_dopdata`.`value`
     
    141139                WHERE `doc_list`.`type`='8'");
    142140                while ($nxt = $res->fetch_row()) {
    143                         if (!$nxt[1]) {
    144                                 $text = "У перемещения ID $nxt[0] не задан склад назначения. Остатки на складе не верны!\n";
    145                                 echo $text;
    146                                 $this->mail_text.=$text;
    147                         }
     141                    if (!$nxt[1]) {
     142                        $text = "У перемещения ID $nxt[0] не задан склад назначения. Остатки на складе не верны!\n";
     143                        echo $text;
     144                        $this->mail_text .= $text;
     145                    }
    148146                }
    149147
  • common/core.common.php

    r97cf442 rc473971  
    1818//
    1919
    20 define("MULTIMAG_REV", "744");
     20define("MULTIMAG_REV", "750");
    2121define("MULTIMAG_VERSION", "0.2.".MULTIMAG_REV);
    2222
     
    115115}
    116116
     117/// Расчёт ликвидности на заданную дату
     118/// @param $time дата в unixtime
     119/// @return array(pos_id => likv_value, ... )
     120function getLiquidityOnDate($time) {
     121    global $CONFIG, $db;
     122    settype($time, 'int');
     123    if (@$CONFIG['auto']['liquidity_interval']) {
     124        $start_time = $time - 60 * 60 * 24 * $CONFIG['auto']['liquidity_interval'];
     125    } else {
     126        $start_time = $time - 60 * 60 * 24 * 365;
     127    }
     128   
     129    $ret = array();
     130    $max_pg = array();
     131    $max = 0;
     132   
     133    $sql_fields = $sql_join = '';
     134    if(@$CONFIG['site']['liquidity_per_group']) {
     135        $sql_fields = ', `doc_base`.`group`';
     136        $sql_join = 'INNER JOIN `doc_base` ON `doc_base`.`id`=`doc_list_pos`.`tovar`';
     137    }
     138   
     139    $res = $db->query("SELECT `doc_list_pos`.`tovar`, COUNT(`doc_list_pos`.`tovar`) AS `aa` $sql_fields
     140        FROM `doc_list_pos`
     141        $sql_join
     142        INNER JOIN `doc_list` ON `doc_list_pos`.`doc`= `doc_list`.`id`
     143        WHERE (`doc_list`.`type`='2' OR `doc_list`.`type`='3') AND `doc_list`.`date`>='$start_time'
     144            AND `doc_list`.`date`<='$time' AND `doc_list`.`mark_del`=0
     145        GROUP BY `doc_list_pos`.`tovar`
     146        ORDER BY `aa` DESC");
     147    if ($res->num_rows) {
     148        while ($nxt = $res->fetch_row()) {
     149            if(@$CONFIG['site']['liquidity_per_group']) {
     150                if( !isset($max_pg[$nxt[2]]) ) {
     151                    $max_pg[$nxt[2]] = $nxt[1] / 100;
     152                }
     153                $ret[$nxt[0]] = round($nxt[1] / $max_pg[$nxt[2]], 2);
     154            } else {
     155                if(!$max) {
     156                    $max = $nxt[1] / 100;
     157                }
     158                $ret[$nxt[0]] = round($nxt[1] / $max, 2);
     159            }
     160        }
     161    }
     162    return $ret;
     163}
     164
    117165/// @brief Класс расширяет функциональность mysqli
    118166/// Т.к. используется почти везде, нет смысла выносить в отдельный файл
     
    121169        /// Начать транзакцию
    122170        function startTransaction(){
    123                 return $this->query("START TRANSACTION");
    124         }
     171            return $this->query("START TRANSACTION");
     172        }
     173       
     174        // FOR DEBUG !
     175//        function query($query) {
     176//            echo $query." <hr>\n";
     177//            return parent::query($query);
     178//        }
    125179       
    126180        /// Получить все значения строки из таблицы по ключу в виде массива
    127         /// @param table        Имя таблицы
    128         /// @param key_value    Значение ключа, по которому производится выборка. Будет приведено к целому типу.
     181        /// @param $table       Имя таблицы
     182        /// @param $key_value   Значение ключа, по которому производится выборка. Будет приведено к целому типу.
    129183        /// @return             В случае успеха возвращает ассоциативный массив с данными. В случае sql ошибки вернёт false. В случае, если искомой строки нет в таблице, вернет 0
    130184        function selectRow($table, $key_value) {
  • config_all.sample.php

    r97cf442 rc473971  
    6666$CONFIG['pricecalc']['notify']          = true; // Напоминать о периодических накопительных скидках незадолго до окончания периода фиксированной длительности
    6767
    68 ?>
     68$CONFIG['site']['liquidity_interval']   = 180;  // Периодически расчитывать ликвидность за X дней
     69$CONFIG['site']['liquidity_per_group']  = false;// Считать ликвидность по группам
  • config_cli.sample.php

    r97cf442 rc473971  
    6666$CONFIG['auto']['move_ntp_to_end']      = false;// Периодически перемещать непроведенные перемещения товаров на последний день
    6767$CONFIG['auto']['doc_del_days']         = 2;    // Периодически стирать отмеченные на удаление документы через X дней
    68 $CONFIG['auto']['liquidity_interval']   = 180;  // Периодически расчитывать ликвидность за X дней
    6968$CONFIG['auto']['resp_debt_notify']     = false;// Периодически информировать ответственных сотрудников о долгах их агентов
    7069$CONFIG['auto']['update_currency']      = true; // Периодически обновлять информацию о курсах валют
  • config_site.sample.php

    r97cf442 rc473971  
    5050$CONFIG['poseditor']['sn_enable']       = false;// Включить поддержку работы с серийными номерами
    5151$CONFIG['poseditor']['sn_restrict']     = false;// Включить ограничения на выписку документов без серийных номеров
    52 $CONFIG['poseditor']['vc']              = 0;    // Показывать код производителя
    53 $CONFIG['poseditor']['tdb']             = 0;    // Показывать размеры
    54 $CONFIG['poseditor']['rto']             = 1;    // Показывать резервы/транзиты/заявки
     52$CONFIG['poseditor']['vc']              = true; // Показывать код производителя
     53$CONFIG['poseditor']['tdb']             = false;// Показывать размеры
     54$CONFIG['poseditor']['rto']             = true; // Показывать резервы/транзиты/заявки
     55$CONFIG['poseditor']['show_reserve']    = false;// Показывать резервы в таблице документа
    5556$CONFIG['poseditor']['true_gtd']        = false;// Cхема учёта ГТД. false - ГТД берётся из доп. свойств наименования
    5657                                                // 'easy' - ГТД берутся из поступлений.
     
    129130$CONFIG['1csync']['pass']       = '';
    130131
    131 $CONFIG['doc_scripts']['zp_s_prodaj.coeff']=    0.05;   // Коэффициент начислений для зарплаты с продаж
     132$CONFIG['doc_scripts']['zp_s_prodaj.coeff']     = 0.05; // Коэффициент начислений для зарплаты с продаж
     133$CONFIG['doc_scripts']['zp_s_prodaj.l_coeff']   = 0.5;  // Коэффициент понижения зарплаты от ликвидности. Диапазон от -1 до 1
    132134$CONFIG['doc_scripts']['zp_s_prodaj_conn.new_coeff']=0.02;
    133135$CONFIG['doc_scripts']['zp_s_prodaj_conn.new_days']=90;
  • web/css/core.js

    r97cf442 rc473971  
    123123function ShowPosContextMenu(event, pos_id, addition)
    124124{
    125         var menu=CreateContextMenu(event)
    126         var dt = new Date()
    127         var nowdate=dt.getFullYear()+'-'+((dt.getMonth()<9)?('0'+(dt.getMonth()+1)):(dt.getMonth()+1))+'-'+((dt.getDate()<10)?('0'+dt.getDate()):dt.getDate())
    128         menu.innerHTML= "<div onclick=\"window.open('/docj_new.php?pos_id="+pos_id+"')\">Товар в журнале</div>"+
    129         "<div onclick=\"window.open('/doc_reports.php?mode=sales&amp;w_docs=1&amp;sel_type=pos&amp;opt=pdf&amp;dt_t="+nowdate+"&amp;pos_id="+pos_id+"')\">Отчёт по движению</div>"+
    130         "<div onclick=\"window.open('/docs.php?mode=srv&amp;opt=ep&amp;pos="+pos_id+"')\">Редактирование товара</div>"+
    131         "<div onclick=\"ShowPopupWin('/docs.php?l=pran&amp;mode=srv&amp;opt=ceni&amp;pos="+pos_id+"'); return false;\" >Где и по чём</div>"+addition
    132         return menu
     125    var menu = CreateContextMenu(event);
     126    var dt = new Date();
     127    var nowdate = dt.getFullYear() + '-' + ((dt.getMonth() < 9) ? ('0' + (dt.getMonth() + 1)) : (dt.getMonth() + 1)) + '-' + ((dt.getDate() < 10) ? ('0' + dt.getDate()) : dt.getDate());
     128    menu.innerHTML = "<div onclick=\"window.open('/docj_new.php?pos_id=" + pos_id + "')\">Товар в журнале</div>" +
     129        "<div onclick=\"window.open('/doc_reports.php?mode=sales&amp;w_docs=1&amp;sel_type=pos&amp;opt=pdf&amp;dt_t=" + nowdate + "&amp;pos_id=" + pos_id + "')\">Отчёт по движению</div>" +
     130        "<div onclick=\"window.open('/docs.php?mode=srv&amp;opt=ep&amp;pos=" + pos_id + "')\">Редактирование товара</div>" +
     131        "<div onclick=\"ShowPopupWin('/docs.php?l=pran&amp;mode=srv&amp;opt=ceni&amp;pos=" + pos_id + "'); return false;\" >Где и по чём</div>" +
     132        "<div onclick=\"window.open('/docs.php?mode=srv&amp;opt=ep&amp;param=n&amp;pos=" + pos_id + "')\">Аналоги</div>" +
     133        addition;
     134    return menu;
    133135}
    134136
  • web/include/doc.core.php

    r97cf442 rc473971  
    589589/// @sa DocPodZakaz DocVPuti
    590590/// TODO: реализовать кеширование
    591 function DocRezerv($pos_id,$doc_id=0)
     591function DocRezerv($pos_id, $doc_id=0)
    592592{
    593593        global $db;
  • web/include/doc.poseditor.php

    r97cf442 rc473971  
    2626        var $show_tdb;          ///< Показывать тип/размеры/массу
    2727        var $show_rto;          ///< Показывать резерв/в пути/предложения
    28         var $list;      // Список наименований
     28        var $show_reserve;      ///< Отображать колонку резервов в основной таблице
     29        var $list;              //< Список наименований
    2930
    3031        /// Конструктор
    3132        function __construct(){
    32                 global $CONFIG;
    33                 $this->editable=0;
    34                 $this->show_vc=@$CONFIG['poseditor']['vc'];
    35                 $this->show_tdb=@$CONFIG['poseditor']['tdb'];
    36                 $this->show_rto=@$CONFIG['poseditor']['rto'];
    37         }
     33            global $CONFIG;
     34            $this->editable = 0;
     35            $this->show_vc = @$CONFIG['poseditor']['vc'];
     36            $this->show_tdb = @$CONFIG['poseditor']['tdb'];
     37            $this->show_rto = @$CONFIG['poseditor']['rto'];
     38            $this->show_reserve = @$CONFIG['poseditor']['show_reserve'];
     39        }
    3840
    3941        /// Разрешить или запретить изменение данных в списке наименований
    40         /// @param editable 0: запретить, 1: разрешить
     42        /// @param $editable 0: запретить, 1: разрешить
    4143        function SetEditable($editable)
    4244        {
     
    119121}
    120122
    121 /// Редактор списка наименований документа.
     123/// @brief Редактор списка наименований документа.
    122124/// При создании экземпляра класса нужно указать ID существующеего документа
    123125class DocPosEditor extends PosEditor {
    124         var $doc;       // Id документа
    125         var $doc_obj;   // Объект ассоциированного документа
    126         var $show_sn;   // Показать серийные номера
    127         var $show_gtd;  // Показывать номер ГТД в поступлении
    128         var $list;      // Список товаров
    129 
     126        var $doc;       //< Id документа
     127        var $doc_obj;   //< Объект ассоциированного документа
     128        var $show_sn;   //< Показать серийные номера
     129        var $show_gtd;  //< Показывать номер ГТД в поступлении
     130        var $list;      //< Список товаров
     131        var $npv;       //< Не отображать производителя
     132/// Конструктор
     133/// @param $doc id редактироуемого документа
    130134public function __construct($doc) {
    131135        global $CONFIG;
     
    138142        if( @$CONFIG['poseditor']['sn_enable'] && ($doc_data['type']==1 || $doc_data['type']==2))       $this->show_sn=1;
    139143        if( @$CONFIG['poseditor']['true_gtd'] && $doc_data['type']==1)                                  $this->show_gtd=1;
     144        $this->npv = @$CONFIG['doc']['no_print_vendor'];
    140145        $pc = PriceCalc::getInstance();
    141146        $pc->setAgentId($doc_data['agent']);
     
    146151protected function loadList() {
    147152        global $db;
    148         if(is_array($this->list))
    149                 return;
    150         $this->list = array();
     153        if (is_array($this->list)) {
     154            return;
     155        }
     156        $this->list = array();
    151157        $res = $db->query("SELECT `doc_list_pos`.`id` AS `line_id`, `doc_base`.`id` AS `pos_id`, `doc_base`.`vc`, `doc_base`.`name`,
    152158                        `doc_base`.`proizv` AS `vendor`, `doc_base`.`cost` AS `base_price`, `doc_list_pos`.`cnt`, `doc_list_pos`.`cost`,
     
    158164                WHERE `doc_list_pos`.`doc`='{$this->doc}' AND `doc_list_pos`.`page`='0'
    159165                ORDER BY `doc_list_pos`.`id`");
    160         while ($nxt = $res->fetch_assoc())
    161                 $this->list[$nxt['line_id']] = $nxt;
    162 }
     166        while ($nxt = $res->fetch_assoc()) {
     167            $this->list[$nxt['line_id']] = $nxt;
     168        }
     169    }
    163170
    164171/// Перезагрузить список товаров
     
    245252        $cols[] = 'store_cnt';
    246253        $col_names[] = 'Остаток';
     254        if($this->show_reserve) {
     255            $cols[] = 'reserve';
     256            $col_names[] = 'Резерв';
     257        }
    247258        $cols[] = 'place';
    248259        $col_names[] = 'Место';
     
    323334        $pos_array = array();
    324335        foreach ($this->list as $nxt) {
     336                if($this->show_reserve) {
     337                    $nxt['reserve'] = DocRezerv($nxt['pos_id'], 0);
     338                }
    325339                if ($this->cost_id)
    326340                        $nxt['scost'] = $pc->getPosSelectedPriceValue($nxt['pos_id'], $this->cost_id, $nxt);
     
    405419                        if(! @$CONFIG['doc']['no_print_vendor'])
    406420                                $nxt['name'].=' - '.$nxt['vendor'];
    407                        
     421                        if($this->show_reserve) {
     422                            $nxt['reserve'] = DocRezerv($nxt['pos_id'], 0);
     423                        }
    408424                        $ret = "{response: 3, data:".json_encode($nxt, JSON_UNESCAPED_UNICODE)."}";
    409425                }
     
    542558                $line['pos_id'] = $line['id'];
    543559                $line['gtd'] = '';
    544                 if(! @$CONFIG['doc']['no_print_vendor'])
    545                                 $line['name'].=' - '.$line['vendor'];
    546                
    547                 if(!$this->cost_id) {
     560                if (!$this->npv) {
     561                        $line['name'].=' - ' . $line['vendor'];
     562                }
     563
     564                if(!$this->cost_id) {
    548565                        $retail_price_id = $pc->getRetailPriceId();
    549566                        $auto_price_id = $pc->getPosAutoPriceID($line['pos_id'], $cnt);
     
    566583                        }
    567584                }
     585               
     586                if($this->show_reserve) {
     587                    $line['reserve'] = DocRezerv($line['pos_id'], 0);
     588                }
    568589               
    569590                $ret_data['response'] = 'add';
     
    930951               
    931952                return json_encode($result, JSON_UNESCAPED_UNICODE);
    932                
    933 //              $sqla = $sql . "WHERE `doc_base`.`name` LIKE '$s_sql%' OR `doc_base`.`vc` LIKE '$s_sql%' ORDER BY " . $this->getOrder() . " LIMIT 200";
    934 //              $res = $db->query($sqla);
    935 //              if ($cnt = $res->num_rows) {
    936 //                      if ($ret != '')
    937 //                              $ret.=', ';
    938 //                      $ret.="{id: 'header', name: 'Поиск по названию, начинающемуся на $s_json - $cnt наименований найдено'}";
    939 //                      $ret = $this->FormatResult($res, $ret);
    940 //              }
    941 //              $sqla = $sql . "WHERE (`doc_base`.`name` LIKE '%$s_sql%' OR `doc_base`.`vc` LIKE '%$s_sql%') AND `doc_base`.`name` NOT LIKE '$s_sql%'
    942 //                      AND `doc_base`.`vc` NOT LIKE '$s_sql%' ORDER BY " . $this->getOrder() . " LIMIT 100";
    943 //              $res = $db->query($sqla);
    944 //              if ($cnt = $res->num_rows) {
    945 //                      if ($ret != '')
    946 //                              $ret.=', ';
    947 //                      $ret.="{id: 'header', name: 'Поиск по названию, содержащему $s_json - $cnt наименований найдено'}";
    948 //                      $ret = $this->FormatResult($res, $ret);
    949 //              }
    950 //              $sqla = $sql . "WHERE `doc_base_dop`.`analog` LIKE '%$s_sql%' AND `doc_base`.`name` NOT LIKE '%$s_sql%' AND `doc_base`.`vc` NOT LIKE '%$s_sql%'
    951 //                      ORDER BY " . $this->getOrder() . " LIMIT 100";
    952 //              $res = $db->query($sqla);
    953 //              if ($cnt = $res->num_rows) {
    954 //                      if ($ret != '')
    955 //                              $ret.=', ';
    956 //                      $ret.="{id: 'header', name: 'Поиск по аналогу($s_json) - $cnt наименований найдено'}";
    957 //                      $ret = $this->FormatResult($res, $ret);
    958 //              }
    959 //              return $ret;
    960953        }
    961954
  • web/include/doc.s.inform.php

    r97cf442 rc473971  
    9595                }
    9696        }
    97 };
     97}
    9898
    99 ?>
  • web/include/doc.s.sklad.php

    r97cf442 rc473971  
    413413                // Дополнительные свойства
    414414                else if ($param == 'd') {
    415                         $pres = $db->query("SELECT `doc_base_dop`.`type`, `doc_base_dop`.`analog`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base_dop`.`ntd`, `doc_base`.`group` AS `group_id`
    416                         FROM `doc_base`
    417                         LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`='$pos'
    418                         WHERE `doc_base`.`id`='$pos'");
    419                        
    420                         if($pres->num_rows) {
    421                                 $pos_info = $pres->fetch_assoc();
    422                         }
    423                         else {
    424                                 $pos_info = array();
    425                                 foreach ($this->dop_vars as $value)
    426                                         $pos_info[$value] = '';                         
    427                         }
    428                        
    429                         $tmpl->addContent("
    430                         <script type=\"text/javascript\">
    431                         function rmLine(t) {
    432                                 var line=t.parentNode.parentNode
    433                                 line.parentNode.removeChild(line)
    434                         }
    435 
    436                         function addLine() {
    437                                 var fgtab=document.getElementById('fg_table').tBodies[0]
    438                                 var sel=document.getElementById('fg_select')
    439                                 var newrow=fgtab.insertRow(fgtab.rows.length)
    440                                 var lineid=sel.value
    441                                 var ctext = sel.selectedIndex !== -1 ? sel.options[sel.selectedIndex].text : ''
    442                                 var text=document.getElementById('value_add').value
    443                                 newrow.innerHTML=\"<td align='right'>\"+ctext+\"</td><td><input type='text' name='par[\"+lineid+\"]' value='\"+text+\"'></td>\"
    444                         }
    445 
    446                         </script>
    447                         <form action='' method='post'>
    448                         <input type='hidden' name='mode' value='esave'>
    449                         <input type='hidden' name='l' value='sklad'>
    450                         <input type='hidden' name='pos' value='$pos'>
    451                         <input type='hidden' name='param' value='d'>
    452                         <table cellpadding='0' width='100%' id='fg_table' class='list'>
    453                         <tfoot>
    454                         <tr><td align='right'><select name='pp' id='fg_select'>");
    455                         $r = $db->query("SELECT `id`, `param`, `type` FROM `doc_base_params` WHERE `system`='0' ORDER BY `param`");
    456                         while ($p = $r->fetch_row()) {
    457                                 $tmpl->addContent("<option value='$p[0]'>".html_out($p[1])."</option>");
    458                         }
    459                        
    460 //                                              <tr><td align='right'>Аналог<br>
    461 //                      <b style='color: #f00'>Поле запланировано к уделению!<br>Не заполняйте его, информация буде утеряна.<br>Используйте вкладку *аналоги* или строку *имя группы аналогов* в основных свойствах!</b>
    462 //                     
    463 //                      <td><input type='text' name='analog' value='".html_out($pos_info['analog'])."' id='pos_analog'>
    464                        
    465                         $tmpl->addContent("</select></td><td><input type='text' id='value_add'><img src='/img/i_add.png' alt='' onclick='return addLine()'></td></tr>
    466                         </td></tr>
    467                         <tr><td><td><input type='submit' value='Сохранить'>
    468                         </tfoot>
    469                         <tbody>
    470                         <tr><td align='right'>Тип<td><select name='type' id='pos_type' >
    471                         <option value='null'>--не задан--</option>");
    472 
    473                         $res = $db->query("SELECT `id`, `name` FROM `doc_base_dop_type` ORDER BY `id`");
    474                         while ($nx = $res->fetch_row()) {
    475                                 $ii = "";
    476                                 if ($nx[0] === $pos_info['type'])
    477                                         $ii = " selected";
    478                                 $tmpl->addContent("<option value='$nx[0]' $ii>".html_out("$nx[0] - $nx[1]")."</option>");
    479                         }
    480 
    481                         $tmpl->addContent("</select>
    482                         <tr class='lin1'><td align='right'>Внутренний размер (d)<td><input type='text' name='d_int' value='{$pos_info['d_int']}' id='pos_d_int'></td></tr>
    483                         <tr class='lin0'><td align='right'>Внешний размер (D)<td><input type='text' name='d_ext' value='{$pos_info['d_ext']}' id='pos_d_ext'></td></tr>
    484                         <tr class='lin1'><td align='right'>Высота (B)<td><input type='text' name='size' value='{$pos_info['size']}' id='pos_size'></td></tr>
    485                         <tr class='lin0'><td align='right'>Номер таможенной декларации
    486                                 <br><b style='color: #f00'>Поле запланировано к уделению!
    487                                 <br>Не заполняйте его, информация буде утеряна.<br>
    488                                 Номер таможенной декларации задаётся при поступлении!</b>
    489                                 <td><input type='text' name='ntd' value='{$pos_info['ntd']}'></td></tr>");
    490                        
    491                         $dpv_res = $db->query("SELECT `doc_base_values`.`param_id`, `doc_base_params`.`param`, `doc_base_values`.`value` FROM `doc_base_values`
    492                         LEFT JOIN `doc_base_params` ON `doc_base_params`.`id`=`doc_base_values`.`param_id`
    493                         WHERE `doc_base_values`.`id`='$pos'");
    494                         $i = 0;
    495                         while ($nx = $dpv_res->fetch_row()) {
    496                                 $tmpl->addContent("<tr class='lin$i'><td align='right'>".$nx[1]."<td><input type='text' name='par[$nx[0]]' value='".html_out($nx[2])."'>");
    497                                 $i = 1 - $i;
    498                         }
    499                         $gdp_res = $db->query("SELECT `doc_base_params`.`id`, `doc_base_params`.`param`, `doc_group_params`.`show_in_filter`
    500                         FROM `doc_base_params`
    501                         LEFT JOIN `doc_group_params` ON `doc_group_params`.`param_id`=`doc_base_params`.`id`
    502                         WHERE `doc_group_params`.`group_id`='{$pos_info['group_id']}' AND `doc_base_params`.`system`='0' AND `doc_base_params`.`id` NOT IN ( SELECT `doc_base_values`.`param_id` FROM `doc_base_values` WHERE `doc_base_values`.`id`='$pos' )
    503                         ORDER BY `doc_base_params`.`id`");
    504                         while ($nx = $gdp_res->fetch_row()) {
    505                                 $tmpl->addContent("<tr class='lin$i'><td align='right'>".html_out($nx[1])."</td><td><input type='text' name='par[$nx[0]]' value=''>");
    506                                 $i = 1 - $i;
    507                         }
    508                         $tmpl->addContent("</tbody></table></form>");
     415                    $this->dopDataEditForm($pos);
    509416                }
    510417                // Складские свойства
     
    909816                // Аналоги
    910817                else if ($param == 'n') {
    911                        
    912                         $pos_info = $db->selectRow('doc_base', $pos);
    913                        
    914                         $analog_group = $pos_info['analog_group'];
    915                         $tmpl->addContent("<form action='' method='post'>
    916                         <input type='hidden' name='mode' value='esave'>
    917                         <input type='hidden' name='l' value='sklad'>
    918                         <input type='hidden' name='pos' value='$pos'>
    919                         <input type='hidden' name='param' value='n'>
    920                         Имя группы аналогов:<br>
    921                         <input type='text' name='analog_group' value='$analog_group'>
    922                         <button type='submit'>Записать</button>
    923                         </form>
    924                         <h3>Аналоги в группе</h3>
    925                         <table class='list'><tr><th>id</th><th>Код</th><th>Название</th><th>Производитель</th></tr>");
    926                         $analog_group_sql = $db->real_escape_string($analog_group);
    927                         $res = $db->query("SELECT `id`, `vc`, `name`, `proizv` FROM `doc_base`
    928                                 WHERE `analog_group`='$analog_group_sql' AND `analog_group`!=''");
    929                         while($line = $res->fetch_assoc()) {
    930                                 $tmpl->addContent("<tr><td><a href='/docs.php?mode=srv&amp;opt=ep&amp;pos={$line['id']}'>{$line['id']}</a></td><td>{$line['vc']}</td><td>{$line['name']}</td><td>{$line['proizv']}</td></tr>");
    931                         }
    932                        
    933                         $tmpl->addContent("</table>");
     818                    $pos_info = $db->selectRow('doc_base', $pos);
     819
     820                    $analog_group = $pos_info['analog_group'];
     821                    $tmpl->addContent("<form action='' method='post'>
     822                    <input type='hidden' name='mode' value='esave'>
     823                    <input type='hidden' name='l' value='sklad'>
     824                    <input type='hidden' name='pos' value='$pos'>
     825                    <input type='hidden' name='param' value='n'>
     826                    Имя группы аналогов:<br>
     827                    <input type='text' name='analog_group' value='$analog_group'>
     828                    <button type='submit'>Записать</button>
     829                    </form>
     830                    <h3>Аналоги в группе</h3>
     831                    <table class='list'>
     832                    <tr><th>id</th><th>Код</th><th>Название</th><th>Производитель</th><th>Цена</th><th>Остаток</th>");
     833                    if(@$CONFIG['poseditor']['rto']) {
     834                        $tmpl->addContent("<th>Резерв</th><th>Под заказ</th><th>В пути</th>");
     835                    }
     836                    $tmpl->addContent("</tr>");
     837                   
     838                    $base_link = '/docs.php?mode=srv';
     839                    $analog_group_sql = $db->real_escape_string($analog_group);
     840                    $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`vc`, `doc_base`.`name`, `doc_base`.`proizv` AS `vendor`, `cost` AS `price`, (
     841                            SELECT SUM(`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id`
     842                        ) AS `cnt`
     843                        FROM `doc_base`
     844                        WHERE `analog_group`='$analog_group_sql' AND `analog_group`!=''");
     845                    while($line = $res->fetch_assoc()) {
     846                        $link = $base_link.'&amp;pos='.$line['id'];
     847                        $rto = '';
     848                        if (@$CONFIG['poseditor']['rto']) {
     849                            $clink = $link.'&amp;l=inf';
     850                            $rezerv = DocRezerv($line['id']);
     851                            $pod_zakaz = DocPodZakaz($line['id']);
     852                            $v_puti = DocVPuti($line['id']);
     853                            if ($rezerv) {
     854                                $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=rezerv'); return false;\" href='#'>$rezerv</a></td>";
     855                            } else {
     856                                $rto .= "<td></td>";
     857                            }
     858                            if ($pod_zakaz) {
     859                                $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=p_zak'); return false;\" href='#'>$pod_zakaz</a></td>";
     860                            } else {
     861                                $rto .= "<td></td>";
     862                            }
     863                            if ($v_puti) {
     864                                $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=vputi'); return false;\" href='#'>$v_puti</a></td>";
     865                            } else {
     866                                $rto .= "<td></td>";
     867                            }
     868                        }
     869                        if ($line['cnt'] != 0) {
     870                            $line['cnt'] = "<a href='#' onclick=\"ShowPopupWin('$link&amp;opt=ost'); return false;\" title='Отобразить все остатки'>{$line['cnt']}</a>";
     871                        } else {
     872                            $line['cnt'] = '';
     873                        }
     874                        $tmpl->addContent("<tr>
     875                            <td><a href='{$link}&amp;opt=ep'>{$line['id']}</a></td>
     876                            <td>{$line['vc']}</td><td>{$line['name']}</td><td>{$line['vendor']}</td>
     877                            <td align='right'>{$line['price']}</td><td align='right'>{$line['cnt']}</td>$rto
     878                            </tr>");
     879                    }
     880
     881                    $tmpl->addContent("</table>");
    934882                }
    935883                // История изменений
     
    11561104                        else {
    11571105                                $url = request('url');
     1106                                $keywords = null;   // Чтобы подсветка не ругалась
    11581107                                preg_match("/[?]*modelid=([\d]{1,9})[?]*+/", $url, $keywords);
    11591108                                $ym_id = $keywords[1];
     
    13991348                       
    14001349                        $db->query("REPLACE `doc_base_dop` (`id`, `analog`, `type`, `d_int`, `d_ext`, `size`, `ntd`)
    1401                                 VALUES ('$pos', '$analog_sql', $type, '$d_int_sql', '$d_ext_sql', '$size_sql', '$ntd_sql')");
     1350                            VALUES ('$pos', '$analog_sql', $type, '$d_int_sql', '$d_ext_sql', '$size_sql', '$ntd_sql')");
    14021351
    14031352                        $res = $db->query("SELECT `param_id`, `value` FROM `doc_base_values` WHERE `id`='$pos'");
     
    14071356                        $par = request('par');
    14081357                        if (is_array($par)) {
    1409                                 foreach ($par as $key => $value) {
    1410                                         $key_sql = $db->real_escape_string($key);
    1411                                         if ($value !== '') {
    1412                                                 $value_sql = $db->real_escape_string($value);
    1413                                                 if (@$dp[$key] != $value)
    1414                                                         $log_add.=@", $key:({$old_data[$key]} => $value)";
    1415                                                 $db->query("REPLACE `doc_base_values` (`id`, `param_id`, `value`) VALUES ('$pos', '$key_sql', '$value_sql')");
    1416                                         }
    1417                                         else    $db->query("DELETE FROM `doc_base_values` WHERE `id`='$pos' AND `param_id`='$key_sql'");
    1418                                 }
     1358                            foreach ($par as $key => $value) {
     1359                                $key_sql = $db->real_escape_string($key);
     1360                                if ($value !== '') {
     1361                                    $value_sql = $db->real_escape_string($value);
     1362                                    if (@$dp[$key] != $value) {
     1363                                        $log_add.=@", $key:({$old_data[$key]} => $value)";
     1364                                    }
     1365                                    $db->query("REPLACE `doc_base_values` (`id`, `param_id`, `value`) VALUES ('$pos', '$key_sql', '$value_sql')");
     1366                                }
     1367                                else {
     1368                                    $db->query("DELETE FROM `doc_base_values` WHERE `id`='$pos' AND `param_id`='$key_sql'");
     1369                                }
     1370                            }
    14191371                        }
    14201372
     
    14221374                        $value_add = request('value_add');
    14231375                        if ($par_add && $value_add) {
    1424                                 $par_sql = $db->real_escape_string($par_add);
    1425                                 $value_add = $db->real_escape_string($value_sql);
    1426                                 $db->query("REPLACE `doc_base_values` (`id`, `param_id`, `value`) VALUES ('$pos', '$par_add', '$value_sql')");
    1427                                 if ($dp[$key] != $value)
    1428                                         $log_add.=", $par_add:$value_add";
    1429                         }
    1430                         if ($log_add)
    1431                                 doc_log("UPDATE", "$log_add", 'pos', $pos);
     1376                            $par_sql = $db->real_escape_string($par_add);
     1377                            $value_add = $db->real_escape_string($value_sql);
     1378                            $db->query("REPLACE `doc_base_values` (`id`, `param_id`, `value`) VALUES ('$pos', '$par_add', '$value_sql')");
     1379                            if ($dp[$key] != $value) {
     1380                                $log_add.=", $par_add:$value_add";
     1381                            }
     1382                        }
     1383                        if ($log_add) {
     1384                            doc_log("UPDATE", "$log_add", 'pos', $pos);
     1385                        }
    14321386                        $tmpl->msg("Данные сохранены!");
     1387                       
     1388                        $this->dopDataEditForm($pos);
    14331389                }
    14341390                else if ($param == 's') {
     
    22992255                        $pc = PriceCalc::getInstance();
    23002256                while ($nxt = $res->fetch_assoc()) {
    2301                         $rezerv = $CONFIG['poseditor']['rto'] ? DocRezerv($nxt['id'], 0) : '';
    2302                         $pod_zakaz = $CONFIG['poseditor']['rto'] ? DocPodZakaz($nxt['id'], 0) : '';
    2303                         $v_puti = $CONFIG['poseditor']['rto'] ? DocVPuti($nxt['id'], 0) : '';
    2304                        
    2305 
    2306                         if ($rezerv)    $rezerv = "<a onclick=\"ShowPopupWin('/docs.php?l=inf&mode=srv&opt=rezerv&pos={$nxt['id']}'); return false;\"  title='Отобразить документы' href='/docs.php?l=inf&mode=srv&opt=p_zak&pos={$nxt['id']}'>$rezerv</a>";
    2307                         else            $rezerv = '';
    2308                         if ($pod_zakaz) $pod_zakaz = "<a onclick=\"ShowPopupWin('/docs.php?l=inf&mode=srv&opt=p_zak&pos={$nxt['id']}'); return false;\"  title='Отобразить документы' href='/docs.php?l=inf&mode=srv&opt=p_zak&pos={$nxt['id']}'>$pod_zakaz</a>";
    2309                         else            $pod_zakaz = '';
    2310                         if ($v_puti)    $v_puti = "<a onclick=\"ShowPopupWin('/docs.php?l=inf&mode=srv&opt=vputi&pos={$nxt['id']}'); return false;\"  title='Отобразить документы' href='/docs.php?l=inf&mode=srv&opt=vputi&pos={$nxt['id']}'>$v_puti</a>";
    2311                         else            $v_puti = '';
    2312 
     2257                        if (@$CONFIG['poseditor']['rto']) {
     2258                            $rezerv = DocRezerv($nxt['id'], 0);
     2259                            $pod_zakaz = DocPodZakaz($nxt['id'], 0);
     2260                            $v_puti = DocVPuti($nxt['id'], 0);
     2261
     2262                            if ($rezerv)        $rezerv = "<a onclick=\"ShowPopupWin('/docs.php?l=inf&mode=srv&opt=rezerv&pos={$nxt['id']}'); return false;\"  title='Отобразить документы' href='/docs.php?l=inf&mode=srv&opt=p_zak&pos={$nxt['id']}'>$rezerv</a>";
     2263                            else                $rezerv = '';
     2264                            if ($pod_zakaz)     $pod_zakaz = "<a onclick=\"ShowPopupWin('/docs.php?l=inf&mode=srv&opt=p_zak&pos={$nxt['id']}'); return false;\"  title='Отобразить документы' href='/docs.php?l=inf&mode=srv&opt=p_zak&pos={$nxt['id']}'>$pod_zakaz</a>";
     2265                            else                $pod_zakaz = '';
     2266                            if ($v_puti)        $v_puti = "<a onclick=\"ShowPopupWin('/docs.php?l=inf&mode=srv&opt=vputi&pos={$nxt['id']}'); return false;\"  title='Отобразить документы' href='/docs.php?l=inf&mode=srv&opt=vputi&pos={$nxt['id']}'>$v_puti</a>";
     2267                            else                $v_puti = '';
     2268                        }
    23132269                        if ($nxt['allcnt'] != 0)        $nxt['allcnt'] = "<a onclick=\"ShowPopupWin('/docs.php?mode=srv&opt=ost&pos={$nxt['id']}'); return false;\" title='Отобразить все остатки'>{$nxt['allcnt']}</a>";
    23142270                        else                            $nxt['allcnt'] = '';
     
    23612317                        else
    23622318                                $tdb_add = '';
    2363                         if (@$CONFIG['poseditor']['rto'])
     2319                        if (@$CONFIG['poseditor']['rto']) {
    23642320                                $rto_add = "<td>$rezerv</td><td>$pod_zakaz</td><td>$v_puti</td>";
     2321                        }
    23652322                        else    $rto_add = '';
    23662323
     
    24352392                </ul>");
    24362393        }
    2437 
     2394       
     2395    protected function dopDataEditForm($pos_id) {
     2396        global $db, $tmpl;
     2397        $pres = $db->query("SELECT `doc_base_dop`.`type`, `doc_base_dop`.`analog`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`,
     2398            `doc_base_dop`.`size`, `doc_base_dop`.`ntd`, `doc_base`.`group` AS `group_id`
     2399        FROM `doc_base`
     2400        LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`='$pos_id'
     2401        WHERE `doc_base`.`id`='$pos_id'");
     2402
     2403        if($pres->num_rows) {
     2404                $pos_info = $pres->fetch_assoc();
     2405        }
     2406        else {
     2407            $pos_info = array();
     2408            foreach ($this->dop_vars as $value) {
     2409                $pos_info[$value] = '';
     2410            }
     2411        }
     2412       
     2413        // option для select типа
     2414        $type_opt = "<option value='null'>--не задан--</option>";
     2415        $res = $db->query("SELECT `id`, `name` FROM `doc_base_dop_type` ORDER BY `id`");
     2416        while ($nx = $res->fetch_row()) {
     2417            $ii = "";
     2418            if ($nx[0] === $pos_info['type']) {
     2419                $ii = " selected";
     2420            }
     2421            $type_opt .= "<option value='$nx[0]' $ii>" . html_out("$nx[0] - $nx[1]") . "</option>";
     2422        }
     2423       
     2424        // Динамические свойства - записанные
     2425        $dyn_table = '';
     2426        $g_res = $db->query("SELECT * FROM `doc_base_gparams` ORDER BY `name`");
     2427        while ($g_info = $g_res->fetch_assoc()) {
     2428            $dyn_table .= "<tr><th colspan='2'>".html_out($g_info['name'])."</th></tr>";
     2429            $dpv_res = $db->query("SELECT `doc_base_values`.`param_id`, `doc_base_params`.`param`, `doc_base_values`.`value`
     2430                FROM `doc_base_values`
     2431                LEFT JOIN `doc_base_params` ON `doc_base_params`.`id`=`doc_base_values`.`param_id`
     2432                WHERE `doc_base_values`.`id`='$pos_id' AND `doc_base_params`.`system`=0");
     2433            while ($nx = $dpv_res->fetch_row()) {
     2434                $dyn_table .= "<tr><td align='right'>".html_out($nx[1])."</td><td><input type='text' name='par[$nx[0]]' value='".html_out($nx[2])."'></td></tr>";
     2435            }
     2436        }
     2437        $dyn_table .= "<tr><td colspan='2'</td></tr>";
     2438        // Динамические свойства - от групп
     2439        $gdp_res = $db->query("SELECT `doc_base_params`.`id`, `doc_base_params`.`param`, `doc_group_params`.`show_in_filter`
     2440            FROM `doc_base_params`
     2441            LEFT JOIN `doc_group_params` ON `doc_group_params`.`param_id`=`doc_base_params`.`id`
     2442            WHERE `doc_group_params`.`group_id`='{$pos_info['group_id']}' AND `doc_base_params`.`system`='0'
     2443                AND `doc_base_params`.`id` NOT IN ( SELECT `doc_base_values`.`param_id` FROM `doc_base_values` WHERE `doc_base_values`.`id`='$pos_id' )
     2444            ORDER BY `doc_base_params`.`id`");
     2445        while ($nx = $gdp_res->fetch_row()) {
     2446            $dyn_table .= "<tr><td align='right'>".html_out($nx[1])."</td><td><input type='text' name='par[$nx[0]]' value=''></td></tr>";
     2447        }
     2448       
     2449        // добавление динамических свойств
     2450        $dyn_foot = "<tr><td align='right'><select name='pp' id='fg_select'>"; 
     2451        $r = $db->query("SELECT `id`, `param`, `type` FROM `doc_base_params` WHERE `system`='0' AND `pgroup_id` IS NULL ORDER BY `param`");
     2452        while ($p = $r->fetch_row()) {
     2453            $dyn_foot .= "<option value='$p[0]'>".html_out($p[1])."</option>";
     2454        }
     2455        $g_res = $db->query("SELECT * FROM `doc_base_gparams` ORDER BY `name`");
     2456        while ($g_info = $g_res->fetch_assoc()) {
     2457            $dyn_foot .= "<option style='color:#fff; background-color:#000' disabled>".html_out($g_info['name'])."</option>";
     2458            $r = $db->query("SELECT `id`, `param`, `type` FROM `doc_base_params` WHERE `system`='0' AND `pgroup_id`='{$g_info['id']}' ORDER BY `param`");
     2459            while ($p = $r->fetch_row()) {
     2460                $dyn_foot .= "<option value='$p[0]'>".html_out($p[1])."</option>";
     2461            }
     2462        }
     2463        $dyn_foot .= "</select></td><td><input type='text' id='value_add'><img src='/img/i_add.png' alt='' onclick='return addLine()'></td></tr></td></tr>";
     2464       
     2465        // Служебные (системные) свойства
     2466        $translation = array('ZP'=>'Зарплата за сборку', 'pack_complexity_sk'=>'Коэффициент зарплаты кладовщика');
     2467        $srv_table = '';
     2468        $dpv_res = $db->query("SELECT `doc_base_params`.`id`, `doc_base_params`.`param`, `doc_base_values`.`value`
     2469            FROM `doc_base_params`
     2470            LEFT JOIN `doc_base_values` ON `doc_base_params`.`id`=`doc_base_values`.`param_id` AND `doc_base_values`.`id`='$pos_id'
     2471            WHERE `doc_base_params`.`system`!=0");
     2472        while ($nx = $dpv_res->fetch_row()) {
     2473            if(isset($translation[$nx[1]])) {
     2474                $nx[1] = $translation[$nx[1]];
     2475            }
     2476            $srv_table .= "<tr><td align='right'>".html_out($nx[1])."</td><td><input type='text' name='par[$nx[0]]' value='".html_out($nx[2])."'></td></tr>";
     2477        }
     2478       
     2479        $tmpl->addContent("
     2480        <script type=\"text/javascript\">
     2481        function rmLine(t) {
     2482            var line=t.parentNode.parentNode;
     2483            line.parentNode.removeChild(line);
     2484        }
     2485        function addLine() {
     2486            var fgtab=document.getElementById('fg_table').tBodies[0];
     2487            var sel=document.getElementById('fg_select');
     2488            var newrow=fgtab.insertRow(fgtab.rows.length);
     2489            var lineid=sel.value;
     2490            var ctext = sel.selectedIndex !== -1 ? sel.options[sel.selectedIndex].text : '';
     2491            var text=document.getElementById('value_add').value;
     2492            newrow.innerHTML=\"<td align='right'>\"+ctext+\"</td><td><input type='text' name='par[\"+lineid+\"]' value='\"+text+\"'></td>\";
     2493        }
     2494        </script>");
     2495       
     2496        $tmpl->addContent("
     2497        <form action='' method='post'>
     2498        <input type='hidden' name='mode' value='esave'>
     2499        <input type='hidden' name='l' value='sklad'>
     2500        <input type='hidden' name='pos' value='$pos_id'>
     2501        <input type='hidden' name='param' value='d'>
     2502        <table width='100%'>
     2503        <tr>
     2504        <td valign='top' width='33%'>
     2505        <table class='list' width='100%'>
     2506        <tr><td align='right'>Тип</td><td><select name='type' id='pos_type' >$type_opt</select></td></tr>
     2507        <tr><td align='right'>Внутренний размер (d)</td><td><input type='text' name='d_int' value='{$pos_info['d_int']}' id='pos_d_int'></td></tr>
     2508        <tr><td align='right'>Внешний размер (D)</td><td><input type='text' name='d_ext' value='{$pos_info['d_ext']}' id='pos_d_ext'></td></tr>
     2509        <tr><td align='right'>Высота (B)</td><td><input type='text' name='size' value='{$pos_info['size']}' id='pos_size'></td></tr>
     2510        <tr><td align='right'>Номер таможенной декларации</td><td><input type='text' name='ntd' value='{$pos_info['ntd']}'></td></tr>
     2511        </table>
     2512        </td>
     2513        <td valign='top' width='33%'><table class='list' width='100%' id='fg_table'><tbody><tfoot>$dyn_foot</tfoot>$dyn_table</tbody></table></td>
     2514        <td valign='top' width='33%'><table class='list' width='100%'>$srv_table</table></td>
     2515        </table>
     2516        <table width='100%'>
     2517        <tr><td align='center'><input type='submit' value='Сохранить'>
     2518        </table></form>");
     2519    }
    24382520}
    24392521
  • web/include/doc_scripts/zp_s_prodaj.php

    r97cf442 rc473971  
    2323
    2424        var $coeff = 0.05;
     25        var $l_coeff = 0.5;
    2526
    2627        function Run($mode) {
     
    2930                if (isset($CONFIG['doc_scripts']['zp_s_prodaj.coeff']))
    3031                        $this->coeff = $CONFIG['doc_scripts']['zp_s_prodaj.coeff'];
     32                if (isset($CONFIG['doc_scripts']['zp_s_prodaj.l_coeff'])) {
     33                        $this->l_coeff = $CONFIG['doc_scripts']['zp_s_prodaj.l_coeff'];
     34                }
    3135                $tmpl->hideBlock('left');
    3236                if ($mode == 'view') {
     
    5862                        </select><br>
    5963                       
    60                         Считать по:<br>
     64                        Начислять зарплату:<br>
    6165                        <select name='calc'>
    62                         <option value='z' selected>Заявкам</option>
    63                         <option value='r'>Реализациям</option>
     66                        <option value='z' selected>Автору заявки</option>
     67                        <option value='r'>Автору реализации</option>
     68                        <option value='s'>Ответственному агента</option>
    6469                        </select><br>
     70                        <label><input type='checkbox' name='use_likv' value='1'>Учитывать ликвидность товара</label><br>
    6571                       
    6672                        <script type=\"text/javascript\">
     
    107113                        $show = request('show');
    108114                        $calc = request('calc');
     115                        $use_likv = request('use_likv');
    109116
    110117                        $tmpl->addContent("<h1>" . $this->getname() . "</h1>");
     
    116123                        if (!$agent_id) $tmpl->msg("Пользователь не привязан к агенту. Вы не сможете начислить заработную плату!", 'err');
    117124
    118                         if($calc == 'z')
    119                                 $lock = "`zlist`.`user`=$user_id";
    120                         else    $lock = "`curlist`.`user`=$user_id";
     125                        switch($calc) {
     126                            case 's':
     127                                $lock = "`doc_agent`.`responsible`=$user_id";
     128                                break;
     129                            case 'r':
     130                                $lock = "`curlist`.`user`=$user_id";
     131                                break;
     132                            default:
     133                                $lock = "`zlist`.`user`=$user_id";
     134                        }
    121135                       
    122136                        $res = $db->query("SELECT `curlist`.`id`, `curlist`.`user`, `doc_agent`.`name` AS `agent_name`, `curlist`.`date`, `curlist`.`sum`,
     
    150164                        $ag_sum = 0;    // Сумма агентских вознаграждений
    151165                        $r_sum = 0;     // Сумма реализаций
     166                        $old_date = '';
     167                       
    152168                        while ($nxt = $res->fetch_assoc()) {
    153                                 $nxt['ag_sum'] = sprintf("%0.2f", $nxt['ag_sum']);
    154 
    155                                 // Расчёт входящей стоимости
    156                                 $res_tov = $db->query("SELECT `doc_list_pos`.`id`, `doc_list_pos`.`tovar`, `doc_list_pos`.`cost`, `doc_list_pos`.`cnt`
    157                                         FROM `doc_list_pos`
    158                                         WHERE `doc_list_pos`.`doc`='{$nxt['id']}'");
    159                                 $nach_sum = 0;
    160                                 while ($nxt_tov = $res_tov->fetch_assoc()) {
    161                                         $incost = getInCost($nxt_tov['tovar'], $nxt['date']);
    162                                         $nach_sum += ($nxt_tov['cost'] - $incost) * $this->coeff * $nxt_tov['cnt'];
    163                                 }
    164                                 $nach_sum -= $nxt['ag_sum'] * $this->coeff;
    165                                 $nach_sum = sprintf("%0.2f", $nach_sum);
    166                                 // Проверка факта оплаты
    167                                 $add = '';
    168                                 if ($nxt['p_doc'])
    169                                         $add = " OR `p_doc`='{$nxt['p_doc']}'";
    170                                 $rs = $db->query("SELECT SUM(`sum`) FROM `doc_list`
    171                                         WHERE (`p_doc`='{$nxt['id']}' $add) AND (`type`='4' OR `type`='6') AND `ok`>0");
    172                                
    173                                 $ok_pay = 0;
    174                                 if($rs->num_rows) {
    175                                         $pp = $rs->fetch_row();
    176                                         $prop = round($pp[0], 2);
    177                                         if ($prop >= $nxt['sum']) $ok_pay = 1;
    178                                        
    179                                 }
    180                                 if (agentCalcDebt($nxt['agent_id']) <= 0)  $ok_pay = 1;
    181 
    182                                 $date = date("Y-m-d H:i:s", $nxt['date']);
    183 
    184                                 $cl = $ok_pay?'f_green':'f_red';
    185 
    186                                 $out_line = "<tr class='$cl'>
    187                                         <td><a href='/doc.php?mode=body&doc={$nxt['id']}'>{$nxt['id']}</a></td>
    188                                         <td>".html_out($nxt['zuser_name'])."</td><td>".html_out($nxt['ruser_name'])."</td>
    189                                         <td>".html_out($nxt['agent_name'])."</td><td>$date</td><td>{$nxt['sum']} / $prop</td><td>{$nxt['ag_sum']}</td><td>";
    190                                
    191                                 if (!$nxt['zp_s_prodaj']) {
    192                                         if($ok_pay) {
    193                                                 $n_check = ' checked';
    194                                                 $kn_sum += $nach_sum;
    195                                         }
    196                                         else {
    197                                                 $n_check = '';
    198                                                 $no_sum += $nach_sum;
    199                                         }
    200                                         $out_line .= "<input type='text' name='sum_doc[{$nxt['id']}]' value='$nach_sum'></td>
    201                                                 <td><label><input type='checkbox' name='cb_doc[{$nxt['id']}]' value='1'$n_check>Ok</label></td></tr>";
    202                                        
    203                                 }
    204                                 else {
    205                                         $out_line .= "{$nxt['zp_s_prodaj']}</td><td></td></tr>";
    206                                         $nd_sum += $nxt['zp_s_prodaj'];
    207                                         $ns_sum += $nach_sum;
    208                                 }
    209                                
    210                                 $all_sum += $nach_sum;
    211                                 $ag_sum += $nxt['ag_sum'];
    212                                 $r_sum += $nxt['sum'];
    213                                
    214                                 if($show == 'nach' && $nxt['zp_s_prodaj'])              $tmpl->addContent($out_line);
    215                                 else if($show == 'nonach' && !$nxt['zp_s_prodaj'])      $tmpl->addContent($out_line);
    216                                 else if($show == 'all')                                 $tmpl->addContent($out_line);
    217                                
     169                            if($use_likv && date("Ymd", $nxt['date'])!=$old_date ) {
     170                                $a_likv = getLiquidityOnDate($nxt['date'] - 1);
     171                                $old_date = date("Ymd", $nxt['date']);
     172                            }
     173                           
     174                            $nxt['ag_sum'] = sprintf("%0.2f", $nxt['ag_sum']);
     175
     176                            // Расчёт входящей стоимости
     177                            $res_tov = $db->query("SELECT `doc_list_pos`.`id`, `doc_list_pos`.`tovar`, `doc_list_pos`.`cost`, `doc_list_pos`.`cnt`
     178                                    FROM `doc_list_pos`
     179                                    WHERE `doc_list_pos`.`doc`='{$nxt['id']}'");
     180                            $nach_sum = 0;
     181                            while ($nxt_tov = $res_tov->fetch_assoc()) {
     182                                $incost = getInCost($nxt_tov['tovar'], $nxt['date']);
     183                                if($use_likv && isset($a_likv[$nxt_tov['tovar']])) {
     184                                    $nach_sum += ($nxt_tov['cost'] - $incost) * $this->coeff * $nxt_tov['cnt'] * (1 - $a_likv[$nxt_tov['tovar']]*$this->coeff/100 );
     185                                } else {
     186                                    $nach_sum += ($nxt_tov['cost'] - $incost) * $this->coeff * $nxt_tov['cnt'];
     187                                }
     188                            }
     189                            $nach_sum -= $nxt['ag_sum'] * $this->coeff;
     190                            $nach_sum = sprintf("%0.2f", $nach_sum);
     191                            // Проверка факта оплаты
     192                            $add = '';
     193                            if ($nxt['p_doc'])
     194                                    $add = " OR `p_doc`='{$nxt['p_doc']}'";
     195                            $rs = $db->query("SELECT SUM(`sum`) FROM `doc_list`
     196                                    WHERE (`p_doc`='{$nxt['id']}' $add) AND (`type`='4' OR `type`='6') AND `ok`>0");
     197
     198                            $ok_pay = 0;
     199                            if($rs->num_rows) {
     200                                    $pp = $rs->fetch_row();
     201                                    $prop = round($pp[0], 2);
     202                                    if ($prop >= $nxt['sum']) $ok_pay = 1;
     203
     204                            }
     205                            if (agentCalcDebt($nxt['agent_id']) <= 0)  $ok_pay = 1;
     206
     207                            $date = date("Y-m-d H:i:s", $nxt['date']);
     208
     209                            $cl = $ok_pay?'f_green':'f_red';
     210
     211                            $out_line = "<tr class='$cl'>
     212                                    <td><a href='/doc.php?mode=body&doc={$nxt['id']}'>{$nxt['id']}</a></td>
     213                                    <td>".html_out($nxt['zuser_name'])."</td><td>".html_out($nxt['ruser_name'])."</td>
     214                                    <td>".html_out($nxt['agent_name'])."</td><td>$date</td><td>{$nxt['sum']} / $prop</td><td>{$nxt['ag_sum']}</td><td>";
     215
     216                            if (!$nxt['zp_s_prodaj']) {
     217                                    if($ok_pay) {
     218                                            $n_check = ' checked';
     219                                            $kn_sum += $nach_sum;
     220                                    }
     221                                    else {
     222                                            $n_check = '';
     223                                            $no_sum += $nach_sum;
     224                                    }
     225                                    $out_line .= "<input type='text' name='sum_doc[{$nxt['id']}]' value='$nach_sum'></td>
     226                                            <td><label><input type='checkbox' name='cb_doc[{$nxt['id']}]' value='1'$n_check>Ok</label></td></tr>";
     227
     228                            }
     229                            else {
     230                                    $out_line .= "{$nxt['zp_s_prodaj']}</td><td></td></tr>";
     231                                    $nd_sum += $nxt['zp_s_prodaj'];
     232                                    $ns_sum += $nach_sum;
     233                            }
     234
     235                            $all_sum += $nach_sum;
     236                            $ag_sum += $nxt['ag_sum'];
     237                            $r_sum += $nxt['sum'];
     238
     239                            if($show == 'nach' && $nxt['zp_s_prodaj'])          $tmpl->addContent($out_line);
     240                            else if($show == 'nonach' && !$nxt['zp_s_prodaj'])  $tmpl->addContent($out_line);
     241                            else if($show == 'all')                                     $tmpl->addContent($out_line);
    218242                        }
    219243                        $but_disabled = '';
  • web/include/reports/zayavki.php

    r97cf442 rc473971  
    106106               
    107107                $sql = "SELECT `doc_base`.`id`, `doc_base`.`vc`, CONCAT(`doc_group`.`printname`, ' ', `doc_base`.`name`) AS `name`,"
    108                     . "     SUM(`doc_list_pos`.`cnt`) AS `cnt`, `doc_dopdata`.`value` AS `status`"
     108                    . " `doc_list_pos`.`cnt`, `doc_dopdata`.`value` AS `status`"
    109109                    . " FROM `doc_list_pos`"
    110110                    . " INNER JOIN `doc_base` ON `doc_base`.`id`=`doc_list_pos`.`tovar`"
     
    112112                    . " INNER JOIN `doc_list` ON `doc_list`.`id`=`doc_list_pos`.`doc`"
    113113                    . " LEFT JOIN `doc_dopdata` ON `doc_list`.`id`=`doc_dopdata`.`doc` AND `doc_dopdata`.`param`='status'"
    114                     . " WHERE `doc_list`.`date`>=$dt_f AND `doc_list`.`date`<=$dt_t AND `doc_list`.`type`=3 $sql_add";
     114                    . " WHERE `doc_list`.`date`>=$dt_f AND `doc_list`.`date`<=$dt_t AND `doc_list`.`type`=3 AND `doc_list`.`ok`>0 $sql_add";
    115115                   
    116116               
    117117                if(!$ag) {
    118                     $sql .=  " GROUP BY `doc_base`.`id`";
    119118                    $res = $db->query($sql);
     119                    $l_cnt = array();
     120                    $info = array();
    120121                    while($line = $res->fetch_assoc()) {
    121122                        if($line['status']=='ok' || $line['status']=='err') {
    122123                            continue;
    123124                        }
    124                         $row = array($line['id'], $line['vc'], $line['name'], $line['cnt']);
     125                        $info[$line['id']] = $line;
     126                        if(!isset($l_cnt[$line['id']])) {
     127                            $l_cnt[$line['id']] = $line['cnt'];
     128                        } else {
     129                            $l_cnt[$line['id']] += $line['cnt'];
     130                        }
     131                    }
     132                    foreach($l_cnt AS $pos_id=>$cnt) {
     133                        $row = array($pos_id, $info[$pos_id]['vc'], $info[$pos_id]['name'], $cnt);
    125134                        $this->tableRow($row);
    126135                    }
     136                   
    127137                } else {
    128138                    $ares = $db->query("SELECT `id`, `name` FROM `doc_agent` ORDER BY `name`");
    129139                    while($agent_info = $ares->fetch_assoc()) {
    130                         $sql_this = $sql . " AND `doc_list`.`agent`={$agent_info['id']} GROUP BY `doc_base`.`id`";
     140                        $sql_this = $sql . " AND `doc_list`.`agent`={$agent_info['id']}";
    131141                        $res = $db->query($sql_this);
    132142                        if($res->num_rows) {
     
    134144                            $this->tableSpannedRow(array($col_cnt), array($agent_info['name']));
    135145                            $this->tableAltStyle(false);
     146                            $l_cnt = array();
     147                            $info = array();
    136148                            while($line = $res->fetch_assoc()) {
    137149                                if($line['status']=='ok' || $line['status']=='err') {
    138150                                    continue;
    139151                                }
    140                                 $row = array($line['id'], $line['vc'], $line['name'], $line['cnt']);
     152                                $info[$line['id']] = $line;
     153                                if(!isset($l_cnt[$line['id']])) {
     154                                    $l_cnt[$line['id']] = $line['cnt'];
     155                                } else {
     156                                    $l_cnt[$line['id']] += $line['cnt'];
     157                                }
     158                            }
     159                            foreach($l_cnt AS $pos_id=>$cnt) {
     160                                $row = array($pos_id, $info[$pos_id]['vc'], $info[$pos_id]['name'], $cnt);
    141161                                $this->tableRow($row);
    142162                            }
  • web/js/poseditor.js

    r97cf442 rc473971  
    367367                                case 'store_cnt':
    368368                                        fragment.appendChild(createConstCell( Math.round(data.sklad_cnt*100)/100));     
     369                                        break;
     370                                case 'reserve':
     371                                        fragment.appendChild(createConstCell( Math.round(data.reserve*100)/100));       
    369372                                        break;
    370373                                case 'place':
Note: See TracChangeset for help on using the changeset viewer.