1
doc.core.php in web/include – MultiMag

source: web/include/doc.core.php @ c97268b

Last change on this file since c97268b was c97268b, checked in by Blacklight <blacklight@…>, 10 years ago
  • Добавлена экспериментальная версия приёма платежей по платёжным картам через Газпромбанк
  • Добавлена настройка доступных видов оплаты
  • Исправлено несколько ошибок
  • Property mode set to 100644
File size: 28.7 KB
Line 
1<?php
2//      MultiMag v0.1 - Complex sales system
3//
4//      Copyright (C) 2005-2010, 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
20include_once($CONFIG['site']['location']."/include/doc.nulltype.php");
21
22function __autoload($class_name)
23{
24        global $CONFIG;
25
26        $class_name= strtolower($class_name);
27        $nm2=split('_',$class_name,2);
28        if(is_array($nm2))
29        {
30                list($class_type, $class_name)=$nm2;
31                if($class_type=='doc')          include_once $CONFIG['site']['location']."/include/doc.".$class_name.'.php';
32                else if($class_type=='report')  include_once $CONFIG['site']['location']."/include/reports/".$class_name.'.php';
33        }
34        @include_once $CONFIG['site']['location']."/gate/include/doc.s.".$class_name.'.php';
35        @include_once $CONFIG['site']['location']."/include/".$class_name.'.php';
36
37}
38
39function num2str_semantic($i,&$words,&$fem,$f)
40{
41        $_1_2[1]="одна ";
42        $_1_2[2]="две ";
43
44        $_1_19[1]="один ";
45        $_1_19[2]="два ";
46        $_1_19[3]="три ";
47        $_1_19[4]="четыре ";
48        $_1_19[5]="пять ";
49        $_1_19[6]="шесть ";
50        $_1_19[7]="семь ";
51        $_1_19[8]="восемь ";
52        $_1_19[9]="девять ";
53        $_1_19[10]="десять ";
54
55        $_1_19[11]="одиннацать ";
56        $_1_19[12]="двенадцать ";
57        $_1_19[13]="тринадцать ";
58        $_1_19[14]="четырнадцать ";
59        $_1_19[15]="пятнадцать ";
60        $_1_19[16]="шестнадцать ";
61        $_1_19[17]="семнадцать ";
62        $_1_19[18]="восемнадцать ";
63        $_1_19[19]="девятнадцать ";
64
65        $des[2]="двадцать ";
66        $des[3]="тридцать ";
67        $des[4]="сорок ";
68        $des[5]="пятьдесят ";
69        $des[6]="шестьдесят ";
70        $des[7]="семьдесят ";
71        $des[8]="восемдесят ";
72        $des[9]="девяносто ";
73
74        $hang[1]="сто ";
75        $hang[2]="двести ";
76        $hang[3]="триста ";
77        $hang[4]="четыреста ";
78        $hang[5]="пятьсот ";
79        $hang[6]="шестьсот ";
80        $hang[7]="семьсот ";
81        $hang[8]="восемьсот ";
82        $hang[9]="девятьсот ";
83
84        $words="";
85        $fl=0;
86        if($i >= 100)
87        {
88                $jkl = intval($i / 100);
89                $words.=$hang[$jkl];
90                $i%=100;
91        }
92        if($i >= 20)
93        {
94                $jkl = intval($i / 10);
95                $words.=$des[$jkl];
96                $i%=10;
97                $fl=1;
98        }
99        switch($i)
100        {
101                case 1: $fem=1; break;
102                case 2:
103                case 3:
104                case 4: $fem=2; break;
105                default: $fem=3; break;
106        }
107        if($i)
108        {
109                if($i<3 && $f>0)
110                {
111                        if($f>=2)
112                        {
113                                $words.=$_1_19[$i];
114                        }
115                        else
116                        {
117                                $words.=$_1_2[$i];
118                        }
119                }
120                else
121                {
122                        $words.=$_1_19[$i];
123                }
124        }
125}
126
127// Число прописью
128function num2str($L, $ed='rub', $sot=2)
129{
130        $ff=1;
131        if($ed=='kg')
132        {
133                $namerub[1]="килограмм ";
134                $namerub[2]="килограмма ";
135                $namerub[3]="килограммов ";
136
137                $kopeek[1]="грамм ";
138                $kopeek[2]="грамма ";
139                $kopeek[3]="граммов ";
140                $ff=0;
141        }
142        else if($ed=='sht')
143        {
144                $namerub[1]="штука ";
145                $namerub[2]="штуки ";
146                $namerub[3]="штук ";
147
148                $kopeek[1]="сотая ";
149                $kopeek[2]="сотые ";
150                $kopeek[3]="сотых ";
151        }
152        else if($ed=='nul')
153        {
154                $namerub[1]=", ";
155                $namerub[2]=", ";
156                $namerub[3]=", ";
157                if($sot==1)
158                {
159                        $kopeek[1]=" десятых";
160                        $kopeek[2]=" десятых";
161                        $kopeek[3]=" десятых";
162                }
163                else if($ost==3)
164                {
165                        $kopeek[1]=" тысячных";
166                        $kopeek[2]=" тысячных";
167                        $kopeek[3]=" тысячных";
168                }
169                else
170                {
171                        $kopeek[1]=" сотых";
172                        $kopeek[2]=" сотых";
173                        $kopeek[3]=" сотых";
174                }
175
176        }
177        else
178        {
179                $namerub[1]="рубль ";
180                $namerub[2]="рубля ";
181                $namerub[3]="рублей ";
182
183                $kopeek[1]="копейка ";
184                $kopeek[2]="копейки ";
185                $kopeek[3]="копеек ";
186        }
187
188
189        $nametho[1]="тысяча ";
190        $nametho[2]="тысячи ";
191        $nametho[3]="тысяч ";
192
193        $namemil[1]="миллион ";
194        $namemil[2]="миллиона ";
195        $namemil[3]="миллионов ";
196
197        $namemrd[1]="миллиард ";
198        $namemrd[2]="миллиарда ";
199        $namemrd[3]="миллиардов ";
200
201        $s=" ";
202        $s1=" ";
203        $s2=" ";
204        $krat=1;
205        for($i=0;$i<$sot;$i++,$krat*=10);
206
207        $kop=intval( ( $L*$krat - intval( $L )*$krat ));
208        $L=intval($L);
209        if($L>=1000000000)
210        {
211                $many=0;
212                num2str_semantic(intval($L / 1000000000),$s1,$many,3);
213                $s.=$s1.$namemrd[$many];
214                $L%=1000000000;
215        }
216
217        if($L >= 1000000)
218        {
219                $many=0;
220                num2str_semantic(intval($L / 1000000),$s1,$many,2);
221                $s.=$s1.$namemil[$many];
222                $L%=1000000;
223                if($L==0)
224                {
225                        $s.=$namerub[3];
226                }
227        }
228
229        if($L >= 1000)
230        {
231                $many=0;
232                num2str_semantic(intval($L / 1000),$s1,$many,1);
233                $s.=$s1.$nametho[$many];
234                $L%=1000;
235                if($L==0)
236                {
237                        $s.=$namerub[3];
238                }
239        }
240
241        if($L != 0)
242        {
243                $many=0;
244                num2str_semantic($L,$s1,$many,0);
245                $s.=$s1.$namerub[$many];
246        }
247
248        if($sot)
249        {
250                if($kop > 0)
251                {
252                        $many=0;
253                        num2str_semantic($kop,$s1,$many,$ff);
254                        $s.=$s1.$kopeek[$many];
255                }
256                else
257                {
258                        $s.=" 00 $kopeek[3]";
259                }
260        }
261        return $s;
262}
263
264$firm_id=@$_SESSION['firm'];
265//if(!$firm_id) $firm_id=$_SESSION['firm']=1;
266//if($firm_id>1) $tmpl->LoadTemplate('default2');
267
268// =========== Установки документов - УСТАРЕЛО - УБРАТЬ ПОСЛЕ ТОГО, КАК НЕ БУДЕТ НИГДЕ ИСПОЛЬЗОВАТЬСЯ ================================
269global $dv;
270
271$res=mysql_query("SELECT * FROM `doc_vars` WHERE `id`='$firm_id'");
272$dv=mysql_fetch_assoc($res);
273
274function roundDirect($number, $precision = 0, $direction = 0)
275{
276        if ($direction==0 )     return round($number, $precision);
277        else
278        {
279                $factor = pow(10, -1 * $precision);
280                return ($direction<0)
281                        ? floor($number / $factor) * $factor
282                        : ceil($number / $factor) * $factor;
283        }
284}
285
286function GetCostPos($pos_id, $cost_id)
287{
288        $res=mysql_query("SELECT `doc_base`.`cost`, `doc_base`.`group` FROM `doc_base` WHERE `doc_base`.`id`='$pos_id'");
289        if(mysql_errno())               throw new MysqlException("Не удалось получить базовую цену товара");
290        if(!mysql_num_rows($res))       throw new Exception("Товар ID:$pos_id не найден!");
291        $base_cost=mysql_result($res,0,0);
292        $base_group=mysql_result($res,0,1);
293        $res=mysql_query("SELECT `doc_cost`.`id`, `doc_base_cost`.`id`, `doc_cost`.`type`, `doc_cost`.`value`, `doc_base_cost`.`type`, `doc_base_cost`.`value`, `doc_base_cost`.`accuracy`, `doc_base_cost`.`direction`, `doc_cost`.`accuracy`, `doc_cost`.`direction`
294        FROM `doc_cost`
295        LEFT JOIN `doc_base_cost` ON `doc_cost`.`id`=`doc_base_cost`.`cost_id` AND `doc_base_cost`.`pos_id`='$pos_id'
296        WHERE `doc_cost`.`id`='$cost_id'");
297        if(mysql_errno())               throw new MysqlException("Не удалось получить цену из справочника цен товара");
298        if(!mysql_num_rows($res))       throw new Exception("Цена ID:$cost_id не найдена!");
299        $nxt=mysql_fetch_row($res);
300
301        if($nxt[1])
302        {
303                if($nxt[4]=='pp')       $cena= $base_cost+$base_cost*$nxt[5]/100;
304                else if($nxt[4]=='abs') $cena= $base_cost+$nxt[5];
305                else if($nxt[4]=='fix') $cena= $nxt[5];
306                else                    $cena= 0;
307
308                if($cena>0)     return sprintf("%0.2f",roundDirect($cena,$nxt[6],$nxt[7]));
309                else            return 0;
310        }
311
312        while($base_group)
313        {
314                $res=mysql_query("SELECT `doc_group`.`id`, `doc_group_cost`.`id`, `doc_group_cost`.`type`, `doc_group_cost`.`value`, `doc_group`.`pid`, `doc_group_cost`.`accuracy`, `doc_group_cost`.`direction`
315                FROM `doc_group`
316                LEFT JOIN `doc_group_cost` ON `doc_group`.`id`=`doc_group_cost`.`group_id`  AND `doc_group_cost`.`cost_id`='$cost_id'
317                WHERE `doc_group`.`id`='$base_group'");
318                if(mysql_errno())               throw new MysqlException("Не удалось получить цену из справочника цен группы");
319                if(!mysql_num_rows($res))       throw new Exception("Группа ID:$base_group не найдена");
320                $gdata=mysql_fetch_row($res);
321                if($gdata[1])
322                {
323                        if($gdata[2]=='pp')             $cena= $base_cost+$base_cost*$gdata[3]/100;
324                        else if($gdata[2]=='abs')       $cena= $base_cost+$gdata[3];
325                        else if($gdata[2]=='fix')       $cena= $gdata[3];
326                        else                            $cena= 0;
327
328                        if($cena>0)     return sprintf("%0.2f",roundDirect($cena,$gdata[5],$gdata[6]));
329                        else            return 0;
330                }
331                $base_group=$gdata[4];
332        }
333
334        if($nxt[2]=='pp')       $cena= $base_cost+$base_cost*$nxt[3]/100;
335        else if($nxt[2]=='abs') $cena= $base_cost+$nxt[3];
336        else if($nxt[2]=='fix') $cena= $nxt[3];
337        else                    $cena= 0;
338
339        if($cena>0)     return sprintf("%0.2f",roundDirect($cena,$nxt[8],$nxt[9]));
340        else            return 0;
341}
342
343// =========== Запись событий документов в лог ======================
344function doc_log($motion,$desc,$object='',$object_id=0)
345{
346        $uid=intval(@$_SESSION['uid']);
347        $motion=mysql_real_escape_string($motion);
348        $desc=mysql_real_escape_string($desc);
349        $object=mysql_real_escape_string($object);
350        $object_id=intval($object_id);
351        $ip=getenv("REMOTE_ADDR");
352        mysql_query("INSERT INTO `doc_log` (`user`, `ip`, `time`,`motion`,`desc`, `object`, `object_id`)
353        VALUES ('$uid', '$ip', NOW(),'$motion','$desc', '$object', '$object_id')");
354}
355
356// == УСТАРЕЛО - УБРАТЬ ПОСЛЕ ТОГО, КАК НЕ БУДЕТ НИГДЕ ИСПОЛЬЗОВАТЬСЯ ===
357function but_provodka($doc,$ok)
358{
359        if($ok)
360                return "<a href='?mode=cancel&amp;doc=$doc' title='Отменить проводку' onclick=\"ShowPopupWin('/doc.php?mode=cancel&amp;doc=$doc'); return false;\"><img src='img/i_revert.png' alt='Отменить' /></a>";
361        else
362                return "<a href='?mode=ehead&amp;doc=$doc' title='Правка заголовка'><img src='img/i_docedit.png' alt='Правка' /></a>
363                <a href='?mode=apply&amp;doc=$doc' title='Провести документ' onclick=\"ShowPopupWin('/doc.php?mode=apply&amp;doc=$doc'); return false;\"><img src='img/i_ok.png' alt='Провести' /></a>";
364
365}
366
367function doc_menu($dop="", $nd=1, $doc=0)
368{
369        global $tmpl, $CONFIG;
370        // Индикатор нарушения целостности проводок
371        // Устанавливается при ошибке при проверке целостности и при принудительной отмене
372        // Снимается, если проверка целостности завершилась успешно
373        $res=@mysql_query("SELECT `corrupted` FROM `variables`");
374        if(@mysql_result($res,0,0))     $err="class='error'";
375        else                            $err='';
376
377        $tmpl->AddText("<div id='doc_menu' $err>
378        <div id='doc_menu_container'>
379        <div id='doc_menu_r'>
380        <input type='text' id='quicksearch'>
381        <script>
382        var ac=initAutocomplete('quicksearch','/docs.php?l=sklad&mode=srv&opt=acj')
383        </script>
384        <a href='/user.php' title='Возможности пользователя'><img src='/img/i_users.png' alt='Возможности пользователя' border='0'></a>
385        <a href='/login.php?mode=logout' title='Выход'><img src='/img/i_logout.png' alt='Выход'></a>
386        </div>
387        <a href='/' title='Главная'><img src='/img/i_home.png' alt='Главная' border='0'></a>
388
389        <img src='/img/i_separator.png' alt=''>
390
391        <a href='/docj.php' title='Журнал документов' accesskey=\"D\"><img src='/img/i_journal.png' alt='Журнал документов' border='0'></a>
392        <a href='/incomp_orders.php' title='Журнал невыполненных заявок' accesskey=\"D\"><img src='/img/i_incomp_orders.png' alt='Журнал невыполненных заявок' border='0'></a>
393        <a href='/docs.php?l=agent' title='Журнал агентов' accesskey=\"A\"><img src='/img/i_user.png' alt='Журнал агентов' border='0'></a>
394        <a href='/docs.php?l=dov' title='Работа с доверенными лицами'><img src='/img/i_users.png' alt='лица' border='0'></a>
395        <a href='/docs.php?l=sklad' title='Склад' accesskey=\"S\"><img src='/img/i_sklad.png' alt='Склад' border='0'></a>
396        <a href='/docs.php?l=pran' onclick=\"return ShowContextMenu(event, '/priceload.php?mode=menu')\" title='Анализ прайсов' accesskey=\"S\"><img src='/img/i_analiz.png' alt='Анализ прайсов' border='0'></a>
397        <img src='img/i_separator.png' alt=''>
398
399        <a href='/doc.php' title='Новый документ' accesskey=\"N\"><img src='/img/i_new.png' alt='Новый' border='0'></a>
400        <a href='/doc.php?mode=new&amp;type=1' title='Поступление товара на склад'><img src='/img/i_new_post.png' alt='Поступление товара на склад' border='0'></a>
401        <a href='/doc.php?mode=new&amp;type=2' title='Реализация товара' accesskey=\"R\"><img src='/img/i_new_real.png' alt='Реализация товара' border='0'></a>
402        <a href='/doc.php?mode=new&amp;type=3' title='Заявка покупателя' accesskey=\"Z\"><img src='/img/i_new_schet.png' alt='Заявка покупателя' border='0'></a>
403        <a href='/doc.php?mode=new&amp;type=4' title='Поступление средств в банк'><img src='/img/i_new_pbank.png' alt='Поступление средств в банк' border='0'></a>
404        <a href='/doc.php?mode=new&amp;type=5' title='Вывод средств из банка'><img src='/img/i_new_rbank.png' alt='Вывод средств из банка' border='0'></a>
405        <a href='/doc.php?mode=new&amp;type=6' title='Приходный кассовый ордер'><img src='/img/i_new_pko.png' alt='Приходный кассовый ордер' border='0'></a>
406        <a href='/doc.php?mode=new&amp;type=7' title='Расходный кассовый ордер'><img src='/img/i_new_rko.png' alt='Расходный кассовый ордер' border='0'></a>
407        <a href='/doc.php?mode=new&amp;type=12' title='Товар в пути'><img src='/img/i_new_tp.png' alt='Товар в пути' border='0'></a>
408        <img src='/img/i_separator.png' alt=''>
409
410        <a href='' onclick=\"return ShowContextMenu(event, '/doc_reports.php?mode=pmenu')\"  title='Отчеты'><img src='img/i_report.png' alt='Отчеты' border='0'></a>
411        <a href='/doc_service.php' title='Служебные функции'><img src='/img/i_config.png' alt='Служебные функции' border='0'></a>
412        <a href='/doc_sc.php' title='Сценарии и операции'><img src='/img/i_launch.png' alt='Сценарии и операции' border='0'></a>");
413        if($dop) $tmpl->AddText("<img src='/img/i_separator.png' alt=''> $dop");
414
415        $tmpl->AddText("</div></div>");
416
417        if($nd && @$CONFIG['doc']['mincount_info'])
418        {
419                        $res=mysql_query("SELECT `doc_base`.`name`, `doc_base_cnt`.`cnt`, `doc_base_cnt`.`mincnt`, `doc_sklady`.`name` FROM `doc_base`
420                        LEFT JOIN `doc_base_cnt` ON `doc_base_cnt`.`id`=`doc_base`.`id`
421                        LEFT JOIN `doc_sklady` ON `doc_sklady`.`id`=`doc_base_cnt`.`sklad`
422                        WHERE `doc_base_cnt`.`cnt`<`doc_base_cnt`.`mincnt` LIMIT 100");
423                        $row=mysql_num_rows($res);
424                        if($row)
425                        {
426                                mysql_data_seek($res,rand(0,$row-1));
427                                $nxt=mysql_fetch_row($res);
428                                if($nxt[1]) $nxt[1]='всего '.$nxt[1].' штук';
429                                else $nxt[1]='отсутствует';
430                                $tmpl->msg("По крайней мере, у $row товаров, количество на складе меньше минимально рекомендуемого!<br>Например $nxt[0] на складе *$nxt[3]* $nxt[1], вместо $nxt[2] рекомендуемых!","err","Мало товара на складе!");
431                        }
432        }
433}
434
435function getDocBaseGroupOptions($selected_id=0, $pid=0, $level=0)
436{
437        $ret='';
438        $res=mysql_query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$pid' ORDER BY `id`");
439        while($nxt=mysql_fetch_row($res))
440        {
441                if($nxt[0]==0) continue;
442                $pref='';
443                for($i=0;$i<$level;$i++,$pref.='|&nbsp;&nbsp;&nbsp;&nbsp;');
444                $sel=($selected_id==$nxt[0])?'selected':'';
445                $sel.=sprintf(" style='background-color: #%x%x%x'",0xf-$level,0xf-$level,0xf-$level);
446                $ret.="<option value='$nxt[0]' $sel>{$pref}{$nxt[1]}</option>\n";
447                $ret.=getDocBaseGroupOptions($selected_id, $nxt[0], $level+1); // рекурсия
448        }
449        return $ret;
450}
451
452/// ======== УСТАРЕЛО - УБРАТЬ ПОСЛЕ ТОГО, КАК НЕ БУДЕТ НИГДЕ ИСПОЛЬЗОВАТЬСЯ =============
453function GetNextAltNum($type, $subtype, $doc, $date, $firm)
454{
455        global $CONFIG;
456        $start_date=strtotime(date("Y-01-01 00:00:00",strtotime($date)));
457        $end_date=strtotime(date("Y-12-31 23:59:59",strtotime($date)));
458        $res=mysql_query("SELECT `altnum` FROM `doc_list` WHERE `type`='$type' AND `subtype`='$subtype' AND `id`!='$doc' AND `date`>='$start_date' AND `date`<='$end_date' AND `firm_id`='$firm' ORDER BY `altnum` ASC");
459        $newnum=0;
460        while($nxt=mysql_fetch_row($res))
461        {
462                if(($nxt[0]-1 > $newnum)&& @$CONFIG['doc']['use_persist_altnum'])       break;
463                $newnum=$nxt[0];
464        }
465        $newnum++;
466        echo $newnum;
467        return $newnum;
468}
469
470/// ====== Получение данных, связанных с документом =============================
471/// ======== УСТАРЕЛО - УБРАТЬ ПОСЛЕ ТОГО, КАК НЕ БУДЕТ НИГДЕ ИСПОЛЬЗОВАТЬСЯ =============
472function get_docdata($doc)
473{
474        global $doc_data;
475        global $dop_data;
476        if($doc_data) return;
477
478        if($doc)
479        {
480                $res=mysql_query("SELECT `a`.`id`, `a`.`type`, `a`.`agent`, `b`.`name`, `a`.`comment`, `a`.`date`, `a`.`ok`, `a`.`sklad`, `a`.`user`, `a`.`altnum`, `a`.`subtype`, `a`.`sum`, `a`.`nds`, `a`.`p_doc`, `a`.`mark_del`
481                FROM `doc_list` AS `a`
482                LEFT JOIN `doc_agent` AS `b` ON `a`.`agent`=`b`.`id`
483                WHERE `a`.`id`='$doc'");
484                $doc_data=mysql_fetch_row($res);
485                $rr=mysql_query("SELECT `param`,`value` FROM `doc_dopdata` WHERE `doc`='$doc'");
486                while($nn=mysql_fetch_row($rr))
487                {
488                        $dop_data["$nn[0]"]=$nn[1];
489                }
490        }
491        else
492        {
493                $doc_data=array();
494                $doc_data[2]=641;
495                $doc_data[3]="Частное лицо";
496        }
497}
498
499/// ======== УСТАРЕЛО - УБРАТЬ ПОСЛЕ ТОГО, КАК НЕ БУДЕТ НИГДЕ ИСПОЛЬЗОВАТЬСЯ =============
500function DocInfo($p_doc)
501{
502        $res=mysql_query("SELECT `doc_list`.`id`, `doc_types`.`name`, `doc_list`.`altnum`, `doc_list`.`subtype`, `doc_list`.`date`, `doc_list`.`ok` FROM `doc_list`
503        LEFT JOIN `doc_types` ON `doc_types`.`id`=`doc_list`.`type`
504        WHERE `doc_list`.`id`='$p_doc'");
505        if(@$nxt=mysql_fetch_row($res))
506        {
507                if($nxt[5]) $r='Проведённый';
508                else $r='Непроведённый';
509                $dt=date("d.m.Y H:i:s",$nxt[4]);
510                return "<b>Относится к:</b> $r <a href='?mode=body&amp;doc=$nxt[0]'>$nxt[1] N$nxt[2]$nxt[3]</a>, от $dt";
511        }
512        return '';
513}
514/// Ссылка на ajax перезагрузку складского блока
515/// Перенесено сюда из устаревшего файла doc.tovary.php
516/// ======== УСТАРЕЛО - УБРАТЬ ПОСЛЕ ТОГО, КАК НЕ БУДЕТ НИГДЕ ИСПОЛЬЗОВАТЬСЯ =============
517function link_sklad($doc, $link, $text)
518{
519        global $tmpl;
520        return "<a title='$link' href='' onclick=\"EditThis('/doc.php?mode=srv&opt=sklad&doc=$doc&$link','sklad'); return false;\" >$text</a> ";
521}
522
523// =========== Определение типа документа и создание соответствующего класса ====================
524function AutoDocumentType($doc_type, $doc)
525{
526        switch($doc_type)
527        {
528                case 1:
529                        return new doc_Postuplenie($doc);
530                case 2:
531                        return new doc_Realizaciya($doc);
532                case 3:
533                        return new doc_Zayavka($doc);
534                case 4:
535                        return new doc_PBank($doc);
536                case 5:
537                        return new doc_RBank($doc);
538                case 6:
539                        return new doc_Pko($doc);
540                case 7:
541                        return new doc_Rko($doc);
542                case 8:
543                        return new doc_Peremeshenie($doc);
544                case 9:
545                        return new doc_PerKas($doc);
546                case 10:
547                        return new doc_Doveren($doc);
548                case 11:
549                        return new doc_Predlojenie($doc);
550                case 12:
551                        return new doc_v_puti($doc);
552                case 13:
553                        return new doc_Kompredl($doc);
554                case 14:
555                        return new doc_Dogovor($doc);
556                case 15:
557                        return new doc_Realiz_op($doc);
558                case 16:
559                        return new doc_Specific($doc);
560                case 17:
561                        return new doc_Sborka($doc);
562                case 18:
563                        return new doc_Kordolga($doc);
564                default:
565                        return new doc_Nulltype();
566        }
567}
568
569// ========== Расчет и обновление суммы документа ===============================================
570function DocSumUpdate($doc)
571{
572        $sum=0;
573        $res=mysql_query("SELECT `cnt`, `cost` FROM `doc_list_pos` WHERE `doc`='$doc' AND `page`='0'");
574        if(mysql_errno())       throw new MysqlException("Не удалось получить список товаров");
575        while($nxt=mysql_fetch_row($res))
576                $sum+=$nxt[0]*$nxt[1];
577        if($sum!=0)
578                mysql_query("UPDATE `doc_list` SET `sum`='$sum' WHERE `id`='$doc'");
579        if(mysql_errno())       throw new MysqlException("Не удалось обновить сумму документа");
580        return $sum;
581}
582
583// Расчёт баланса агента
584function DocCalcDolg($agent, $print=0, $firm_id=0)
585{
586        global $tmpl;
587        $dolg=0;
588        $sql_add=$firm_id?"AND `firm_id`='$firm_id'":'';
589        $res=mysql_query("SELECT `type`, `sum` FROM `doc_list` WHERE `ok`>'0' AND `agent`='$agent' AND `mark_del`='0' $sql_add");
590        if(mysql_errno())       throw new MysqlException("Не возможно выбрать документы агента");
591        while($nxt=mysql_fetch_row($res))
592        {
593                switch($nxt[0])
594                {
595                        case 1: $dolg-=$nxt[1]; break;
596                        case 2: $dolg+=$nxt[1]; break;
597                        case 4: $dolg-=$nxt[1]; break;
598                        case 5: $dolg+=$nxt[1]; break;
599                        case 6: $dolg-=$nxt[1]; break;
600                        case 7: $dolg+=$nxt[1]; break;
601                        case 18: $dolg+=$nxt[1]; break;
602                }
603        }
604
605        $dolg=sprintf("%0.2f", $dolg);
606        return $dolg;
607}
608
609// Расчёт актуальной входящей цены
610function GetInCost($pos_id, $limit_date=0, $serv_mode=0)
611{
612        settype($pos_id,'int');
613        $cnt=$cost=0;
614        $sql_add='';
615        $res=mysql_query("SELECT `pos_type`, `cost` FROM `doc_base` WHERE `id`='$pos_id'");
616        list($type, $cost)=mysql_fetch_row($res);
617        if($type==1)    return $serv_mode?$cost:0;
618
619        if($limit_date) $sql_add="AND `doc_list`.`date`<='$limit_date'";
620        $res=mysql_query("SELECT `doc_list_pos`.`cnt`, `doc_list_pos`.`cost`, `doc_list`.`type`, `doc_list_pos`.`page`, `doc_dopdata`.`value`
621        FROM `doc_list_pos`
622        INNER JOIN `doc_list` ON `doc_list`.`id`=`doc_list_pos`.`doc` AND (`doc_list`.`type`<='2' OR `doc_list`.`type`='17')
623        LEFT JOIN `doc_dopdata` ON `doc_dopdata`.`doc`=`doc_list_pos`.`doc` AND `doc_dopdata`.`param`='return'
624        WHERE `doc_list_pos`.`tovar`='$pos_id' AND `doc_list`.`ok`>'0' $sql_add ORDER BY `doc_list`.`date`");
625
626        while($nxt=mysql_fetch_row($res))
627        {
628                if(($nxt[2]==2) || ($nxt[2]==17) && ($nxt[3]!='0'))     $nxt[0]=$nxt[0]*(-1);
629                if( ($cnt+$nxt[0])==0)  {}
630                else if($nxt[0]>0 && $nxt[4]!=1)
631                {
632                        if($cnt>0)      $cost=( ($cnt*$cost)+($nxt[0]*$nxt[1])) / ($cnt+$nxt[0]);
633                        else            $cost=$nxt[1];
634                }
635                $cnt+=$nxt[0];
636        }
637        return round($cost,2);
638}
639
640/// Проверка, не уходило ли когда-либо количество какого-либо товара в минус
641/// Используется при отмене документов, уменьшающих остатки на складе, напр. реализаций и перемещений
642/// TODO: Устарело. Заменить везде, где используется на getStoreCntOnDate
643function CheckMinus($pos, $sklad)
644{
645    return getStoreCntOnDate($pos, $sklad);
646}
647
648// Получить количество товара на складе на заданную дату
649function getStoreCntOnDate($pos, $sklad, $unixtime=0, $noBreakIfMinus=0)
650{
651        $cnt=0;
652        $sql_add=$unixtime?"AND `doc_list`.`date`<='$unixtime'":'';
653        $res=mysql_query("SELECT `doc_list_pos`.`cnt`, `doc_list`.`type`, `doc_list`.`sklad`, `doc_list`.`id`, `doc_list_pos`.`page` FROM `doc_list_pos`
654        LEFT JOIN `doc_list` ON `doc_list`.`id`=`doc_list_pos`.`doc`
655        WHERE  `doc_list`.`ok`>'0' AND `doc_list_pos`.`tovar`='$pos' AND (`doc_list`.`type`=1 OR `doc_list`.`type`=2 OR `doc_list`.`type`=8 OR `doc_list`.`type`=17) $sql_add
656        ORDER BY `doc_list`.`date`");
657        if(mysql_errno())       throw new MysqlException("Не удалось запросить список документов с товаром ID:$pos при проверке на отрицательные остатки");
658        while($nxt=mysql_fetch_row($res))
659        {
660                if($nxt[1]==1)
661                {
662                        if($nxt[2]==$sklad)     $cnt+=$nxt[0];
663                }
664                else if($nxt[1]==2)
665                {
666                        if($nxt[2]==$sklad)     $cnt-=$nxt[0];
667                }
668                else if($nxt[1]==8)
669                {
670                        if($nxt[2]==$sklad)     $cnt-=$nxt[0];
671                        else
672                        {
673                                $rr=mysql_query("SELECT `value` FROM `doc_dopdata` WHERE `doc`='$nxt[3]' AND `param`='na_sklad'");
674                                if(mysql_errno())       throw new MysqlException("Не удалось запросить склад назначения в перемещении $nxt[3] при проверке на отрицательные остатки");
675                                $nasklad=mysql_result($rr,0,0);
676                                if(!$nasklad)           throw new Exceprion("Не удалось получить склад назначения в перемещении $nxt[3] при проверке на отрицательные остатки");
677                                if($nasklad==$sklad)    $cnt+=$nxt[0];
678                        }
679                }
680                else if($nxt[1]==17)
681                {
682                        if($nxt[2]==$sklad)
683                        {
684                                if($nxt[4]==0)  $cnt+=$nxt[0];
685                                else            $cnt-=$nxt[0];
686                        }
687                }
688                if($cnt<0 && $noBreakIfMinus==0) break;
689        }
690        mysql_free_result($res);
691        return $cnt;
692}
693
694// Кол-во товара в резерве
695function DocRezerv($pos,$doc=0)
696{
697        // $doc - номер исключенного документа
698
699        $rs=mysql_query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
700        INNER JOIN `doc_list` ON `doc_list`.`type`='3' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`=`doc_list_pos`.`doc`
701        AND `doc_list`.`id` NOT IN (SELECT DISTINCT `p_doc` FROM `doc_list`
702        INNER JOIN `doc_list_pos` ON `doc_list`.`id`=`doc_list_pos`.`doc`
703        WHERE `ok` != '0' AND `type`='2' AND `doc_list_pos`.`tovar`='$pos' )
704        WHERE `doc_list_pos`.`tovar`='$pos'
705        GROUP BY `doc_list_pos`.`tovar`");
706        return @$rezerv=mysql_result($rs,0,0);
707
708}
709
710// Кол-во товара под заказ
711function DocPodZakaz($pos,$doc=0)
712{
713        // $doc - номер исключенного документа
714        $rt=time()-60*60*24*365;
715        $rs=mysql_query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
716        INNER JOIN `doc_list` ON `doc_list`.`type`='11' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`!='$doc' AND `doc_list`.`id`=`doc_list_pos`.`doc` AND `doc_list`.`id` NOT IN (SELECT DISTINCT `p_doc` FROM `doc_list` WHERE `ok` != '0' AND `type`='1' )
717        WHERE `doc_list_pos`.`tovar`='$pos'
718        GROUP BY `doc_list_pos`.`tovar`");
719        return @$rezerv=mysql_result($rs,0,0);
720}
721
722// Кол-во товара в пути
723function DocVPuti($pos,$doc=0)
724{
725        // $doc - номер исключенного документа
726        $rt=time()-60*60*24*30;
727        $rs=mysql_query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
728        INNER JOIN `doc_list` ON `doc_list`.`type`='12' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`!='$doc'
729        AND `doc_list`.`id`=`doc_list_pos`.`doc` AND `doc_list`.`id` NOT IN (SELECT DISTINCT `p_doc` FROM `doc_list` WHERE `ok` != '0' AND `type`='1' )
730        WHERE `doc_list_pos`.`tovar`='$pos'
731        GROUP BY `doc_list_pos`.`tovar`");
732        return @$rezerv=mysql_result($rs,0,0);
733}
734
735function AutoDocument($doc)
736{
737        $doc=round($doc);
738        $res=mysql_query("SELECT `type` FROM `doc_list` WHERE `id`=$doc");
739        if(mysql_errno())               throw new MysqlException("Не удалось получить тип документа");
740        if(!mysql_num_rows($res))       throw new Exception("Документ не найден");
741        $type=mysql_result($res,0,0);
742        return AutoDocumentType($type, $doc);
743}
744
745/// Создаёт HTML код элемента select со списком групп агентов
746function selectAgentGroup($select_name,$selected=0,$not_select=0,$select_id='',$select_class='')
747{
748        $ret="<select name='$select_name' id='$select_id' class='$select_class'>";
749        if($not_select) $ret.="<option value='0'>***не выбран***</option>";
750        $res=mysql_query("SELECT `id`, `name` FROM `doc_agent_group` ORDER BY `name`");
751        if(mysql_errno())               throw new MysqlException("Не удалось получить список агентов");
752        while($line=mysql_fetch_row($res))
753        {
754                $sel=($selected==$line[0])?' selected':'';
755                $ret.="<option value='$line[0]'{$sel}>$line[1]</option>";
756        }
757        $ret.="</select>";
758        return $ret;
759}
760
761function selectGroupPosRecursive($group_id,$prefix,$selected)
762{
763        $res=mysql_query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$group_id' ORDER BY `id`");
764        if(mysql_errno())               throw new MysqlException("Не удалось получить список групп");
765        $ret='';
766        while($line=mysql_fetch_row($res))
767        {
768                $sel=($selected==$line[0])?' selected':'';
769                $ret.="<option value='$line[0]'{$sel}>{$prefix}{$line[1]}</option>";
770                $ret.=selectGroupPosRecursive($line[0],$prefix.'--',$selected);
771        }
772        return $ret;
773}
774
775/// Создаёт HTML код элемента select со списком групп наименований
776function selectGroupPos($select_name,$selected=0,$not_select=0,$select_id='',$select_class='')
777{
778        $ret="<select name='$select_name' id='$select_id' class='$select_class'>";
779        if($not_select) $ret.="<option value='0'>***не выбран***</option>";
780        $ret.=selectGroupPosRecursive(0,'',$selected);
781        $ret.="</select>";
782        return $ret;
783}
784
785
786
787?>
Note: See TracBrowser for help on using the repository browser.