Multimag  0.2.992
doc.sklad.kompl.php
См. документацию.
1 <?php
2 // MultiMag v0.2 - Complex sales system
3 //
4 // Copyright (C) 2005-2018, BlackLight, TND Team, http://tndproject.org
5 //
6 // This program is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU Affero General Public License as
8 // published by the Free Software Foundation, either version 3 of the
9 // License, or (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU Affero General Public License for more details.
15 //
16 // You should have received a copy of the GNU Affero General Public License
17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
18 //
19 
20 // Это временное решение для работы с комплектацией товаров
21 
22 include_once('include/doc.poseditor.php');
23 
25 class KomplPosList extends PosEditor {
26 
28  var $list_sum = 0; //< Сумма позиций из loadlist()
31  function __construct($pos_id) {
32  parent::__construct();
33  $this->linked_pos = intval($pos_id);
34  }
35 
38  public function setLinkedPos($pos_id) {
39  $this->linked_pos = intval($pos_id);
40  }
41 
43  protected function loadList() {
44  global $db;
45  if(is_array($this->list))
46  return;
47  $this->list = array();
48  $res = $db->query("SELECT `doc_base_kompl`.`id` AS `line_id`, `doc_base`.`id` AS `pos_id`, `doc_base`.`vc`, `doc_base`.`name`, `doc_base`.`cost`,
49  `doc_base`.`proizv` AS `vendor`, `doc_base_kompl`.`cnt`,
50  (SELECT SUM(`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` GROUP BY `doc_base_cnt`.`id`) AS `sklad_cnt`
51  FROM `doc_base_kompl`
52  LEFT JOIN `doc_base` ON `doc_base`.`id`=`doc_base_kompl`.`kompl_id`
53  WHERE `doc_base_kompl`.`pos_id`='{$this->linked_pos}'");
54  $this->list_sum = 0;
55  while ($nxt = $res->fetch_assoc()) {
56  $nxt['cost'] = getInCost($nxt['pos_id'], 0, 1);
57  $this->list_sum += $nxt['cost'] * $nxt['cnt'];
58  $this->list[$nxt['line_id']] = $nxt;
59  }
60  }
61 
63  protected function calcListSum() {
64  if(!is_array($this->list))
65  $this->loadList();
66  $this->list_sum = 0;
67  foreach ($this->list as $nxt) {
68  $this->list_sum += $nxt['cost'] * $nxt['cnt'];
69  }
70  return $this->list_sum;
71  }
72 
75  public function Show($param, $zp) {
76  $ret="
77  <script type='text/javascript' src='/css/jquery/jquery.autocomplete.js'></script>
78  <script type='text/javascript' src='/css/jquery/jquery.alerts.js'></script>
79  <script src='/js/poseditor.js' type='text/javascript'></script>
80  <link href='/css/poseditor.css' rel='stylesheet' type='text/css' media='screen'>
81  <link href='/css/jquery/jquery.alerts.css' rel='stylesheet' type='text/css' media='screen'>
82  <div id='poseditor_div'></div>
83  <form action='docs.php' method='post'>
84  <input type='hidden' name='mode' value='esave'>
85  <input type='hidden' name='l' value='sklad'>
86  <input type='hidden' name='pos' value='{$this->linked_pos}'>
87  <input type='hidden' name='param' value='k'>
88  Зарплата за сборку: <input type='text' name='zp' value='$zp'> руб. <button>Сохранить</button>
89  </form>
90  <div id='storeview_container'></div>";
91 
92  $p_setup = array(
93  'base_url' => '/docs.php?l=sklad&mode=srv&opt=ep&param=k&pos='.$this->linked_pos,
94  'editable' => $this->editable,
95  'container' => 'poseditor_div',
96  'store_container' => 'storeview_container',
97  'fastadd_line'=> 1, // Показывать строку быстрого подбора
98  );
99 
100  $cols = array();
101  $col_names = array();
102  if($this->show_vc) {
103  $cols[] = 'vc';
104  $col_names[] = 'Код';
105  }
106  $cols[] = 'name';
107  $col_names[] = 'Наименование';
108  $cols[] = 'price';
109  $col_names[] = 'Цена';
110  $cols[] = 'cnt';
111  $col_names[] = 'Кол-во';
112  $cols[] = 'sum';
113  $col_names[] = 'Стоимость';
114  $cols[] = 'store_cnt';
115  $col_names[] = 'Остаток';
116 
117  $p_setup['columns'] = $cols;
118  $p_setup['col_names'] = $col_names;
119 
120  if ($this->show_vc) {
121  $sc = array(
122  'vc', 'name', 'vendor', 'price', 'liquidity'
123  );
124  $sc_names = array ('Код', 'Название', 'Произв.', 'Цена', 'Ликвидность');
125  } else {
126  $sc = array(
127  'name', 'vendor', 'price', 'liquidity'
128  );
129  $sc_names = array ('Название', 'Произв.', 'Цена', 'Ликв.');
130  }
131  if($this->show_tdb) {
132  $sc[] = 'type';
133  $sc[] = 'd_int';
134  $sc[] = 'd_ext';
135  $sc[] = 'size';
136  $sc[] = 'mass';
137  $sc_names[] = 't';
138  $sc_names[] = 'd';
139  $sc_names[] = 'D';
140  $sc_names[] = 'l';
141  $sc_names[] = 'm';
142  }
143  if($this->show_rto) {
144  $sc[] = 'transit';
145  $sc[] = 'reserve';
146  $sc[] = 'offer';
147  $sc_names[] = 'Транзит';
148  $sc_names[] = 'Резерв';
149  $sc_names[] = 'П/зак.';
150  }
151  $sc[] = 'allcnt';
152  $sc_names[] = 'Всего';
153 
154  $p_setup['store_columns'] = $sc;
155  $p_setup['store_col_names'] = $sc_names;
156 
157  $ret.="<script type=\"text/javascript\">
158  var poslist = PosEditorInit(".json_encode($p_setup, JSON_UNESCAPED_UNICODE).");
159  </script>";
160 
161  return $ret;
162  }
163 
166  function GetAllContent() {
167  global $CONFIG;
168  $this->loadList();
169 
170  $pos_array = array();
171  foreach ($this->list as $nxt) {
172 
173  if(! @$CONFIG['doc']['no_print_vendor'])
174  $nxt['name'].=' - '.$nxt['vendor'];
175  $pos_array[] = $nxt;
176  }
177 
178  $ret_data = array (
179  'response' => 'loadlist',
180  'content' => $pos_array,
181  'sum' => $this->list_sum,
182  );
183  return json_encode($ret_data, JSON_UNESCAPED_UNICODE);
184  }
185 
187  function GetPosInfo($pos) {
188  global $db, $CONFIG;
189 
190  $res = $db->query("SELECT `doc_base_links`.`id` AS `line_id`, `doc_base`.`id` AS `pos_id`, `doc_base`.`vc`, `doc_base`.`name`,
191  `doc_base`.`proizv` AS `vendor`, `doc_base`.`cost`, `doc_base`.`bulkcnt`, `doc_base`.`group`, 1 AS `cnt`,
192  (SELECT SUM(`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` GROUP BY `doc_base_cnt`.`id`) AS `sklad_cnt`
193  FROM `doc_base`
194  LEFT JOIN `doc_base_links` ON `doc_base`.`id`=`doc_base_links`.`pos2_id`
195  WHERE `doc_base`.`id`='$pos'");
196 
197  $ret = '';
198  if ($res->num_rows) {
199  $nxt = $res->fetch_assoc();
200 
201  if(! @$CONFIG['doc']['no_print_vendor'])
202  $nxt['name'].=' - '.$nxt['vendor'];
203 
204  $ret = "{response: 3, data:".json_encode($nxt, JSON_UNESCAPED_UNICODE)."}";
205  }
206 
207  return $ret;
208  }
209 
211  function AddPos($pos) {
212  global $db;
213  settype($pos, 'int');
214  $cnt = rcvrounded('cnt', 5);
215  $ret_data = array();
216  $this->loadList();
217  if (!$pos) throw new Exception("ID позиции не задан!");
218  if($cnt<=0) throw new Exception("Количество должно быть положительным!");
219  if($pos==$this->linked_pos) {
220  $ret_data['response'] = 'err';
221  $ret_data['message'] = "Нельзя добавить себя!";
222  return json_encode($ret_data, JSON_UNESCAPED_UNICODE);
223  }
224 
225  $res = $db->query("SELECT `id`, `kompl_id`, `cnt` FROM `doc_base_kompl` WHERE `pos_id`='{$this->linked_pos}' AND `kompl_id`='$pos'");
226  if ($res->num_rows == 0) {
227  $line_id = $db->insertA('doc_base_kompl', array('pos_id'=>$this->linked_pos, 'kompl_id'=>$pos, 'cnt'=>$cnt) );
228  doc_log("UPDATE komplekt", "add kompl: pos_id:$pos, cnt:$cnt", 'pos', $this->linked_pos);
229 
230  $res = $db->query("SELECT `doc_base`.`id` AS `pos_id`, `doc_base`.`vc`, `doc_base`.`name`, `doc_base`.`proizv` AS `vendor`, $cnt AS `cnt`,
231  `doc_base`.`cost`,
232  (SELECT SUM(`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` GROUP BY `doc_base_cnt`.`id`) AS `sklad_cnt`
233  FROM `doc_base`
234  WHERE `doc_base`.`id`='$pos'");
235  $line = $res->fetch_assoc();
236  $line['cost'] = getInCost($line['pos_id'], 0, 1);;
237  $line['line_id'] = $line_id;
238  $ret_data['response'] = 'add';
239  $ret_data['line'] = $line;
240  $ret_data['sum'] = $this->list_sum + $cnt * $line['cost'];
241  }
242  else {
243  $ret_data['response'] = 'err';
244  $ret_data['message'] = "Уже есть в списке!";
245  }
246 
247  return json_encode($ret_data, JSON_UNESCAPED_UNICODE);
248  }
249 
254  function UpdateLine($line_id, $type, $value) {
255  global $db;
256  $this->loadList();
257  // Тут надо removeline!
258  if(!isset($this->list[$line_id]))
259  throw new Exception("Строка не найдена. Вероятно, она была удалена другим пользователем или Вами в другом окне.");
260 
261  $ret_data = array (
262  'response' => 'update'
263  );
264 
265  if($type == 'cnt' && $value != $this->list[$line_id]['cnt']) {
266  if($value <= 0) $value = 1;
267  $value = round($value, 4);
268 
269  $old_cnt = $this->list[$line_id]['cnt'];
270  $db->update('doc_base_kompl', $line_id, 'cnt', $value);
271  $this->list[$line_id]['cnt'] = $value;
272 
273  doc_log("UPDATE","change kompl cnt: pos:{$this->list[$line_id]['pos_id']}, line_id:$line_id, cnt:$old_cnt => $value",'pos',$this->linked_pos);
274  }
275  else if($type=='sum' && $value!=($this->list[$line_id]['cost']*$this->list[$line_id]['cnt'])) {
276  if($value <= 0) $value = 1;
277  $value = round($value/$this->list[$line_id]['cost'], 5);
278  $db->update('doc_base_kompl', $line_id, 'cnt', $value);
279  $old_cnt = $this->list[$line_id]['cnt'];
280  $this->list[$line_id]['cnt'] = $value;
281  doc_log("UPDATE","change kompl cnt: pos:{$this->list[$line_id]['pos_id']}, line_id:$line_id, cnt:$old_cnt => $value",'pos',$this->linked_pos);
282  }
283  $ret_data['sum'] = $this->calcListSum();
284  $ret_data['update_line'] = $this->list[$line_id];
285  return json_encode($ret_data, JSON_UNESCAPED_UNICODE);
286  }
287 
289  function RemoveLine($line_id) {
290  global $db;
291  $this->loadList();
292  if(array_key_exists($line_id, $this->list)) {
293  $db->delete('doc_base_kompl', $line_id);
294  doc_log("UPDATE","del komplekt: pos: {$this->list[$line_id]['pos_id']}, line_id:$line_id, name:{$this->list[$line_id]['name']}", 'pos', $this->linked_pos);
295  unset($this->list[$line_id]);
296  }
297 
298  $ret_data = array (
299  'response' => '5',
300  'remove' => array('line_id'=>$line_id),
301  'sum' => $this->calcListSum()
302  );
303  return json_encode($ret_data, JSON_UNESCAPED_UNICODE);
304  }
305 
307  function GetSkladList($group) {
308  global $db;
309  settype($group, 'int');
310  $sql = "SELECT `doc_base`.`id`,`doc_base`.`vc`,`doc_base`.`group`,`doc_base`.`name`,`doc_base`.`proizv`, `doc_base`.`likvid`,
311  `doc_base`.`cost` AS `base_price`, `doc_base`.`bulkcnt`,
312  `doc_base`.`cost_date`, `doc_base_dop`.`koncost`, `doc_base_dop`.`analog`, `doc_base_dop`.`type`, `doc_base_dop`.`d_int`,
313  `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`,
314  (SELECT SUM(`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` GROUP BY `doc_base_cnt`.`id`) AS `allcnt`
315  FROM `doc_base`
316  LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
317  WHERE `doc_base`.`group`='$group'
318  ORDER BY `doc_base`.`name`";
319  $res = $db->query($sql);
320  return $this->FormatResult($res);
321  }
322 
324  function SearchSkladList($s) {
325  global $db;
326  $ret = '';
327  $sql = "SELECT `doc_base`.`id`,`doc_base`.`vc`,`doc_base`.`group`,`doc_base`.`name`,`doc_base`.`proizv`, `doc_base`.`likvid`,
328  `doc_base`.`cost` AS `base_price`, `doc_base`.`bulkcnt`,
329  `doc_base`.`cost_date`, `doc_base_dop`.`koncost`, `doc_base_dop`.`analog`, `doc_base_dop`.`type`, `doc_base_dop`.`d_int`,
330  `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`, `doc_base_cnt`.`mesto`, `doc_base_cnt`.`cnt`,
331  (SELECT SUM(`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` GROUP BY `doc_base_cnt`.`id`) AS `allcnt`";
332  $s_sql = $db->real_escape_string($s);
333  $sqla = $sql . "FROM `doc_base`
334  LEFT JOIN `doc_base_cnt` ON `doc_base_cnt`.`id`=`doc_base`.`id` AND `doc_base_cnt`.`sklad`='{$this->sklad_id}'
335  LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
336  WHERE `doc_base`.`name` LIKE '$s%' OR `doc_base`.`vc` LIKE '$s_sql%' ORDER BY `doc_base`.`name` LIMIT 200";
337  $res = $db->query($sqla);
338  if ($res->num_rows) {
339  if ($ret != '')
340  $ret.=', ';
341  $ret.="{id: 'header', name: 'Поиск по названию, начинающемуся на $s - {$res->num_rows} наименований найдено'}";
342  $ret = $this->FormatResult($res, $ret);
343  }
344  $sqla = $sql . "FROM `doc_base`
345  LEFT JOIN `doc_base_cnt` ON `doc_base_cnt`.`id`=`doc_base`.`id` AND `doc_base_cnt`.`sklad`='{$this->sklad_id}'
346  LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
347  WHERE (`doc_base`.`name` LIKE '%$s_sql%' OR `doc_base`.`vc` LIKE '%$s_sql%') AND `doc_base`.`name` NOT LIKE '$s_sql%'
348  AND `doc_base`.`vc` NOT LIKE '$s_sql%' ORDER BY `doc_base`.`name` LIMIT 100";
349  $res = $db->query($sqla);
350  if ($res->num_rows) {
351  if ($ret != '')
352  $ret.=', ';
353  $ret.="{id: 'header', name: 'Поиск по названию, содержащему $s - {$res->num_rows} наименований найдено'}";
354  $ret = $this->FormatResult($res, $ret);
355  }
356  $sqla = $sql . "FROM `doc_base`
357  LEFT JOIN `doc_base_cnt` ON `doc_base_cnt`.`id`=`doc_base`.`id` AND `doc_base_cnt`.`sklad`='{$this->sklad_id}'
358  LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
359  WHERE `doc_base_dop`.`analog` LIKE '%$s_sql%' AND `doc_base`.`name` NOT LIKE '%$s_sql%' AND `doc_base`.`vc` NOT LIKE '%$s%'
360  ORDER BY `doc_base`.`name` LIMIT 100";
361  $res = $db->query($sqla);
362  if ($res->num_rows) {
363  if ($ret != '')
364  $ret.=', ';
365  $ret.="{id: 'header', name: 'Поиск по аналогу($s) - {$res->num_rows} наименований найдено'}";
366  $ret = $this->FormatResult($res, $ret);
367  }
368  return $ret;
369  }
370 
371 
372  protected function FormatResult($res, $ret = '') {
373  if ($res->num_rows) {
375  while ($nxt = $res->fetch_assoc()) {
376  $nxt['price'] = $pc->getPosDefaultPriceValue($nxt['id']);
377 
378  if ($ret != '')
379  $ret.=', ';
380 
381  $ret .= json_encode($nxt, JSON_UNESCAPED_UNICODE);
382  }
383  }
384  return $ret;
385  }
386 };
387 
388 ?>
__construct($pos_id)
$res
Definition: fixer.php:178
UpdateLine($line_id, $type, $value)
static getInstance()
Definition: pricecalc.php:99
AddPos($pos)
Добавляет указанную складскую позицию в список
$linked_pos
ID наименования, для которого формируется список связей
getInCost($pos_id, $limit_date=0, $serv_mode=0)
Definition: doc.core.php:470
FormatResult($res, $ret= '')
SearchSkladList($s)
Получить список номенклатуры, содержащей в названии заданную строку
calcListSum()
Получить сумму товаров в списке
GetSkladList($group)
Получить список номенклатуры заданной группы
$line
Definition: priceload.php:39
Show($param, $zp)
$s
Definition: price_an.php:409
loadList()
Загрузить список товаров. Повторно не загружает.
Работа со связанными товарами.
GetPosInfo($pos)
Получить информацию о наименовании
$db
Редактор списка наименований
RemoveLine($line_id)
Удалить из списка строку с указанным ID.
$pc
Definition: get_yml.php:32
rcvrounded($varname, $round=3, $def=0)
Безопасное получение числа заданной точности
Definition: core.php:215
setLinkedPos($pos_id)
doc_log($motion, $desc, $object='', $object_id=0)
Definition: doc.core.php:278
$CONFIG['site']['admin_name']