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

source: web/include/doc.core.php @ 688638b

Last change on this file since 688638b was 688638b, checked in by blacklight <blacklight@…>, 10 years ago
  • Добавлена документация на код некоторых функций
  • Возобновлена разработка модуля *зарплата с продаж*
  • В загрузчике прайс листов убрано искуственное ограничение на размер файла
  • Property mode set to 100644
File size: 30.9 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/// Расчёт долга агента. Положительное число обозначает долг агента, отрицательное - долг перед агентом.
584/// @param agent_id     ID агента, для которого расчитывается баланс
585/// @param no_cache     Не брать данные расчёта из кеша
586/// @param firm_id      ID собственной фирмы, для которой будет расчитан баланс. Если 0 - расчёт ведётся для всех фирм.
587function DocCalcDolg($agent_id, $no_cache=0, $firm_id=0)
588{
589        global $tmpl, $doc_agent_dolg_cache_storage;
590        //if(!$no_cache && isset($doc_agent_dolg_cache_storage[$agent_id]))     return $doc_agent_dolg_cache_storage[$agent_id];
591
592        $dolg=0;
593        $sql_add=$firm_id?"AND `firm_id`='$firm_id'":'';
594        $res=mysql_query("SELECT `type`, `sum` FROM `doc_list` WHERE `ok`>'0' AND `agent`='$agent_id' AND `mark_del`='0' $sql_add");
595        if(mysql_errno())       throw new MysqlException("Не возможно выбрать документы агента");
596        while($nxt=mysql_fetch_row($res))
597        {
598                switch($nxt[0])
599                {
600                        case 1: $dolg-=$nxt[1]; break;
601                        case 2: $dolg+=$nxt[1]; break;
602                        case 4: $dolg-=$nxt[1]; break;
603                        case 5: $dolg+=$nxt[1]; break;
604                        case 6: $dolg-=$nxt[1]; break;
605                        case 7: $dolg+=$nxt[1]; break;
606                        case 18: $dolg+=$nxt[1]; break;
607                }
608        }
609
610        $dolg=sprintf("%0.2f", $dolg);
611        //$doc_agent_dolg_cache_storage[$agent_id]=$dolg;
612        return $dolg;
613}
614
615/// Расчёт актуальной входящей цены
616/// @param pos_id       ID складского наименования, для которого производится расчёт
617/// @param limit_date   Ограничить период расчёта указанной датой. Расчёт цены выполняется на указанную дату.
618/// @param serv_mode    Если true - функция возвращает для улуг их базовую цену. Иначе возвращает 0.
619function GetInCost($pos_id, $limit_date=0, $serv_mode=0)
620{
621        settype($pos_id,'int');
622        $cnt=$cost=0;
623        $sql_add='';
624        $res=mysql_query("SELECT `pos_type`, `cost` FROM `doc_base` WHERE `id`='$pos_id'");
625        list($type, $cost)=mysql_fetch_row($res);
626        if($type==1)    return $serv_mode?$cost:0;
627
628        if($limit_date) $sql_add="AND `doc_list`.`date`<='$limit_date'";
629        $res=mysql_query("SELECT `doc_list_pos`.`cnt`, `doc_list_pos`.`cost`, `doc_list`.`type`, `doc_list_pos`.`page`, `doc_dopdata`.`value`
630        FROM `doc_list_pos`
631        INNER JOIN `doc_list` ON `doc_list`.`id`=`doc_list_pos`.`doc` AND (`doc_list`.`type`<='2' OR `doc_list`.`type`='17')
632        LEFT JOIN `doc_dopdata` ON `doc_dopdata`.`doc`=`doc_list_pos`.`doc` AND `doc_dopdata`.`param`='return'
633        WHERE `doc_list_pos`.`tovar`='$pos_id' AND `doc_list`.`ok`>'0' $sql_add ORDER BY `doc_list`.`date`");
634
635        while($nxt=mysql_fetch_row($res))
636        {
637                if(($nxt[2]==2) || ($nxt[2]==17) && ($nxt[3]!='0'))     $nxt[0]=$nxt[0]*(-1);
638                if( ($cnt+$nxt[0])==0)  {}
639                else if($nxt[0]>0 && $nxt[4]!=1)
640                {
641                        if($cnt>0)      $cost=( ($cnt*$cost)+($nxt[0]*$nxt[1])) / ($cnt+$nxt[0]);
642                        else            $cost=$nxt[1];
643                }
644                $cnt+=$nxt[0];
645        }
646        return round($cost,2);
647}
648
649/// Проверка, не уходило ли когда-либо количество какого-либо товара в минус
650/// Используется при отмене документов, уменьшающих остатки на складе, напр. реализаций и перемещений
651/// TODO: Устарело. Заменить везде, где используется на getStoreCntOnDate
652/// @sa getStoreCntOnDate
653/// @param pos_id               ID складского наименования, для которого производится расчёт
654/// @param sklad_id             ID склада, для которого производится расчёт
655function CheckMinus($pos_id, $sklad_id)
656{
657    return getStoreCntOnDate($pos_id, $sklad_id);
658}
659
660/// Получить количество товара на складе на заданную дату
661/// @param pos_id               ID складского наименования, для которого производится расчёт
662/// @param sklad_id             ID склада, для которого производится расчёт
663/// @param unixtime             Дата, на которую производится расчёт в формате unixtime. Если не задан - расчитывается остаток на дату последнего документа.
664/// @param noBreakIfMinus       Если true - расчёт не будет прерван, если на каком-то из этапов расчёта остаток станет отрицательным.
665function getStoreCntOnDate($pos_id, $sklad_id, $unixtime=0, $noBreakIfMinus=0)
666{
667        $cnt=0;
668        $sql_add=$unixtime?"AND `doc_list`.`date`<='$unixtime'":'';
669        $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`
670        LEFT JOIN `doc_list` ON `doc_list`.`id`=`doc_list_pos`.`doc`
671        WHERE  `doc_list`.`ok`>'0' AND `doc_list_pos`.`tovar`='$pos_id' AND (`doc_list`.`type`=1 OR `doc_list`.`type`=2 OR `doc_list`.`type`=8 OR `doc_list`.`type`=17) $sql_add
672        ORDER BY `doc_list`.`date`");
673        if(mysql_errno())       throw new MysqlException("Не удалось запросить список документов с товаром ID:$pos_id при проверке на отрицательные остатки");
674        while($nxt=mysql_fetch_row($res))
675        {
676                if($nxt[1]==1)
677                {
678                        if($nxt[2]==$sklad_id)  $cnt+=$nxt[0];
679                }
680                else if($nxt[1]==2)
681                {
682                        if($nxt[2]==$sklad_id)  $cnt-=$nxt[0];
683                }
684                else if($nxt[1]==8)
685                {
686                        if($nxt[2]==$sklad_id)  $cnt-=$nxt[0];
687                        else
688                        {
689                                $rr=mysql_query("SELECT `value` FROM `doc_dopdata` WHERE `doc`='$nxt[3]' AND `param`='na_sklad'");
690                                if(mysql_errno())       throw new MysqlException("Не удалось запросить склад назначения в перемещении $nxt[3] при проверке на отрицательные остатки");
691                                $nasklad=mysql_result($rr,0,0);
692                                if(!$nasklad)           throw new Exceprion("Не удалось получить склад назначения в перемещении $nxt[3] при проверке на отрицательные остатки");
693                                if($nasklad==$sklad_id) $cnt+=$nxt[0];
694                        }
695                }
696                else if($nxt[1]==17)
697                {
698                        if($nxt[2]==$sklad_id)
699                        {
700                                if($nxt[4]==0)  $cnt+=$nxt[0];
701                                else            $cnt-=$nxt[0];
702                        }
703                }
704                if($cnt<0 && $noBreakIfMinus==0) break;
705        }
706        mysql_free_result($res);
707        return $cnt;
708}
709
710// Кол-во товара в резерве
711function DocRezerv($pos,$doc=0)
712{
713        // $doc - номер исключенного документа
714
715        $rs=mysql_query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
716        INNER JOIN `doc_list` ON `doc_list`.`type`='3' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`=`doc_list_pos`.`doc`
717        AND `doc_list`.`id` NOT IN (SELECT DISTINCT `p_doc` FROM `doc_list`
718        INNER JOIN `doc_list_pos` ON `doc_list`.`id`=`doc_list_pos`.`doc`
719        WHERE `ok` != '0' AND `type`='2' AND `doc_list_pos`.`tovar`='$pos' )
720        WHERE `doc_list_pos`.`tovar`='$pos'
721        GROUP BY `doc_list_pos`.`tovar`");
722        return @$rezerv=mysql_result($rs,0,0);
723
724}
725
726// Кол-во товара под заказ
727function DocPodZakaz($pos,$doc=0)
728{
729        // $doc - номер исключенного документа
730        $rt=time()-60*60*24*365;
731        $rs=mysql_query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
732        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' )
733        WHERE `doc_list_pos`.`tovar`='$pos'
734        GROUP BY `doc_list_pos`.`tovar`");
735        return @$rezerv=mysql_result($rs,0,0);
736}
737
738// Кол-во товара в пути
739function DocVPuti($pos,$doc=0)
740{
741        // $doc - номер исключенного документа
742        $rt=time()-60*60*24*30;
743        $rs=mysql_query("SELECT SUM(`doc_list_pos`.`cnt`) FROM `doc_list_pos`
744        INNER JOIN `doc_list` ON `doc_list`.`type`='12' AND `doc_list`.`ok`>'0' AND `doc_list`.`id`!='$doc'
745        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' )
746        WHERE `doc_list_pos`.`tovar`='$pos'
747        GROUP BY `doc_list_pos`.`tovar`");
748        return @$rezerv=mysql_result($rs,0,0);
749}
750
751function AutoDocument($doc)
752{
753        $doc=round($doc);
754        $res=mysql_query("SELECT `type` FROM `doc_list` WHERE `id`=$doc");
755        if(mysql_errno())               throw new MysqlException("Не удалось получить тип документа");
756        if(!mysql_num_rows($res))       throw new Exception("Документ не найден");
757        $type=mysql_result($res,0,0);
758        return AutoDocumentType($type, $doc);
759}
760
761/// Создаёт HTML код элемента select со списком групп агентов
762function selectAgentGroup($select_name,$selected=0,$not_select=0,$select_id='',$select_class='')
763{
764        $ret="<select name='$select_name' id='$select_id' class='$select_class'>";
765        if($not_select) $ret.="<option value='0'>***не выбран***</option>";
766        $res=mysql_query("SELECT `id`, `name` FROM `doc_agent_group` ORDER BY `name`");
767        if(mysql_errno())               throw new MysqlException("Не удалось получить список агентов");
768        while($line=mysql_fetch_row($res))
769        {
770                $sel=($selected==$line[0])?' selected':'';
771                $ret.="<option value='$line[0]'{$sel}>$line[1]</option>";
772        }
773        $ret.="</select>";
774        return $ret;
775}
776
777function selectGroupPosRecursive($group_id,$prefix,$selected)
778{
779        $res=mysql_query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$group_id' ORDER BY `id`");
780        if(mysql_errno())               throw new MysqlException("Не удалось получить список групп");
781        $ret='';
782        while($line=mysql_fetch_row($res))
783        {
784                $sel=($selected==$line[0])?' selected':'';
785                $ret.="<option value='$line[0]'{$sel}>{$prefix}{$line[1]}</option>";
786                $ret.=selectGroupPosRecursive($line[0],$prefix.'--',$selected);
787        }
788        return $ret;
789}
790
791/// Создаёт HTML код элемента select со списком групп наименований
792function selectGroupPos($select_name,$selected=0,$not_select=0,$select_id='',$select_class='')
793{
794        $ret="<select name='$select_name' id='$select_id' class='$select_class'>";
795        if($not_select) $ret.="<option value='0'>***не выбран***</option>";
796        $ret.=selectGroupPosRecursive(0,'',$selected);
797        $ret.="</select>";
798        return $ret;
799}
800
801
802
803?>
Note: See TracBrowser for help on using the repository browser.