Changeset c473971
- Timestamp:
- Feb 10, 2015, 11:11:36 PM (8 years ago)
- Branches:
- master
- Children:
- 63901be
- Parents:
- 97cf442
- Files:
-
- 2 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
common/async/dbcheck.php
r97cf442 rc473971 66 66 $db->query("INSERT INTO `doc_base_cnt` (`id`, `sklad`, `cnt`) VALUES ('$pline[0]', '$sline[0]', '0')"); 67 67 } 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; 68 80 } 69 81 … … 106 118 107 119 // ============== Расчет ликвидности =================================================== 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 137 135 // ================ Проверка, что у всех перемещений установлен не нулевой склад назначения =================== 138 136 $res = $db->query("SELECT `doc_list`.`id`, `doc_dopdata`.`value` … … 141 139 WHERE `doc_list`.`type`='8'"); 142 140 while ($nxt = $res->fetch_row()) { 143 144 145 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 } 148 146 } 149 147 -
common/core.common.php
r97cf442 rc473971 18 18 // 19 19 20 define("MULTIMAG_REV", "7 44");20 define("MULTIMAG_REV", "750"); 21 21 define("MULTIMAG_VERSION", "0.2.".MULTIMAG_REV); 22 22 … … 115 115 } 116 116 117 /// Расчёт ликвидности на заданную дату 118 /// @param $time дата в unixtime 119 /// @return array(pos_id => likv_value, ... ) 120 function 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 117 165 /// @brief Класс расширяет функциональность mysqli 118 166 /// Т.к. используется почти везде, нет смысла выносить в отдельный файл … … 121 169 /// Начать транзакцию 122 170 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 // } 125 179 126 180 /// Получить все значения строки из таблицы по ключу в виде массива 127 /// @param table Имя таблицы128 /// @param key_value Значение ключа, по которому производится выборка. Будет приведено к целому типу.181 /// @param $table Имя таблицы 182 /// @param $key_value Значение ключа, по которому производится выборка. Будет приведено к целому типу. 129 183 /// @return В случае успеха возвращает ассоциативный массив с данными. В случае sql ошибки вернёт false. В случае, если искомой строки нет в таблице, вернет 0 130 184 function selectRow($table, $key_value) { -
config_all.sample.php
r97cf442 rc473971 66 66 $CONFIG['pricecalc']['notify'] = true; // Напоминать о периодических накопительных скидках незадолго до окончания периода фиксированной длительности 67 67 68 ?> 68 $CONFIG['site']['liquidity_interval'] = 180; // Периодически расчитывать ликвидность за X дней 69 $CONFIG['site']['liquidity_per_group'] = false;// Считать ликвидность по группам -
config_cli.sample.php
r97cf442 rc473971 66 66 $CONFIG['auto']['move_ntp_to_end'] = false;// Периодически перемещать непроведенные перемещения товаров на последний день 67 67 $CONFIG['auto']['doc_del_days'] = 2; // Периодически стирать отмеченные на удаление документы через X дней 68 $CONFIG['auto']['liquidity_interval'] = 180; // Периодически расчитывать ликвидность за X дней69 68 $CONFIG['auto']['resp_debt_notify'] = false;// Периодически информировать ответственных сотрудников о долгах их агентов 70 69 $CONFIG['auto']['update_currency'] = true; // Периодически обновлять информацию о курсах валют -
config_site.sample.php
r97cf442 rc473971 50 50 $CONFIG['poseditor']['sn_enable'] = false;// Включить поддержку работы с серийными номерами 51 51 $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;// Показывать резервы в таблице документа 55 56 $CONFIG['poseditor']['true_gtd'] = false;// Cхема учёта ГТД. false - ГТД берётся из доп. свойств наименования 56 57 // 'easy' - ГТД берутся из поступлений. … … 129 130 $CONFIG['1csync']['pass'] = ''; 130 131 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 132 134 $CONFIG['doc_scripts']['zp_s_prodaj_conn.new_coeff']=0.02; 133 135 $CONFIG['doc_scripts']['zp_s_prodaj_conn.new_days']=90; -
web/css/core.js
r97cf442 rc473971 123 123 function ShowPosContextMenu(event, pos_id, addition) 124 124 { 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&w_docs=1&sel_type=pos&opt=pdf&dt_t="+nowdate+"&pos_id="+pos_id+"')\">Отчёт по движению</div>"+ 130 "<div onclick=\"window.open('/docs.php?mode=srv&opt=ep&pos="+pos_id+"')\">Редактирование товара</div>"+ 131 "<div onclick=\"ShowPopupWin('/docs.php?l=pran&mode=srv&opt=ceni&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&w_docs=1&sel_type=pos&opt=pdf&dt_t=" + nowdate + "&pos_id=" + pos_id + "')\">Отчёт по движению</div>" + 130 "<div onclick=\"window.open('/docs.php?mode=srv&opt=ep&pos=" + pos_id + "')\">Редактирование товара</div>" + 131 "<div onclick=\"ShowPopupWin('/docs.php?l=pran&mode=srv&opt=ceni&pos=" + pos_id + "'); return false;\" >Где и по чём</div>" + 132 "<div onclick=\"window.open('/docs.php?mode=srv&opt=ep&param=n&pos=" + pos_id + "')\">Аналоги</div>" + 133 addition; 134 return menu; 133 135 } 134 136 -
web/include/doc.core.php
r97cf442 rc473971 589 589 /// @sa DocPodZakaz DocVPuti 590 590 /// TODO: реализовать кеширование 591 function DocRezerv($pos_id, $doc_id=0)591 function DocRezerv($pos_id, $doc_id=0) 592 592 { 593 593 global $db; -
web/include/doc.poseditor.php
r97cf442 rc473971 26 26 var $show_tdb; ///< Показывать тип/размеры/массу 27 27 var $show_rto; ///< Показывать резерв/в пути/предложения 28 var $list; // Список наименований 28 var $show_reserve; ///< Отображать колонку резервов в основной таблице 29 var $list; //< Список наименований 29 30 30 31 /// Конструктор 31 32 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 } 38 40 39 41 /// Разрешить или запретить изменение данных в списке наименований 40 /// @param editable 0: запретить, 1: разрешить42 /// @param $editable 0: запретить, 1: разрешить 41 43 function SetEditable($editable) 42 44 { … … 119 121 } 120 122 121 /// Редактор списка наименований документа.123 /// @brief Редактор списка наименований документа. 122 124 /// При создании экземпляра класса нужно указать ID существующеего документа 123 125 class 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 редактироуемого документа 130 134 public function __construct($doc) { 131 135 global $CONFIG; … … 138 142 if( @$CONFIG['poseditor']['sn_enable'] && ($doc_data['type']==1 || $doc_data['type']==2)) $this->show_sn=1; 139 143 if( @$CONFIG['poseditor']['true_gtd'] && $doc_data['type']==1) $this->show_gtd=1; 144 $this->npv = @$CONFIG['doc']['no_print_vendor']; 140 145 $pc = PriceCalc::getInstance(); 141 146 $pc->setAgentId($doc_data['agent']); … … 146 151 protected function loadList() { 147 152 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(); 151 157 $res = $db->query("SELECT `doc_list_pos`.`id` AS `line_id`, `doc_base`.`id` AS `pos_id`, `doc_base`.`vc`, `doc_base`.`name`, 152 158 `doc_base`.`proizv` AS `vendor`, `doc_base`.`cost` AS `base_price`, `doc_list_pos`.`cnt`, `doc_list_pos`.`cost`, … … 158 164 WHERE `doc_list_pos`.`doc`='{$this->doc}' AND `doc_list_pos`.`page`='0' 159 165 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 } 163 170 164 171 /// Перезагрузить список товаров … … 245 252 $cols[] = 'store_cnt'; 246 253 $col_names[] = 'Остаток'; 254 if($this->show_reserve) { 255 $cols[] = 'reserve'; 256 $col_names[] = 'Резерв'; 257 } 247 258 $cols[] = 'place'; 248 259 $col_names[] = 'Место'; … … 323 334 $pos_array = array(); 324 335 foreach ($this->list as $nxt) { 336 if($this->show_reserve) { 337 $nxt['reserve'] = DocRezerv($nxt['pos_id'], 0); 338 } 325 339 if ($this->cost_id) 326 340 $nxt['scost'] = $pc->getPosSelectedPriceValue($nxt['pos_id'], $this->cost_id, $nxt); … … 405 419 if(! @$CONFIG['doc']['no_print_vendor']) 406 420 $nxt['name'].=' - '.$nxt['vendor']; 407 421 if($this->show_reserve) { 422 $nxt['reserve'] = DocRezerv($nxt['pos_id'], 0); 423 } 408 424 $ret = "{response: 3, data:".json_encode($nxt, JSON_UNESCAPED_UNICODE)."}"; 409 425 } … … 542 558 $line['pos_id'] = $line['id']; 543 559 $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) { 548 565 $retail_price_id = $pc->getRetailPriceId(); 549 566 $auto_price_id = $pc->getPosAutoPriceID($line['pos_id'], $cnt); … … 566 583 } 567 584 } 585 586 if($this->show_reserve) { 587 $line['reserve'] = DocRezerv($line['pos_id'], 0); 588 } 568 589 569 590 $ret_data['response'] = 'add'; … … 930 951 931 952 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;960 953 } 961 954 -
web/include/doc.s.inform.php
r97cf442 rc473971 95 95 } 96 96 } 97 } ;97 } 98 98 99 ?> -
web/include/doc.s.sklad.php
r97cf442 rc473971 413 413 // Дополнительные свойства 414 414 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); 509 416 } 510 417 // Складские свойства … … 909 816 // Аналоги 910 817 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&opt=ep&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.'&pos='.$line['id']; 847 $rto = ''; 848 if (@$CONFIG['poseditor']['rto']) { 849 $clink = $link.'&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}&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}&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}&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&opt=ost'); return false;\" title='Отобразить все остатки'>{$line['cnt']}</a>"; 871 } else { 872 $line['cnt'] = ''; 873 } 874 $tmpl->addContent("<tr> 875 <td><a href='{$link}&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>"); 934 882 } 935 883 // История изменений … … 1156 1104 else { 1157 1105 $url = request('url'); 1106 $keywords = null; // Чтобы подсветка не ругалась 1158 1107 preg_match("/[?]*modelid=([\d]{1,9})[?]*+/", $url, $keywords); 1159 1108 $ym_id = $keywords[1]; … … 1399 1348 1400 1349 $db->query("REPLACE `doc_base_dop` (`id`, `analog`, `type`, `d_int`, `d_ext`, `size`, `ntd`) 1401 1350 VALUES ('$pos', '$analog_sql', $type, '$d_int_sql', '$d_ext_sql', '$size_sql', '$ntd_sql')"); 1402 1351 1403 1352 $res = $db->query("SELECT `param_id`, `value` FROM `doc_base_values` WHERE `id`='$pos'"); … … 1407 1356 $par = request('par'); 1408 1357 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 } 1419 1371 } 1420 1372 … … 1422 1374 $value_add = request('value_add'); 1423 1375 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 } 1432 1386 $tmpl->msg("Данные сохранены!"); 1387 1388 $this->dopDataEditForm($pos); 1433 1389 } 1434 1390 else if ($param == 's') { … … 2299 2255 $pc = PriceCalc::getInstance(); 2300 2256 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 2307 2308 2309 2310 2311 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 } 2313 2269 if ($nxt['allcnt'] != 0) $nxt['allcnt'] = "<a onclick=\"ShowPopupWin('/docs.php?mode=srv&opt=ost&pos={$nxt['id']}'); return false;\" title='Отобразить все остатки'>{$nxt['allcnt']}</a>"; 2314 2270 else $nxt['allcnt'] = ''; … … 2361 2317 else 2362 2318 $tdb_add = ''; 2363 if (@$CONFIG['poseditor']['rto']) 2319 if (@$CONFIG['poseditor']['rto']) { 2364 2320 $rto_add = "<td>$rezerv</td><td>$pod_zakaz</td><td>$v_puti</td>"; 2321 } 2365 2322 else $rto_add = ''; 2366 2323 … … 2435 2392 </ul>"); 2436 2393 } 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 } 2438 2520 } 2439 2521 -
web/include/doc_scripts/zp_s_prodaj.php
r97cf442 rc473971 23 23 24 24 var $coeff = 0.05; 25 var $l_coeff = 0.5; 25 26 26 27 function Run($mode) { … … 29 30 if (isset($CONFIG['doc_scripts']['zp_s_prodaj.coeff'])) 30 31 $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 } 31 35 $tmpl->hideBlock('left'); 32 36 if ($mode == 'view') { … … 58 62 </select><br> 59 63 60 Считать по:<br>64 Начислять зарплату:<br> 61 65 <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> 64 69 </select><br> 70 <label><input type='checkbox' name='use_likv' value='1'>Учитывать ликвидность товара</label><br> 65 71 66 72 <script type=\"text/javascript\"> … … 107 113 $show = request('show'); 108 114 $calc = request('calc'); 115 $use_likv = request('use_likv'); 109 116 110 117 $tmpl->addContent("<h1>" . $this->getname() . "</h1>"); … … 116 123 if (!$agent_id) $tmpl->msg("Пользователь не привязан к агенту. Вы не сможете начислить заработную плату!", 'err'); 117 124 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 } 121 135 122 136 $res = $db->query("SELECT `curlist`.`id`, `curlist`.`user`, `doc_agent`.`name` AS `agent_name`, `curlist`.`date`, `curlist`.`sum`, … … 150 164 $ag_sum = 0; // Сумма агентских вознаграждений 151 165 $r_sum = 0; // Сумма реализаций 166 $old_date = ''; 167 152 168 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); 218 242 } 219 243 $but_disabled = ''; -
web/include/reports/zayavki.php
r97cf442 rc473971 106 106 107 107 $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`" 109 109 . " FROM `doc_list_pos`" 110 110 . " INNER JOIN `doc_base` ON `doc_base`.`id`=`doc_list_pos`.`tovar`" … … 112 112 . " INNER JOIN `doc_list` ON `doc_list`.`id`=`doc_list_pos`.`doc`" 113 113 . " 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"; 115 115 116 116 117 117 if(!$ag) { 118 $sql .= " GROUP BY `doc_base`.`id`";119 118 $res = $db->query($sql); 119 $l_cnt = array(); 120 $info = array(); 120 121 while($line = $res->fetch_assoc()) { 121 122 if($line['status']=='ok' || $line['status']=='err') { 122 123 continue; 123 124 } 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); 125 134 $this->tableRow($row); 126 135 } 136 127 137 } else { 128 138 $ares = $db->query("SELECT `id`, `name` FROM `doc_agent` ORDER BY `name`"); 129 139 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']}"; 131 141 $res = $db->query($sql_this); 132 142 if($res->num_rows) { … … 134 144 $this->tableSpannedRow(array($col_cnt), array($agent_info['name'])); 135 145 $this->tableAltStyle(false); 146 $l_cnt = array(); 147 $info = array(); 136 148 while($line = $res->fetch_assoc()) { 137 149 if($line['status']=='ok' || $line['status']=='err') { 138 150 continue; 139 151 } 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); 141 161 $this->tableRow($row); 142 162 } -
web/js/poseditor.js
r97cf442 rc473971 367 367 case 'store_cnt': 368 368 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)); 369 372 break; 370 373 case 'place':
Note: See TracChangeset
for help on using the changeset viewer.